溫馨提示×

溫馨提示×

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

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

Docker Swarm集群部署實戰(zhàn)

發(fā)布時間:2020-06-02 08:47:45 來源:網(wǎng)絡(luò) 閱讀:2952 作者:wx5b9c94b17c62a 欄目:云計算

基本概念:

Swarm介紹:
Swarm是Docker公司在2014年12月初發(fā)布的一套較為簡單的工具,用來管理Docker集群,它將一群Docker宿主機變成一個單一的虛擬的主機。
Swarm使用標準的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client(dockerclient in Go, docker_py,docker等)均可以直接與Swarm通信。Swarm幾乎全部用Go語言來完成開發(fā),Swarm0.2版本增加了一個新的策略來調(diào)度集群中的容器,使得在可用的節(jié)點上傳播它們,以及支持更多的Docker命令以及集群驅(qū)動。Swarm deamon只是一個調(diào)度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發(fā)送過來的請求,調(diào)度適合的節(jié)點來運行容器,這意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點也會照常運行,當Swarm重新恢復(fù)運行之后,它會收集重建集群信息。
docker客戶端發(fā)送過來的請求,調(diào)度適合的節(jié)點來運行容器,這意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點也會照常運行,當Swarm重新恢復(fù)運行之后,它會收集重建集群信息。

Swarm集群的特性:
集群中可以都是manager,但不可以都是worker。

  • Node:節(jié)點.
  • manager:經(jīng)理,管理者
  • worker:工作者
  • service:一個任務(wù),用來定義worker端接收manager的命令。

準備環(huán)境:

三臺主機(centos7):
docker version:12版本以上。

node01:172.16.1.30
node02:172.16.1.31
node03:172.16.1.32

(1)首先修改主機名:

[root@sqm-docker01 ~]# hostnamectl set-hostname node01
[root@sqm-docker01 ~]# hostnamectl set-hostname node02
[root@sqm-docker01 ~]# hostnamectl set-hostname node03

(2)三臺主機分別配置域名解析:
[root@node01 ~]# vim /etc/hosts
Docker Swarm集群部署實戰(zhàn)
(3)設(shè)置免密登錄:
//一直默認回車,生成密鑰:
Docker Swarm集群部署實戰(zhàn)

//將密鑰拷貝給node02和node03:
[root@node01 ~]# ssh-copy-id  node02
[root@node01 ~]# ssh-copy-id  node03
//有了免密登錄,將host域名解析文件拷貝給其他兩個節(jié)點:
[root@node01 ~]# scp /etc/hosts  root@172.16.1.31:/etc/hosts
[root@node01 ~]# scp /etc/hosts  root@172.16.1.32:/etc/hosts

項目操作:

1)初始化集群:

指定當前主機為集群的創(chuàng)建者(leader)
Docker Swarm集群部署實戰(zhàn)

2)既然在初始化集群時,已經(jīng)提示加入集群的命令(將其復(fù)制),所以接下來將node02和node03主機加入到該集群:

Docker Swarm集群部署實戰(zhàn)
Docker Swarm集群部署實戰(zhàn)

//查看節(jié)點是否加入到集群中:
提示:這步操作只有manager才有權(quán)限查看。

Docker Swarm集群部署實戰(zhàn)

*####如果其他節(jié)點需要加入到該集群中,并且需要指定身份,當你忘掉初始化集群時生成的命令時,可以執(zhí)行以下命進行查看命令
注意:只有manager端才有權(quán)限進行查看。

#查看以worker端加入這個集群
[root@sqm-docker01 ~]# docker swarm join-token worker

Docker Swarm集群部署實戰(zhàn)

#查看以manager的身份加入這個集群
[root@sqm-docker01 ~]# docker swarm join-token manager

Docker Swarm集群部署實戰(zhàn)

(3)配置web Ui界面:

#拉取鏡像:
用的是本地的鏡像包,所以直接導入:
[root@node01 ~]# docker load --input myvisualizer.tar
Docker Swarm集群部署實戰(zhàn)

#運行服務(wù):
[root@node01 ~]# docker run -d -p 8000:8080 -e HOST=172.16.1.30 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock  --name visualizer  dockersamples/visualizer
  • HOST指定地址為本機地址

##訪問web網(wǎng)頁界面:
URL:http://172.16.1.30:8000/
Docker Swarm集群部署實戰(zhàn)

可以看到集群中的三個節(jié)點。

(4)搭建swarm集群網(wǎng)絡(luò)(overlay網(wǎng)絡(luò))

還記得在之前搭建overlay的博文中,在搭建overlay網(wǎng)絡(luò)時需要先部署consul(數(shù)據(jù)中心),但現(xiàn)在是在swarm集群的環(huán)境中,默認自帶consul服務(wù)的功能,所以可以在直接創(chuàng)建overlay網(wǎng)絡(luò)。

##創(chuàng)建overlay網(wǎng)絡(luò):
[root@node01 ~]# docker network  create -d overlay --attachable  docker

注意:在創(chuàng)建overlay網(wǎng)絡(luò)時,如果沒有加上--attachable,那么此網(wǎng)絡(luò)不可以應(yīng)用于容器上。

##在node01和node02之上分別運行一個容器,測試是否能夠正常通信:
[root@node01 ~]# docker run -itd --name test1 --network docker busybox
[root@node02 ~]# docker run -itd --name test2 --network docker busybox

Docker Swarm集群部署實戰(zhàn)

(5)搭建私有倉庫(共享鏡像)

搭建私有倉庫的目的是為了能夠在一個集群中大家共用私有倉庫中的鏡像,能夠很方便的部署服務(wù),并且在公司中為了安全考慮,大多都是部署自己的私有倉庫。

//以官方的registry鏡像進行部署:
[root@node01 ~]# docker run -d --name registry --restart=always -p 5000:5000 registry:latest
//修改docker配置文件:
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service 

修改內(nèi)容如下:
Docker Swarm集群部署實戰(zhàn)

//重啟docker服務(wù):
[root@sqm-docker01 ~]# systemctl daemon-reload
[root@sqm-docker01 ~]# systemctl restart docker.service
//直接將配置文件拷貝給node02和node03
[root@sqm-docker01 ~]# scp /usr/lib/systemd/system/docker.service  node02:/usr/lib/systemd/system/docker.service

[root@sqm-docker01 ~]# scp /usr/lib/systemd/system/docker.service  node03:/usr/lib/systemd/system/docker.service

拷貝過去后,需要在node02和node03重載進程并且重啟docker服務(wù)。

####部署完私有倉庫,我們最好測試一下:

在node01上將apache鏡像上傳到私有倉庫中:
[root@node01 ~]# docker tag httpd:latest  172.16.1.30:5000/myhttpd
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd

在其他節(jié)點上進行拉取:
[root@node02 ~]# docker pull 172.16.1.30:5000/myhttpd
Docker Swarm集群部署實戰(zhàn)
[root@node03 ~]# docker pull 172.16.1.30:5000/myhttpd
Docker Swarm集群部署實戰(zhàn)

(6)docker swarm集群配置service服務(wù)

##發(fā)布任務(wù),并且創(chuàng)建副本數(shù)量為2
[root@node01 ~]# docker service create  --replicas 2 --name web01 -p 80:80 172.16.1.30:5000/myhttpd:latest 

--replicas:副本,可以基于該副本進行復(fù)制。--replicas 1表示只需要一個容器。

//查看服務(wù):
[root@node01 ~]# docker service  ls

Docker Swarm集群部署實戰(zhàn)
//查看服務(wù)運行在集群中的哪個節(jié)點之上:
它是會參考節(jié)點的各種性能配置以及工作量,來實現(xiàn)分配到給哪個節(jié)點,以實現(xiàn)負載均衡。

Docker Swarm集群部署實戰(zhàn)
除了通過命令行的方式進行查看service的各種信息,還可以通過web網(wǎng)頁進行查看:
Docker Swarm集群部署實戰(zhàn)

發(fā)布第二個服務(wù):
[root@node01 ~]# docker service create --replicas 4 --name web02 -p 80 172.16.1.30:5000/myhttpd #隨機生成端口
Docker Swarm集群部署實戰(zhàn)
可以看到依然會均衡的分布在每個節(jié)點。

(7)service服務(wù)的擴容與縮容:

實現(xiàn)擴容和縮容的原因很明確,縮容是當某一個節(jié)點壓力過大,或者是服務(wù)器配置不足以承受所運行的服務(wù),需要減少容器,以保證穩(wěn)定運行,擴容呢?是當 某個節(jié)點的服務(wù)器處于閑置的狀態(tài)下,多給分配幾個服務(wù)運行,也是不影響的。

1)擴容:
[root@node01 ~]# docker service  scale web01=6

Docker Swarm集群部署實戰(zhàn)
在web網(wǎng)頁進行查看:
Docker Swarm集群部署實戰(zhàn)

2)縮容:
[root@node01 ~]# docker service  scale web02=1

Docker Swarm集群部署實戰(zhàn)
在web網(wǎng)頁上進行查看:
Docker Swarm集群部署實戰(zhàn)

(8)設(shè)置manager不參加工作:

在一個集群中,最好的狀態(tài)是指定manager節(jié)點不參加工作,讓node節(jié)點進行工作,好比是在一個公司中,老板是不可能工作的是吧,一般會去讓員工進行工作。

Docker Swarm集群部署實戰(zhàn)

##指定manager節(jié)點不參加工作:
[root@node01 ~]# docker node update  --availability drain  node01 

Docker Swarm集群部署實戰(zhàn)
Docker Swarm集群部署實戰(zhàn)

從上圖可以看到,manager已經(jīng)不參加工作,所以運行的容器默認已經(jīng)工作在node01和node02上。

(9)指定副本運行節(jié)點位置:

如果有需求,需要將發(fā)布的所以服務(wù)運行在同一臺服務(wù)器上,該怎么實現(xiàn)呢?
方法一:

1)定義標簽:
[root@node01 ~]# docker node update  --label-add disk=max node03  ##將標簽定義到節(jié)點3上
2)發(fā)布服務(wù):
[root@node01 ~]# docker service  create  --name test --replicas 5 -p 80 --constraint 'node.labels.disk==max'  172.16.1.30:5000/myhttpd

查看是否指定成功:
Docker Swarm集群部署實戰(zhàn)
Docker Swarm集群部署實戰(zhàn)

方法二:
直接指定節(jié)點主機名。
[root@node01 ~]# docker service create --replicas 5 --name testname --constraint 'node.hostname==node02' -p 80 172.16.1.30:5000/myhttpd
Docker Swarm集群部署實戰(zhàn)

service服務(wù)的更新&回滾:

1,服務(wù)的更新:

將以上服務(wù)(test)更新為2.0版本。

[root@node01 ~]# docker tag 172.16.1.30:5000/myhttpd:latest 172.16.1.30:5000/myhttpd:v2.0
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd:v2.0 

[root@node01 ~]# docker service update --image 172.16.1.30:5000/myhttpd:v2.0 test
Docker Swarm集群部署實戰(zhàn)
注意:當服務(wù)的版本升級了,它原來的版本依然會進行保留的。
并且在更新的過程中,默認是一個一個的依次進行更新的,當一個更新完成后,再去更新下一個。

2,服務(wù)自定義更新:

將以上服務(wù)進行更新為3.0版本。

[root@node01 ~]# docker tag 172.16.1.30:5000/myhttpd:v2.0 172.16.1.30:5000/myhttpd:v3.0
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd:v3.0 

[root@node01 ~]# docker service update --image 172.16.1.30:5000/myhttpd:v3.0 --update-parallelism 2 --update-delay 1m test

參數(shù)解釋:
--update-parallelism 2 :設(shè)置并行(同時)更新的副本數(shù)。
--update-delay 1m(m(分鐘 s(秒) h (小時)d(天) w(星期)):指定滾動更新的時間間隔。

Docker Swarm集群部署實戰(zhàn)
Docker Swarm集群部署實戰(zhàn)

3,服務(wù)的回滾操作:

當我們執(zhí)行回滾操作時,默認是回滾到上一次操作的版本,只能在前后兩個版本之間進行回滾,不能連續(xù)回滾。

[root@node01 ~]# docker service update --rollback test
Docker Swarm集群部署實戰(zhàn)
登陸web網(wǎng)頁更直觀的進行查看:
Docker Swarm集群部署實戰(zhàn)

回滾成功。。。

##測試再次回滾,它會回滾到哪個版本呢?

[root@node01 ~]# docker service  update --rollback test

Docker Swarm集群部署實戰(zhàn)

可以看到它會回滾到第一次回滾前的一個版本。證明是不可以連續(xù)回滾的。

docker swarm集群命令匯總:

//初始化集群:docker swarm init --advertise-addr 本機ip地址
//查看節(jié)點信息:docker node ls
//以worker端加入這個集群:docker swarm join-token worker
//以manager端加入這個集群:docker swarm join-token manager
//將節(jié)點升級為manager:docker node promote node2
//將節(jié)點降級為worker:docker node demote node2
//脫離集群:docker swarm leave
//刪除節(jié)點(只有脫離了集群,才能夠刪除):docker node rm node2

//強制刪除集群:docker swarm leave -f (必須強制刪除)

//查看服務(wù):docker service ls
//查看服務(wù)運行在哪個節(jié)點上(隨機的):docker service ps 任務(wù)名

//發(fā)布一個任務(wù):
docker service create --replicas 2 --name test -p 80 httpd:latest
//刪除所有任務(wù)(容器):docker service rm ........(任務(wù)名)
或者:docker service ls | xargs docker service rm

//將任務(wù)進行擴容:docker service scale 服務(wù)名稱=2
//進行縮容:docker service scale 服務(wù)名稱=1

//設(shè)置某個節(jié)點工作:docker node update --availability active 節(jié)點名
//設(shè)置某個節(jié)點暫時不工作(掛起): docker node update --availability pause 節(jié)點名
//設(shè)置某個節(jié)點不參加工作: docker node update --availability drain 節(jié)點名
//更新服務(wù):docker service update --image 172.16.1.30:5000/my_nginx:3.0(鏡像名) test2(服務(wù)名)
//自定義更新:
docker service update --image 172.16.1.30:5000/my_nginx:4.0 --update-parallelism 2 --update-delay 1m test2

//服務(wù)回滾: docker service update --rollback bdqn2


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

向AI問一下細節(jié)

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

AI