無數(shù)的文章、社交媒體在探討Docker、Kubernetes、Mesos三者之間孰優(yōu)孰劣。如果你聽信了某些一知半解者的言論,你可能會(huì)認(rèn)為這三個(gè)開源項(xiàng)目正在為爭(zhēng)奪容器霸權(quán)而殊死戰(zhàn)斗。同時(shí),你也會(huì)相信,在這三者間的選擇無異于對(duì)其所奉宗教的信仰,而且真正的信徒敢于大膽和異教徒作斗爭(zhēng),并且擁護(hù)自己的信仰。
那些都是扯淡。
雖然這三種技術(shù)都可以使用容器來部署、管理和擴(kuò)展應(yīng)用程序,但實(shí)際上它們每個(gè)都側(cè)重解決不同的問題,并且扎根非常不同的環(huán)境之上。事實(shí)上,這三種被廣泛采用的工具鏈彼此完全不同。
與其比較這些快速演進(jìn)的技術(shù)的重疊特性,不如讓我們回顧一下每個(gè)項(xiàng)目的原始任務(wù)、架構(gòu)以及它們之間如何相互補(bǔ)充和交互。
讓我們從Docker開始
今天的Docker公司脫胎于一個(gè)平臺(tái)即服務(wù)的初創(chuàng)公司dotCloud。dotCloud團(tuán)隊(duì)發(fā)現(xiàn),在許多應(yīng)用程序和客戶之間管理依賴關(guān)系和二進(jìn)制文件需要做大量的工作。因此,他們將Linux cgroups和namespaces的一些功能組合成一個(gè)簡(jiǎn)單易用的包,這樣應(yīng)用程序就可以在任何基礎(chǔ)設(shè)施上持續(xù)運(yùn)行。這個(gè)包就是Docker鏡像,它提供以下功能:
1.將應(yīng)用程序和庫封裝在單個(gè)包中(Docker鏡像),因此應(yīng)用程序可以跨多環(huán)境一致部署;
2.提供類似于git的語義,例如“dockerpush”,“docker commit”,這樣可以讓應(yīng)用程序開發(fā)人員可以輕松地采用新技術(shù),并將其融入到現(xiàn)有的workflow中;
3.將Docker鏡像定義為不可變層,啟用不可變的基礎(chǔ)設(shè)施。提交的更改被存儲(chǔ)為一個(gè)單獨(dú)的只讀層,這讓鏡像復(fù)用和跟蹤更改變得更加容易。另外,層還可以通過傳輸更新而不是整個(gè)鏡像來節(jié)省磁盤空間和網(wǎng)絡(luò)流量;
4.通過使用可以臨時(shí)存儲(chǔ)運(yùn)行時(shí)更改的可寫層來實(shí)例化不可變映像,從而方便快速部署和擴(kuò)展應(yīng)用程序的多個(gè)實(shí)例。
隨著Docker的風(fēng)靡,開發(fā)人員開始從筆記本電腦轉(zhuǎn)移到在生產(chǎn)環(huán)境中運(yùn)行。這就需要借助工具來協(xié)調(diào)這些容器,我們稱為容器編排。有趣的是,Apache Mesos的馬拉松稱為當(dāng)時(shí)(2014年6月)第一個(gè)支持Docker鏡像的容器編排工具(我們將在下面詳細(xì)描述它)。就連Docker創(chuàng)始人、首席技術(shù)官Solomon Hykes也推薦Mesos為“生產(chǎn)集群的黃金標(biāo)準(zhǔn)”。不久之后,除了馬拉松之外,許多容器編排技術(shù)出現(xiàn)了,這其中包括:Nomad、Kubernetes、DockerSwarm(現(xiàn)在是Docker引擎的一部分)。
隨著Docker開始商業(yè)化開源文件格式,該公司也開始引入工具來補(bǔ)充核心Docker文件格式和runtime引擎,包括:
1.Dockerhub
2.Docker registry
3.Docker cloud
4.Dockerdatacenter
Docker讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中的特性,使其成為軟件行業(yè)的游戲規(guī)則改變者;這有點(diǎn)類似mp3格式幫助重塑了音樂產(chǎn)業(yè)。Docker文件格式成為行業(yè)標(biāo)準(zhǔn),并且領(lǐng)導(dǎo)容器技術(shù)供應(yīng)商(包括Docker、Pivotal, Mesosphere以及其他許多)成立CNCF和OCI。今天,CNCF和OCI的目標(biāo)就是確保跨容器技術(shù)的互操作性和標(biāo)準(zhǔn)化接口,并確保使用任何工具構(gòu)建的Docker容器,都可以在任何runtime或基礎(chǔ)設(shè)施上運(yùn)行。
Kubernetes
谷歌很早就認(rèn)識(shí)到Docker鏡像的潛力,并試圖在谷歌云平臺(tái)上交付“容器編排即服務(wù)”。谷歌在容器方面有豐富的經(jīng)驗(yàn)(他們?cè)贚inux中引入了cgroups),但是現(xiàn)有的內(nèi)部容器和像Borg這樣的分布式計(jì)算工具與它們的基礎(chǔ)設(shè)施直接耦合。因此,谷歌沒有使用現(xiàn)有系統(tǒng)中的任何代碼,而是從頭開始設(shè)計(jì)了Kubernetes,以編排Docker容器。Kubernetes于2015年2月發(fā)布,并提出以下目標(biāo)和考慮:
1.為應(yīng)用程序開發(fā)人員提供一個(gè)強(qiáng)大的工具,用于Docker容器編排,而不必與底層基礎(chǔ)設(shè)施交互;
2.跨云環(huán)境下,為一致的應(yīng)用程序部署經(jīng)驗(yàn)和APIs 提供標(biāo)準(zhǔn)部署接口和原型;
3.構(gòu)建一個(gè)模塊化的API核心,允許供應(yīng)商圍繞核心Kubernetes技術(shù)集成系統(tǒng)。
截至2016年3月,谷歌向CNCF捐贈(zèng)了Kubernetes,至今谷歌仍是該項(xiàng)目的主要貢獻(xiàn)者(其次是Redhat、CoreOS等)。
Kubernetes對(duì)應(yīng)用程序開發(fā)人員非常有吸引力,因?yàn)樗鼫p少了對(duì)基礎(chǔ)設(shè)施和操作團(tuán)隊(duì)的依賴。供應(yīng)商也非常喜歡Kubernetes,因?yàn)樗峁┝艘环N簡(jiǎn)單的方式來讓他們擁抱容器運(yùn)動(dòng),并為他們運(yùn)行自己的Kubernetes部署提供一個(gè)商業(yè)化解決方案。Kubernetes之所以很有吸引力,因?yàn)樗荂NCF下的開源項(xiàng)目,與Docker集群相比,后者雖然是開源的,但卻受到Docker Inc .的嚴(yán)格控制。