溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker Swarm群集配置實(shí)戰(zhàn)(2)

發(fā)布時(shí)間:2020-06-05 03:33:25 來(lái)源:網(wǎng)絡(luò) 閱讀:671 作者:warrent 欄目:云計(jì)算

前言:


這篇博文是基于docker Swarm群集環(huán)境之上,延伸了Docker Swarm的功能。

博文大綱:
一、Docker Swarm網(wǎng)絡(luò)管理
二、Swarm的service管理及版本更新

這篇博文的環(huán)境還是基于上一篇博文中搭建的環(huán)境,具體可以參考博文:Docker Swarm群集配置實(shí)戰(zhàn)(1) ,在進(jìn)行接下來(lái)的操作之前,必須要保證訪問(wèn)docker Swarm的web UI時(shí),可以看到以下界面:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

一、Docker Swarm網(wǎng)絡(luò)管理

Swarm群集會(huì)產(chǎn)生兩種不同類型的流量:

  • 控制和管理層面:包括 Swarm 消息管理等,例如請(qǐng)求加入或離開(kāi)Swarm,這種類型的流量總是被加密的。(涉及到集群內(nèi)部的hostname、ip-address、subnet、gateway等);
  • 應(yīng)用數(shù)據(jù)層面:包括容器與客戶端的通信等。(涉及到防火墻、端口映射、網(wǎng)口映射、VIP等)

在Swarm service中有三個(gè)重要的網(wǎng)絡(luò)概念:

  • overlay networks 管理Swarm中docker守護(hù)進(jìn)程間的通信??梢詫⑷萜鞲郊拥揭粋€(gè)或多個(gè)已存在的overlay網(wǎng)絡(luò)上,使容器與容器之間能夠通信;
  • ingress network 是一個(gè)特殊的 overlay 網(wǎng)絡(luò),用于服務(wù)節(jié)點(diǎn)間的負(fù)載均衡。當(dāng)任何 Swarm 節(jié)點(diǎn)在發(fā)布的端口上接收到請(qǐng)求時(shí),它將該請(qǐng)求交給一個(gè)名為 IPVS 的模塊。IPVS 跟蹤參與該服務(wù)的所有IP地址,選擇其中的一個(gè),并通過(guò) ingress 網(wǎng)絡(luò)將請(qǐng)求路由到它;
    初始化或加入 Swarm 集群時(shí)會(huì)自動(dòng)創(chuàng)建 ingress 網(wǎng)絡(luò),大多數(shù)情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。
  • docker_gwbridge是一種橋接網(wǎng)絡(luò),將 overlay 網(wǎng)絡(luò)(包括 ingress 網(wǎng)絡(luò))連接到一個(gè)單獨(dú)的 Docker 守護(hù)進(jìn)程的物理網(wǎng)絡(luò)。默認(rèn)情況下,服務(wù)正在運(yùn)行的每個(gè)容器都連接到本地 Docker 守護(hù)進(jìn)程主機(jī)的 docker_gwbridge 網(wǎng)絡(luò)。
    docker_gwbridge 網(wǎng)絡(luò)在初始化或加入 Swarm 時(shí)自動(dòng)創(chuàng)建。大多數(shù)情況下,用戶不需要自定義配置,但是 Docker 允許自定義。

查看docker01上面的默認(rèn)網(wǎng)絡(luò),如下(注意其SCOPE列,確認(rèn)其生效范圍):

Docker Swarm群集配置實(shí)戰(zhàn)(2)

除了Swarm群集默認(rèn)創(chuàng)建的兩個(gè)網(wǎng)絡(luò)以外,我們還可以自定義創(chuàng)建overlay網(wǎng)絡(luò),連接到此網(wǎng)絡(luò)的容器,即可互相通信,但是需要注意,除了在docker01這個(gè)manager上可以查看創(chuàng)建的overlay網(wǎng)絡(luò)外,其他節(jié)點(diǎn)在沒(méi)有加入此網(wǎng)絡(luò)前,執(zhí)行“docker network ls”命令是查看不到的。

創(chuàng)建自定義overlay網(wǎng)絡(luò)并驗(yàn)證

[root@docker01 ~]# docker network create -d overlay --subnet 192.168.22.0/24 --gateway 192.168.22.1 --attachable my_net1
# 創(chuàng)建一個(gè)overlay網(wǎng)絡(luò),名字為my_net1;
# “--subnet”:指定其網(wǎng)段(可以不指定);“--gateway”:指定其網(wǎng)關(guān)(可以不指定);
# 但是在docker  Swarm群集中創(chuàng)建overlay網(wǎng)絡(luò)時(shí),必須添加“--attachable”選項(xiàng)
# 否則,其他節(jié)點(diǎn)的容器運(yùn)行時(shí),無(wú)法使用此網(wǎng)絡(luò)

創(chuàng)建完成后,在其他docker節(jié)點(diǎn)上是查看不到這個(gè)新創(chuàng)建的overlay網(wǎng)絡(luò)的,但是,可以使用此網(wǎng)絡(luò)(在運(yùn)行容器時(shí),直接指定即可,等容器運(yùn)行后,便可以查看到此網(wǎng)絡(luò)了)
Docker Swarm群集配置實(shí)戰(zhàn)(2)

測(cè)試剛剛創(chuàng)建的overlay網(wǎng)絡(luò),是否可用,分別在docker01、docker02上基于創(chuàng)建的overlay網(wǎng)絡(luò)運(yùn)行一個(gè)容器,然后進(jìn)行ping測(cè)試,確認(rèn)可以ping通:

#docker01主機(jī)上基于overlay網(wǎng)絡(luò)創(chuàng)建一個(gè)容器:
[root@docker01 ~]# docker run -tid --network my_net1 --name test1 busybox
#同docker01的操作,在docker02上也創(chuàng)建一個(gè):
[root@docker02 ~]# docker run -tid --network my_net1 --name test2 busybox

在容器創(chuàng)建后,在docker02主機(jī)上,使用test2這個(gè)容器去ping容器test1,測(cè)試結(jié)果如下(由于是自定義網(wǎng)絡(luò),所以可以直接ping對(duì)端容器的容器名):

Docker Swarm群集配置實(shí)戰(zhàn)(2)

二、Swarm的service管理及版本更新

1、指定某個(gè)service運(yùn)行在同一臺(tái)docker服務(wù)器

在第一篇的博文中測(cè)試過(guò),如果Swarm群集中的manager下發(fā)一個(gè)service任務(wù),那么,下發(fā)的任務(wù)將隨機(jī)分布在群集中的docker服務(wù)器之上運(yùn)行, 如果說(shuō),由于需要將自己的生產(chǎn)環(huán)境配置的統(tǒng)一、規(guī)范一些,某一臺(tái)docker服務(wù)器,我就只運(yùn)行web服務(wù),另一臺(tái)docker主機(jī),我就只運(yùn)行PHP服務(wù),那么,怎么解決呢?

解決方案一:

[root@docker01 ~]# docker service create --replicas 3 --constraint node.hostname==docker03 --name test nginx
#在docker03主機(jī)上,基于nginx鏡像,運(yùn)行3個(gè)名為test的容器

上述命令的執(zhí)行后如下所示:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

解決方案二:

[root@docker01 ~]# docker node update --label-add mem=max docker02
#以鍵值對(duì)的方式給docker02主機(jī)打上標(biāo)簽“mem=max”,等號(hào)兩邊的內(nèi)容是可以自定義的
[root@docker01 ~]# docker service create --name test01 --replicas 3 --constraint 'node.labels.mem==max' nginx
#基于nginx鏡像在標(biāo)簽為“mem==max”的主機(jī)上運(yùn)行3個(gè)名為test01的服務(wù)
[root@docker01 ~]# docker node inspect docker02   #可以執(zhí)行此命令查看dokcer02主機(jī)的標(biāo)簽
#標(biāo)簽相關(guān)的信息,在Spec{  }中

查看web UI界面進(jìn)行確認(rèn):

Docker Swarm群集配置實(shí)戰(zhàn)(2)

2、更新某個(gè)service版本

1)準(zhǔn)備要使用的鏡像,并基于此鏡像運(yùn)行service
[root@docker01 aa]# cat html/index.html    #準(zhǔn)備網(wǎng)頁(yè)文件
127.0.0.1
[root@docker01 aa]# cat Dockerfile      
#基于nginx容器,將當(dāng)前目錄下的html目錄掛載為nginx的網(wǎng)頁(yè)根目錄
FROM nginx
ADD html /usr/share/nginx/html
[root@docker01 aa]# docker build -t 192.168.20.6:5000/testnginx:1.0 .     #生成一個(gè)鏡像
[root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:1.0
#將新生成的鏡像上傳至私有倉(cāng)庫(kù)
[root@docker01 aa]# docker service create --name newnginx -p 80:80 --replicas 3  192.168.20.6:5000/testnginx:1.0 
#基于上傳到私有倉(cāng)庫(kù)的鏡像,運(yùn)行三個(gè)service,并映射到本地80端口
#當(dāng)上面的命令執(zhí)行成功后,只要docker主機(jī)上運(yùn)行著那個(gè)service,就可以通過(guò)它的80端口訪問(wèn)到nginx服務(wù)

運(yùn)行后,web UI界面顯示如下:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

可以看到,每個(gè)節(jié)點(diǎn)都運(yùn)行了那個(gè)service,也就是說(shuō),訪問(wèn)哪個(gè)節(jié)點(diǎn)的80端口,都可以看到一樣的頁(yè)面,如下:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

Docker Swarm群集配置實(shí)戰(zhàn)(2)

在docker01上查看service的詳細(xì)信息,如下:

[root@docker01 aa]# docker service ps newnginx    #查看service的詳細(xì)信息

命令執(zhí)行的結(jié)果(需要注意的是其鏡像標(biāo)簽,也就是說(shuō)注意其是基于哪個(gè)鏡像運(yùn)行的):
Docker Swarm群集配置實(shí)戰(zhàn)(2)

2)準(zhǔn)備該鏡像的2.0版本(模擬在線版本升級(jí)):

[root@docker01 aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:2.0 
#準(zhǔn)備2.0版本的鏡像
[root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:2.0 
#上傳到私有倉(cāng)庫(kù)
[root@docker01 aa]# docker service update --image 192.168.20.6:5000/testnginx:2.0 newnginx 
#將newnginx服務(wù)的鏡像升級(jí)到2.0
[root@docker01 aa]# docker service ps newnginx    #再次查看service的詳細(xì)信息

命令執(zhí)行的結(jié)果如下,發(fā)現(xiàn)基于1.0鏡像運(yùn)行的newnginx的service狀態(tài)已經(jīng)變成了shutdown,而基于2.0運(yùn)行的service變?yōu)榱藃unning,如下:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

此時(shí),若再次訪問(wèn)其web頁(yè)面,就變?yōu)榱薾ginx的默認(rèn)首頁(yè)(因?yàn)槲覀兊?.0鏡像只是更改了下nginx鏡像的標(biāo)簽,并沒(méi)有修改其文件),如下:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

其web UI界面可以查看到該service的最后一次升級(jí)的時(shí)間。

3)升級(jí)2.0到3.0(升級(jí)時(shí),對(duì)其進(jìn)行精細(xì)的控制)

[root@docker01 aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:3.0 
#準(zhǔn)備3.0版本的鏡像
[root@docker01 aa]# docker push 192.168.20.6:5000/testnginx:3.0 
#上傳到私有倉(cāng)庫(kù)
[root@docker01 ~]# docker service update --replicas 6 --image 192.168.20.6:5000/testnginx:3.0 --update-parallelism 3 --update-delay 1m newnginx
#上述選項(xiàng)的含義如下:
# “--replicas 6”:更新后的service數(shù)量為6個(gè)(原本是3個(gè))
# “ --update-parallelism 2 ”:設(shè)置并行更新的副本數(shù)。
# “ --update-delay 1m ”:指定滾動(dòng)更新的時(shí)間間隔為1分鐘
[root@docker01 ~]# docker service ps newnginx    #自行對(duì)比newnginx服務(wù)的詳細(xì)信息

4)版本回滾操作

當(dāng)我們升級(jí)到新的版本后,發(fā)現(xiàn)新版本的鏡像有些問(wèn)題,而不得不返回之前運(yùn)行的版本,那么可以執(zhí)行下面的操作:

[root@docker01 ~]# docker service update --rollback newnginx   #將newnginx的service回滾到前一個(gè)版本
[root@docker01 ~]# docker service ps newnginx   #自行查看

執(zhí)行回滾命令后,回滾過(guò)程如下:

Docker Swarm群集配置實(shí)戰(zhàn)(2)

回滾成功后,我這里就從原來(lái)的3.0變回了2.0,雖然在升級(jí)3.0的時(shí)候,指定的service數(shù)量是6個(gè),但是之前只有3個(gè),所以在執(zhí)行回滾操作后,service數(shù)量也將變回3個(gè)。

注意:當(dāng)我們執(zhí)行回滾操作的時(shí)候,默認(rèn)是回滾到上一次操作的版本,并且不可以連續(xù)回滾。

———————— 本文至此結(jié)束,感謝閱讀 ————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI