Docker的“谎言”
作者簡介:張鑫,杭州才云科技聯合創始人 CEO
本文節選自《程序員》,謝絕轉載,更多精彩,請訂閱《程序員》
責編:魏偉,歡迎投稿和咨詢報道,詳情聯系weiwei@csdn.net
我與容器的緣分起源于我在Google內部研發容器集群管理系: Cluster Management。谷歌內部一切皆容器,搜索、視頻、大數據、內部工具等核心業務都以容器的方式運行在容器編排系統Borg上。2014年,隨著公司內部的”Ursquake” (注:Urs是負責基礎設施的高級副總裁),我轉投到了公有云Google Cloud Platform的建設當中。2014年3月份,在由各部門基礎設計技術帶頭人參加的谷歌內部的云峰會中,我做為早起參與者之一加入到了Kubernetes的項目中。
從2015年回國創業至今,我親身感受到了國內對于Docker的追捧熱度。如今,Docker已經迅速在國內形成了“要是不知道Docker都不好意思和人打招呼”的火熱勢態;在互聯網巨頭和獨角獸企業中,甚有從“誰在用Docker”轉變為“誰沒用Docker”之勢。
Caicloud基于Kubernetes開源技術,力爭為企業提供Gifee(Google’s Infrastructure for Everyone Else)的體驗。目前已經成功落地于多家國內大型企業,其中不乏傳統國有企業。在不少案例中,我們都發現一個明顯的趨勢:很多企業一開始受到Docker現象的鼓吹,認為Docker是萬靈藥,然而在自己嘗試進行開發、生產使用時才發現Docker帶來的不僅僅是“坑”,更多的是局限和對已有流程的顛覆。這里我想從我在谷歌內部使用容器,并基于容器研發大規模生產平臺的經驗中談談現有Docker和谷歌容器環境的差別,并通過Caicloud的實際案例落地經驗總結下Docker自身所帶來的一些“謊言”和誤區。希望能拋磚引玉,并在產品上填補空白,實現Gifee。
Docker的謊言
這里用“謊言”略有夸大其詞之嫌,Docker也確實為軟件開發帶來了巨大的好處。而我想表達的是人們對于Docker的一些常見預期在現實使用中并非像理論中那般完美。
Docker達到了環境一致性
幾乎所有的Docker介紹或教程中提到的前幾個Docker帶來的好處之一,必有“環境一致性”。然而這句話表述的并不準確,“環境”是一個模糊和相對的概念。Docker實現的是鏡像內部的小環境一致性,它保證了一個應用程序在一臺機器上使用Jetty 9, 在另一臺機器上也使用Jetty 9(通過封裝軟件中間件如Jetty 9)。然而大中型企業用戶很快意識到,真正的難點在于如何保證“大環境”一致,既整個業務系統中眾多容器、組件、服務之間如何配置、互聯、依賴,如何保證開發、測試、生產環境能相互轉化、克隆等。這些環境、配置在容器概念之上,是容器自身無法解決的,只能依賴集群層面的管理工具。
Docker幫助了微服務
微服務與Docker是兩個完全獨立的維度,微服務所帶來的好處完全不依賴于你是否使用Docker,同時微服務所帶來的問題Docker也無法解決。例如,如今大家都流行將原來的巨石型應用進行微服務細粒度切分,而第一個難點就是切分的粒度。雖然不乏最佳實踐和Rule of Thumb, 但總的邏輯是切分的粒度越細,軟件開發靈敏度越高。然而帶來的問題是管理成本的增加:更多的模塊如何進行各自的配置,更多的API通信、互聯如何管理,更多的二進制(容器)如何發布。這些問題都是Docker自身不能解決的,也必須通過第三方工具來進行彌補(例如Kubernetes的Pod機制就是谷歌基于內部的經驗教訓設計的一個解決方案)。
Docker實現了以應用為中心
Docker的大火也讓”App Centric”, “Cloud Native”煥發了青春,Docker確實在為實現這兩者的道路上提供了便利,但Docker本身還遠遠不能和這兩個詞劃等號。Docker對應用雖然進行了封裝,但是應用的開發者在實踐中還遠無法做到只要關心到Docker這一層即可。首先我們還是要關注操作系統,是否有合適的內核,是否有合適的API支持。其實我們甚至要關心硬件,是否是x86架構還是power pc架構。此外,我們還需要關心引擎,是Docker還是Rocket還是runC。最后,開發、運維者還要關心平臺,是Kubernetes還是Mesos來進行生產集群管理,并需要針對具體的底層平臺做完全針對該平臺的部署、配置(甚至需要修改應用、框架等)。而這些都不是應用、業務所應該關心的范疇。
Docker實現了Devops
Docker有很多開發、發布敏捷性方面的亮點,然而不少企業用戶認為Docker自身就邁向了Devops,而殘酷的現實是他們往往在真正開始使用后很快發現Docker帶來了額外的負擔,例如基于Docker的發布流程應該是怎么樣,應用程序打包的最佳實踐應如何(如何避免打出一個上G的包),Docker的鏡像倉庫該如何管理(如何有效利用存儲空間、識別Dockerhub里的惡意鏡像)。總之,Docker畢竟給系統中引入了新的一層東西,業務出了問題,到底是應用的問題還是Docker的問題?最后(among many others),Docker自身主要是進程級別的,而對于復合型、集群化的場景(翻譯:任何一個認真的生產場景)則需要第三方的工具和系統來補足。在機器層面,如何做到跨主機的通信、數據的遷移、跨主機的任務調度;在應用層面,如何做到用多個Docker鏡像/容器構造成一個復合性應用(Codis就是一個很好的例子)。當然,Docker的安全性也是經久不衰、流行的議題。
集群工具和Kubernetes的迅猛生產落地
還是要說明上述的論點旨在讓企業用戶認識到Docker自身不是萬靈藥,但是我們也不可否認Docker對于軟件開發、發布和計算上所帶來的變革性優勢。如何基于Docker自身的優勢更上一層樓,我認為需要順應“社會專業化分工”,讓專業的人做專業的事,通過第三方工具一起打造一個完善的生態系統。
谷歌在十年間打造了三個集群管理系統:Borg、Omega、Kubernetes,原因就是基于它領先于外界多年的容器使用經驗,它清楚地意識到容器自身的局限性(只是應用運行的一個“載體”,和其他的載體諸入虛擬機、物理機在這個角度上甚至沒有本質區別)。在雖有Mesos這一開源項目的情況下,谷歌還是在2014年決定大力推廣Kubernetes項目(內部代號為 “Project 7”),是出于幾點深思熟慮。這些出發點也在國外眾多知名企業(如eBay等互聯網巨頭,或高盛、 Bloomberg等金融巨頭)和Caicloud在國內一些大型甚至傳統國有企業的成功落地中得到了驗證):
現在的空白和未來的趨勢
無論是Docker還是開源第三方集群管理工具,如要到達Gifee都還有很長的路要走。這里我僅僅拋磚引玉列舉一些空白和我們希望和正在努力的方向。
發布管理遠大于CI/CD
如今談到發布,大家想到的就是持續集成(CI)和持續發布(CD)。然而我們在谷歌內部實踐的發布管理系統還包括很多其他的方方面面,例如:
Devops遠大于Docker
Devops包含方方面面,其中諸多實踐都是Docker自身層面所不能企及的,以谷歌為例:
集群管理遠大于服務管理
最后想澄清的一個名詞是”集群管理“。現在當人們談及“集群管理”時,容易直接和Kubernetes,Mesos等劃等號。然而集群管理在谷歌內部是一個非常龐大的組織,Borg只能算作任務管理或應用管理,除此之外一個真正的集群管理系統還需要諸如機器管理、網絡管理、安全管理等諸多方面:
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Docker的“谎言”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [译]NGINX 和 ZooKeeper
- 下一篇: 自己实现一个最简单的数据库