這次一起了解下docker Swarm,什么是dockerSwarm。
什么是docker Swarm產(chǎn)品背景
使用docker的流程,ssh到一臺(tái)服務(wù)器,運(yùn)行docker命令來運(yùn)行本機(jī)的docker服務(wù),隨著docker發(fā)展,越來越多的服務(wù)想要運(yùn)行在docker容器中,如果在這樣挨個(gè)的登錄在每個(gè)ssh主機(jī)上管理容器,就非常的吃力了,而且我們的應(yīng)用也需要高可用,也需要避免單點(diǎn)的故障,docker現(xiàn)有的能力已經(jīng)很難滿足這樣的需求了,在這樣的背景下,docker社區(qū)就產(chǎn)生類的dockerSwarm項(xiàng)目。
概念
什么是swarm,swarm這個(gè)名詞比較貼切,swarm這個(gè)單詞的意思就是動(dòng)物的集群行為,比如我們常見的蜂群,魚群,大雁南飛都可以成為swarm,swarm項(xiàng)目就是把多個(gè)docker 實(shí)例聚集在一起形成一個(gè)大的docker實(shí)例,對(duì)外提供集群服務(wù),同時(shí)這個(gè)集群提供所有的api,用戶可以相使用docker實(shí)例一樣使用docker的集群。
docker swarm的架構(gòu)圖下面這個(gè)圖,就可以看到docker swarm管理docker的一個(gè)架構(gòu)圖。以前使用docker命令行是針對(duì)docker主機(jī)的,然后到這臺(tái)機(jī)器上單獨(dú)的控制這臺(tái)機(jī)器上的主機(jī),有了swarm之后,客戶端命令是針對(duì)docker集群的。它的命令幾乎等同于docker的原生命令,它把命令發(fā)送給swarm,swarm選擇發(fā)送一個(gè)節(jié)點(diǎn)去真正的執(zhí)行,swarm是通過docker自帶的遠(yuǎn)程的API,來實(shí)現(xiàn)對(duì)docker的控制。
下面這個(gè)圖,這張圖跟上面一張圖描述的是一個(gè)事情,只不過它暴露了更多的的細(xì)節(jié),上面的大框和下面的小框都代表了一臺(tái)服務(wù)器,物理機(jī)或者虛擬機(jī),我們從上面說,上面是swarm的一個(gè)manager節(jié)點(diǎn),管理這個(gè)worker節(jié)點(diǎn),可以看到管理了多少個(gè)cpu,多少個(gè)內(nèi)存,每個(gè)上面運(yùn)行的服務(wù),每個(gè)服務(wù)的狀況,比如他們的標(biāo)簽,他們的健康狀態(tài),Manager管理者每個(gè)節(jié)點(diǎn)的生命周期,比如加入一個(gè)節(jié)點(diǎn),下線一個(gè)節(jié)點(diǎn),manager還管理者每個(gè)服務(wù)的生命周期,服務(wù)的部署,更新,停止,刪除,Node節(jié)點(diǎn)比較單純他就運(yùn)行了docker daemon,因?yàn)樵?.12之后swarm已經(jīng)融入了docker本身,開發(fā)一個(gè)遠(yuǎn)程的api給manager節(jié)點(diǎn)調(diào)度,運(yùn)行具體的服務(wù)和容器,下面咱們一起看看服務(wù)的部署流程是怎樣的,在這樣的架構(gòu)上是如何體現(xiàn)的。
環(huán)境的搭建想想之前學(xué)習(xí)的mesos,需要先安裝docker,Marathon,zookeeper,加入我們現(xiàn)在有5臺(tái)liunx服務(wù)器,每個(gè)上面都裝有docker,選擇一臺(tái)作為manager,上面執(zhí)行下圖的第一條命令, 執(zhí)行完之后會(huì)打印出來一個(gè)token作為dockerSwarm的憑證,然后在每個(gè)worker節(jié)點(diǎn)下執(zhí)行第二條命令,表示要加入集群,只需要token和對(duì)應(yīng)manager節(jié)點(diǎn)的ip和端口號(hào),集群環(huán)境就搭建完畢了
如何部署客戶端的發(fā)起docker命令,兩種方式
直接ssh到manager節(jié)點(diǎn),執(zhí)行docker命令。 通過遠(yuǎn)程訪問的方式,通過Remote API調(diào)用manager上的docker命令,我們這張圖畫的就是第二種方式。
docker Client 在manager節(jié)點(diǎn)的外邊,假如執(zhí)行了docker service create,先會(huì)經(jīng)過docker Deamon接受這條命令,傳給Scheduler模塊,Scheduler模塊主要實(shí)現(xiàn)調(diào)度的功能,負(fù)責(zé)選擇出來最優(yōu)的節(jié)點(diǎn),里面包含了2個(gè)子模塊,F(xiàn)iter 和Strategy,F(xiàn)iter很明顯是過濾節(jié)點(diǎn),用來找出滿足條件的節(jié)點(diǎn)(資源足夠多,節(jié)點(diǎn)正常的),Strategy是過濾出來后選擇出最優(yōu)的節(jié)點(diǎn)(對(duì)比選擇資源剩余最多的節(jié)點(diǎn),或者找到資源剩余最少的節(jié)點(diǎn)),當(dāng)然Fiter 和Strategy都是用戶可以單獨(dú)定制的,中間的Cluster是抽象的worker節(jié)點(diǎn)集群,包含了Swarm節(jié)點(diǎn)里面每個(gè)節(jié)點(diǎn)的信息,右邊的Discovery是信息維護(hù)的模塊,比如Label Health。Cluster最終調(diào)用容器的api,完成容器啟動(dòng)的劉而成。
調(diào)度模塊用戶在創(chuàng)建服務(wù)的時(shí)候,選擇最優(yōu)的節(jié)點(diǎn),選擇最優(yōu)節(jié)點(diǎn)的管理分為2個(gè)階段。
過濾和策略
filterConstraints
約束過濾器,根據(jù)當(dāng)前的操作系統(tǒng)的類型,內(nèi)核版本,存儲(chǔ)的類型進(jìn)行指標(biāo)上的約束,也可以自定義約束。當(dāng)前系統(tǒng)啟動(dòng)的時(shí)候可以通過label指定當(dāng)前機(jī)器所具有的特性然后通過Constraints把他們過濾出來。
Affinity
親和性過濾器,支持容器的親和性和鏡像的親和性,比如一個(gè)應(yīng)用,DB容器和web容器放在一起,就可以通過這個(gè)來實(shí)現(xiàn),
Dependency
依賴過濾器,link等等吧Dependency會(huì)將這些容器放在同一個(gè)節(jié)點(diǎn)上,有依賴管理的會(huì)將創(chuàng)建的容器和依賴的容器放在同一個(gè)節(jié)點(diǎn)上。
Health filter
健康過濾器,根據(jù)節(jié)點(diǎn)的健康狀態(tài)進(jìn)行過濾,把有問題的節(jié)點(diǎn)去掉。
Ports filter
端口過濾器,根據(jù)端口的使用情況進(jìn)行過濾,比如一個(gè)8080端口在某個(gè)主機(jī)上被占用,某些主機(jī)未被占用,會(huì)選用未被占用的那些主機(jī)。
StrategyBinpack
在同等情況下,會(huì)使用資源最多的節(jié)點(diǎn),通過這個(gè)策略可以讓容器聚集起來。
Spread
在同等情況下,會(huì)使用資源最少的節(jié)點(diǎn),通過這個(gè)策略可以讓容器均勻的分布在每個(gè)節(jié)點(diǎn)上。
Random
隨機(jī)選擇一個(gè)節(jié)點(diǎn)。
服務(wù)發(fā)現(xiàn)稍微有點(diǎn)復(fù)雜,根據(jù)場(chǎng)景來說吧
PS:假定運(yùn)行了一個(gè)nginx服務(wù)2個(gè)實(shí)例,nginx1 和nginx2,容器內(nèi)的端口是80,主機(jī)內(nèi)的端口是8080, 這2個(gè)容器分別運(yùn)行在node2和node3上,看到了吧node1雖然沒有運(yùn)行實(shí)例但是依然有8080端口在監(jiān)聽,一個(gè)集群在所有的worker節(jié)點(diǎn)上都是可以訪問到的,隨便選一個(gè)節(jié)點(diǎn)輸入它的ip和8080端口就可以訪問到,或者搭建一個(gè)負(fù)載均衡External LB,負(fù)責(zé)輪詢的方式訪問每個(gè)上邊的8080端口,為什么在每個(gè)節(jié)點(diǎn)上都可以訪問我們的服務(wù)呢?每個(gè)服務(wù)啟動(dòng)后所有的節(jié)點(diǎn)都會(huì)更新自己的VIP LB,把新的服務(wù)端口號(hào)和服務(wù)的信息建立一個(gè)關(guān)系,VIP LB是基于虛擬IP的負(fù)載均衡,VIP LB可以通過虛擬IP解析到真實(shí)IP,然后訪問到服務(wù)。 PS:也就是在Ingress之上多了一個(gè)link的場(chǎng)景,可以通過link的方式訪問,也不需要主機(jī)的網(wǎng)絡(luò),link怎么實(shí)現(xiàn)的呢,如果讓一個(gè)容器link到另一個(gè)容器很容易畢竟他們?cè)谝慌_(tái)主機(jī)上,一個(gè)服務(wù)link到另一個(gè)服務(wù)其實(shí)沒有那么簡(jiǎn)單了,可能包含一個(gè)容器,也可能包含很多個(gè)容器,可能運(yùn)行在一臺(tái)機(jī)器上,也可能分布在多臺(tái)機(jī)器上,我們?nèi)绾螌?shí)現(xiàn)可以通過名字來訪問彼此呢,這用到了容器的dns,這里的nginx服務(wù)依賴于tomcat服務(wù),nginx有2個(gè)實(shí)例,tomcat有一個(gè)實(shí)例,所有的nginx的容器都會(huì)對(duì)tomcat的解析,把它解析到tomcat的VIP,VIP負(fù)責(zé)做負(fù)載均衡,原理就是這樣的原理,link的方式外部是訪問不到的。link只適合swarm集群內(nèi)部的場(chǎng)景。 #創(chuàng)建自定義網(wǎng)絡(luò)
docker network create --driver=overlay --attachable mynet
#創(chuàng)建服務(wù)
docker service create -p 80:80 --network=mynet --name nginx nginx
Ingress 支持外部訪問,Ingress+ link和自定義網(wǎng)絡(luò)只能容器間進(jìn)行訪問。服務(wù)編排服務(wù)部署&服務(wù)發(fā)現(xiàn)(上邊說到了) 服務(wù)更新 — docker service update 服務(wù)擴(kuò)縮容 — docker service scale
SwarmPS:docker Swarm基本都了解的差不多了。下次開始docker swarm的環(huán)境搭建。
|