架構(gòu)
圖2 Swarm Mode架構(gòu)
它的架構(gòu)比Swarm更簡(jiǎn)單一些,首先就是它沒(méi)有任何的外部依賴(lài),只要你裝 Docker Engine,它就可以構(gòu)成一個(gè)容器集群,DockerDaemon本身會(huì)兼Engine、Manager、Agent三職。Managers之間通過(guò)RAFT協(xié)議組成分布式強(qiáng)一致性KV Store,Manager與Worker的Daemon不通信。
同時(shí),它也是有高可用設(shè)計(jì)的,Manager數(shù)量需要大于等于3才可以實(shí)現(xiàn)高可用,它也是一主多熱備,另外也可以動(dòng)態(tài)添加/刪除Manager,如果有的機(jī)器宕機(jī)或者掛掉了,你不需要把這個(gè)機(jī)器再恢復(fù)起來(lái),很多系統(tǒng)對(duì)Manager控制器的機(jī)器是有依賴(lài)的。如果一旦掛掉了你只能把它修好之后再上來(lái),但是這個(gè)是不需要的,你可以任意在里面編程。這樣他會(huì)通過(guò)RAFT協(xié)議把原來(lái)集群狀態(tài)信息統(tǒng)一到Manager上去,這樣有實(shí)現(xiàn)了高可用。
Swarm Mode API
在剛才Swarm的API之上,多提供了兩類(lèi)的API:
集群管理類(lèi):
1.init、join、leave
2.token
服務(wù)類(lèi):
1.get/list
2.create、delete、update
3.inspect、ps
同時(shí),Swarm的API有兩個(gè)特點(diǎn),它分兩類(lèi),一類(lèi)是像Swarm、Service、Network類(lèi),只有Manager能處理的。還有一類(lèi)容器、鏡像、數(shù)據(jù)卷類(lèi),所有節(jié)點(diǎn)都能處理。另外它的API還是高度兼容舊的API,你可以拿低版本的去訪問(wèn)Swarm mode的集群。
Service
我們來(lái)看一下Swarm Service的概念,它提供了三級(jí)的概念:
1.Service:相同功能的一組容器
2.Task:任務(wù)調(diào)度單元,由Manager生成,同步至Worker
3.Container:Task落地
另外,還提供Rolling Update功能。
在Swarm mode里面Service分為兩類(lèi),一類(lèi)是有Replicated Service,一類(lèi)是Global Service。
Replicated Service:
1.用戶(hù)指定副本數(shù)
2.Reconciled:自動(dòng)確保副本數(shù)
3.constraint
node.id node.hostname:
1.node.role
2.node.labels engine.labels
Global Service:
1.每個(gè)節(jié)點(diǎn)有且僅有一個(gè)容器
2.添加加點(diǎn)時(shí)自動(dòng)擴(kuò)展
3.可附加constraint
網(wǎng)絡(luò)模型方面,支持overlay網(wǎng)絡(luò),同一網(wǎng)絡(luò)內(nèi),服務(wù)名、容器名可解析;一個(gè)服務(wù)一個(gè)網(wǎng)絡(luò);服務(wù)發(fā)現(xiàn)支持不同服務(wù)可加入同一個(gè)網(wǎng)絡(luò)。
Routing Mesh
下面我們看一下Swarm自帶的負(fù)載均衡,它取的名字叫做Routing Mesh,Service自帶的負(fù)載均衡是基于LVS,主要有兩種模式,
VIP模式:每個(gè)服務(wù)一個(gè)VIP,通過(guò)LVS實(shí)現(xiàn);服務(wù)名解析至VIP;
DNS模式:服務(wù)名解析至容器IP,RoundRobin方式。另外,服務(wù)發(fā)生變化時(shí),自動(dòng)調(diào)整后端。
總結(jié)一下Swarm Mode的產(chǎn)品,第一個(gè)它是無(wú)任何依賴(lài),可以安裝Engine+一個(gè)命令,無(wú)中心架構(gòu)。第二個(gè)它可以部署高可用服務(wù),你可以在集群這邊進(jìn)行訪問(wèn)的,比如說(shuō)你的容器只布在了三臺(tái)機(jī)器,這個(gè)集群所有的機(jī)器都可以訪問(wèn)到這個(gè)服務(wù),這樣的話(huà)就很容易做成高可用的。再一個(gè)Secure by default,自帶證書(shū)頒發(fā)、更新功能,Manager與Worker之間通過(guò)SSL連接。
當(dāng)然它也有一些不足的地方,第一個(gè)只有Service級(jí)抽象,Stack級(jí)抽象仍無(wú)API,另外,部署有狀態(tài)服務(wù)比較復(fù)雜。第二,Service API有很多容器特性不支持,如host network、host pid、privileged等。還有一個(gè)缺點(diǎn),它無(wú)法自舉,是需要手工init的。
Swarm在阿里內(nèi)部的應(yīng)用
上面介紹了Docker Swarm的產(chǎn)品相關(guān)的東西。下面我就來(lái)介紹一下Swarm在阿里內(nèi)部的應(yīng)用,這個(gè)也是大家更關(guān)心的一個(gè)地方,有幾個(gè)方面。第一是阿里內(nèi)部的容器化,可能大家都知道,阿里內(nèi)部有一支非常強(qiáng)大的運(yùn)維團(tuán)隊(duì),除非查問(wèn)題的時(shí)候,一般開(kāi)發(fā)人員是不接觸現(xiàn)代的機(jī)器的,所有的應(yīng)用部署、升級(jí)這些都是運(yùn)維人員來(lái)做的。強(qiáng)大的運(yùn)維團(tuán)隊(duì)也導(dǎo)致了一些問(wèn)題,它的應(yīng)用的部署和升級(jí)往往是很個(gè)性化的,可能這個(gè)運(yùn)維人員他在支持這個(gè)應(yīng)用的時(shí)候,通過(guò)寫(xiě)一些腳本或者用一些工具,實(shí)現(xiàn)業(yè)務(wù)的部署的自動(dòng)化,而另外的運(yùn)維人員運(yùn)用另外的工具和另外的腳本,導(dǎo)致了很多應(yīng)用的升級(jí)部署不是一個(gè)標(biāo)準(zhǔn)化的方式。
這樣的話(huà),比如說(shuō)這個(gè)人員他轉(zhuǎn)崗了,新來(lái)的人首先要去熟悉那個(gè)部署的工具,這個(gè)運(yùn)維任務(wù)比較大,所以應(yīng)該是從去年、前年阿里內(nèi)部開(kāi)始推容器化,由Swarm來(lái)統(tǒng)一管理我們的集群,應(yīng)用的話(huà)就是容器化之后,由Swarm去統(tǒng)一做部署,這樣的話(huà)就會(huì)形成一個(gè)跟業(yè)務(wù)無(wú)關(guān)的統(tǒng)一的部署平臺(tái)。運(yùn)維人員不再去關(guān)心應(yīng)用如何地去部署,他只要關(guān)心把這個(gè)應(yīng)用部署上去就可以了,所有的應(yīng)用都是一樣的方式,即使有新的人接替他學(xué)起來(lái)也非常地方便。