目前在容器編排領(lǐng)域,Kubernetes、Mesos以及Swarm呈現(xiàn)“三分天下”的格局,各自都有著不同的應(yīng)用場景。短期內(nèi),很難看到“一統(tǒng)天下”的局面,本文,來自阿里云高級(jí)專家陳萌輝將帶你了解阿里內(nèi)部在推行容器化過程中的一些著力點(diǎn),同時(shí),他將深刻剖析Swarm的進(jìn)化史以及在阿里云的大規(guī)模應(yīng)用,最后,他給出三個(gè)案例,供大家參考。
阿里從前年開始就已經(jīng)在集團(tuán)內(nèi)部大規(guī)模地推行容器化和運(yùn)用Swarm來做應(yīng)用的發(fā)布、集群管理等事情。特別值得注意的是去年,阿里云跟Docker達(dá)成了一項(xiàng)深度合作的協(xié)議,從中我們不難窺探阿里的容器戰(zhàn)略。本文將從三個(gè)方面闡述“Swarm的進(jìn)化和大規(guī)模應(yīng)用”,第一, Swarm架構(gòu);第二,Swarm Mode的編排;第三是Swarm在阿里的應(yīng)用。
Swarm架構(gòu)
圖1 Swarm架構(gòu)
我們先看一下Swarm是什么?Swarm,是Docker官方推出的,它的特點(diǎn)就是跟Docker本身有很好的集成,另外,它也是一個(gè)非常簡單易用的工具,所以目前吸引了很多開發(fā)者在用。
Swarm是Docker公司繼Docker Engine之后推出的很重要的集群管理系統(tǒng)和容器編排與調(diào)度系統(tǒng)。架構(gòu)底層是集群的機(jī)器資源,可以是一些物理機(jī)也可以是一些虛擬機(jī),上面經(jīng)過Swarm這一層把容器調(diào)度和部署到這些機(jī)器上去,它對(duì)外提供跟Docker類似的API。
具體來看,Swarm的框架分成三塊,第一塊是Engine,第二是Manager,第三是KV store。它有幾個(gè)特點(diǎn),第一依賴外部存儲(chǔ)來完成節(jié)點(diǎn)發(fā)現(xiàn)并保證一致性;第二,Manager只跟Daemon通信,不跟Agent通信;第三,Manager可以有多副本,這是為高可用設(shè)計(jì)的,采用一主多熱備模式,所有manager都同時(shí)連接所有Daemon,備轉(zhuǎn)發(fā)請(qǐng)求至主,另外,它依賴外部KV選主。
API
Swarm提供的API,主要是有這么幾類:
1.集群類:info events
2.容器類:get/list、create、start/stop等
3.鏡像類:get/list、push、pull、tag等
4.數(shù)據(jù)卷類:get/list、create、delete
5.網(wǎng)絡(luò)類:get/list、create、delete等
調(diào)度
資源維度層面有三個(gè): CPU 、Memory、 端口,CPU / Memory支持超賣;調(diào)度策略有兩種:spread / binpack,另外,它不支持優(yōu)先級(jí)、搶占。
它比較有特點(diǎn)的一些功能有兩個(gè),一個(gè)是叫節(jié)點(diǎn)約束,約束可以有兩種類型,比如說你可以約束我這個(gè)節(jié)點(diǎn)是哪一個(gè),你可以給節(jié)點(diǎn)去一個(gè)名字或者打一個(gè)標(biāo)簽什么的,另外一個(gè)可以通過打標(biāo)簽去選擇一種機(jī)器,你在部署的時(shí)候,可以指定這些容器部署到哪些機(jī)器上去。
節(jié)點(diǎn)約束:
1.節(jié)點(diǎn)名:constraint:node==XXX
2.標(biāo)簽:constraint:key==value
親和性也有兩種,一種是image,一種是service,比如我有一個(gè)應(yīng)用鏡像很大,我不希望它在集群各個(gè)地方去部署,我希望他部署下來已經(jīng)下載鏡像的地方,這樣的話可以減少一些啟動(dòng)的時(shí)間和下載的過程,你可以說我這個(gè)服務(wù)不是跟某個(gè)鏡像做親和,也可以跟某個(gè)服務(wù)做親和。
親和性:
1.鏡像:affinity:image==foo
2.服務(wù):affinity:service==foo
總結(jié)一下Swarm這個(gè)產(chǎn)品,Swarm整體來說有幾個(gè)特點(diǎn),第一個(gè)是部署簡捷,只有三個(gè)模塊,外部的依賴只有KV Store和Docker Daemon這兩個(gè),所有組件都容器化。第二高效友好的用戶交互,高度兼容Docker Engine API,可直接使用Docker Client。第三是靈活的約束與親和性描述,可以在一定程度上彌補(bǔ)調(diào)度策略的不足。
同時(shí),我們也看到它有一些不足的地方,首先一個(gè)不足的地方就是它是容器級(jí)別的API,所有的API都是針對(duì)單個(gè)容器的,抽象層次較低。其次,響應(yīng)式設(shè)計(jì),不方便執(zhí)行常駐后臺(tái)的操作,它在內(nèi)存中不保存任何的狀態(tài),所有的狀態(tài)都是從Docker上統(tǒng)計(jì)過來的。有一個(gè)好處,它一旦掛掉了,能夠很方便地恢復(fù)狀態(tài),但也有一些壞處,比如你要跑一個(gè)離線的任務(wù),就不太好做。除此之外,它依賴定期同步跟Docker Engine保持一致狀態(tài)。
Swarm Mode
針對(duì)Swarm這個(gè)產(chǎn)品的一些不足,從1.12版本開始,Docker就提供了Swarm Mode的功能,這個(gè)功能是將Swarm的集群管理、容器調(diào)度功能集成進(jìn)Docker Engine,并且提供Service級(jí)別抽象和自帶的負(fù)載均衡,它從容器級(jí)別的調(diào)度器進(jìn)化到了服務(wù)級(jí)別的調(diào)度器。