1. 程式人生 > >Shell指令碼實現---Swarm叢集部署例項(Swarm Cluster)

Shell指令碼實現---Swarm叢集部署例項(Swarm Cluster)

Shell指令碼實現---Swarm叢集部署例項(Swarm Cluster)

一、機器環境(均是centos7.8)

IP hostname 角色
192.168.10.200 manager-swarm manager節點
192.168.10.201 node1-swarm node節點
192.168.10.202 node2-swarm node節點

1、設定主機名

在manager節點上 # hostnamectl --static set-hostname manager-swarm 在node1節點上 # hostnamectl --static set-hostname node1-swarm 在node2節點上 # hostnamectl --static set-hostname node2-swarm

2、相互域名解析(三臺機都執行)

[root@manager-swarm ~]# cat >> /etc/hosts << EOF
> 192.168.10.200 manager-swarm
> 192.168.10.201 node1-swarm
> 192.168.10.202 node2-swarm
> EOF
 

3、關閉三臺機器上的防火牆、selinux。

如果開啟防火牆,則需要在所有節點的防火牆上依次放行2377/tcp(管理埠)、7946/udp(節點間通訊埠)、4789/udp(overlay 網路埠)
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# sed  -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
 

4、在manager-swarm節點上傳公鑰

https://www.cnblogs.com/user-sunli/p/13889477.html  

二、部署安裝

# vim swarm_cluster_install.sh
#!bin/bash
#auther:sunli
#mail:<[email protected]>
manager=192.168.10.200
node1=192.168.10.201
node2=192.168.10.202
 
cat >> docker_install.sh << EOF
#/bin/bash
#auther:sunli
#mail:<[email protected]>
 
#下載國內docker源,並安裝
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
[ `echo $?` -ne 0 ] && echo "Please check your epel.repo" && exit
 
#配置阿里雲映象加速器
[ ! -d /etc/docker ] && mkdir /etc/docker
cat >> /etc/docker/daemon.json <<- EOF
{
"registry-mirrors": ["https://pf5f57i3.mirror.aliyuncs.com"]
}
EOF
 
#修改docker監聽埠
#Swarm是通過監聽2375埠進行通訊的,所以在使用Swarm進行叢集管理之前,需要設定一下2375埠的監聽。所有主機節點docker開啟2375,2377(swarm叢集)監聽,docker版本不同,配置方式不一樣
sed -i '/^ExecStart/ s#.*#& -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock#g' /usr/lib/systemd/system/docker.service
 
#啟動並設定開機自啟
systemctl enable docker
systemctl start docker
 
#拉取官方swarm映象
docker pull swarm
EOF
 
#用ansible給node節點傳遞指令碼並執行
[ ! -x /usr/bin/ansible ] && yum -y install ansible
cat >> /etc/ansible/hosts << EOF
[docker]
$node1
$node2
EOF
ansible docker -m script -a 'creates=/root/docker_install.sh /root/docker_install.sh'
sh /root/docker_install.sh
 
#建立swarm(要儲存初始化後token儲存至swarm_token.log
docker swarm init --advertise-addr $manager |tee swarm_token.log
 
#新增節點到swarm叢集中
swarm_token=$(sed -n '/--token/p' swarm_token.log)
ssh $node1 "$swarm_token"
ssh $node2 "$swarm_token"
 
#在manager-swarm輸出節點狀態
docker node ls

執行最後輸出:

   

三、日常運維中用到的Swarm相關命令

 
1) 初始化swarm manager並制定網絡卡地址
# docker swarm init --advertise-addr 182.48.115.237
 
2) 刪除叢集,強制退出需要加–force (針對manager節點). 到各個節點上執行退出叢集的命令
# docker node rm swarm-node1    
# docker swarm leave --force      //manager節點退出叢集,需要加--force
 
3) 檢視swarm worker的連線令牌
# docker swarm join-token worker
 
4)  加入docker swarm叢集,作為worker節點
利用上面3)執行結果中的命令放在其他節點上執行,則該節點加入到swarm叢集中作為worker節點
 
5) 檢視swarm manager的連線令牌
# docker swarm join-token manager
 
6) 加入docker swarm叢集,作為manager節點
利用上面5)執行結果中的命令放在其他節點上執行,則該節點加入到swarm叢集中作為manager管理節點,狀態為reachable.
 
備註:如果之前的leader狀態的manager管理節點掛了後(假如systemctl stop docker, 然後再systemctl start docker),
則新加入的manager節點狀態由reachable變為leader, 之前的manager節點狀態為unreachable.
 
7) 使舊令牌無效並生成新令牌
# docker swarm join-token --rotate
 
8) 檢視叢集中的節點
# docker node ls
 
9) 檢視叢集中節點資訊
# docker node inspect swarm-node1 --pretty
 
10) 排程程式可以將任務分配給節點
# docker node update --availability active swarm-node1
 
11) 排程程式不向節點分配新任務,但是現有任務仍然保持執行
# docker node update --availability pause swarm-node1
 
12) 排程程式不會將新任務分配給節點。排程程式關閉任何現有任務並在可用節點上安排它們. 也就是線下節點,不參與任務分配.
# docker node update --availability drain swarm-node1
 
13) 新增節點標籤
# docker node update --label-add label1 --label-add bar=label2 swarm-node1
 
14) 刪除節點標籤
# docker node update --label-rm label1 swarm-node1
 
15) 將worker節點升級為manager節點
# docker node promote swarm-node1
 
16) 將manager節點降級為worker節點
# docker node demote swarm-manager-node
 
17) 檢視服務列表
# docker service ls
 
18) 檢視服務的具體資訊
# docker service ps my-test
 
19) 建立一個不定義name,不定義replicas的服務. (如下的nginx是docker的nginx映象名稱,不是服務名稱)
# docker service create nginx
 
20) 建立一個指定name的服務
# docker service create --name my-nginx nginx
 
21) 建立一個指定name、run cmd的服務
# docker service create --name my-nginx nginx ping www.baidu.com
 
22) 建立一個指定name、version、run cmd的服務
# docker service create --name my-redis redis:3.0.6
# docker service create --name my-nginx nginx:1.8 /bin/bash
 
23) 建立一個指定name、port、replicas的服務
# docker service create --name my-nginx --replicas 3 -p 80:80 nginx
 
24) 為指定的服務更新一個埠
# docker service update --publish-add 80:80 my-nginx
 
25) 為指定的服務刪除一個埠
# docker service update --publish-rm 80:80 my-nginx
 
26) 將redis:3.0.6更新至redis:3.0.7
# docker service update --image redis:3.0.7 redis
 
27) 配置執行環境,指定工作目錄及環境變數
# docker service create --name my-nginx --env MYVAR=myvalue --workdir /data/www --user my_user nginx ping www.baidu.com
 
28) 建立一個my-nginx的服務
# docker service create --name my-nginx nginx ping www.baidu.com
 
29) 更新my-nginx服務的執行命令
# docker service update --args "ping www.baidu.com" my-nginx
 
30) 刪除一個服務
# docker service rm my-nginx
 
31) 在每個群組節點上執行web服務
# docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest
 
32) 建立一個overlay網路
# docker network create --driver overlay my-network
# docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 haha-network
 
33) 建立服務並將網路新增至該服務
# docker service create --name my-test --replicas 3 --network my-network redis
 
34) 刪除群組網路
# docker service update --network-rm my-network my-test
 
35) 更新群組網路
# docker service update --network-add haha-network my-test
 
36) 建立群組並配置cpu和記憶體
# docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx
 
37) 更改所分配的cpu和記憶體
# docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx
 
38) 建立服務時自定義的幾個引數
指定每次更新的容器數量
--update-parallelism
指定容器更新的間隔
--update-delay
定義容器啟動後監控失敗的持續時間
--update-monitor
定義容器失敗的百分比
--update-max-failure-ratio
定義容器啟動失敗之後所執行的動作
--update-failure-action
比如:建立一個服務並執行3個副本,同步延遲10秒,10%任務失敗則暫停
# docker service create --name mysql_5_6_36 --replicas 3 --update-delay 10s --update-parallelism 1 --update-monitor 30s --update-failure-action pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
 
39) 回滾至之前版本
# docker service update --rollback mysql
自動回滾
如果服務部署失敗,則每次回滾2個任務,監控20秒,回滾可接受失敗率20%
# docker service create --name redis --replicas 6 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest
 
40) 建立服務並將目錄掛在至container中
# docker service create --name mysql --publish 3306:3306 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
需要注意使用bind繫結宿主機目錄會帶來的風險
- 繫結的主機路徑必須存在於每個叢集節點上,否則會有問題;
- 排程程式可能會在任何時候重新安排執行服務容器,如果目標節點主機變得不健康或無法訪問;
- 主機繫結資料不可移植,當你繫結安裝時,不能保證你的應用程式開發方式與生產中的執行方式相同;
 
41) 新增swarm配置
# echo "this is a mysql config" | docker config create mysql -
 
42) 檢視配置
# docker config ls
 
檢視配置詳細資訊
# docker config inspect mysql
 
43) 刪除配置
# docker config rm mysql
 
44) 新增配置
# docker service update --config-add mysql mysql
 
45) 刪除配置
# docker service update --config-rm mysql mysql
 
46) 新增配置
# docker config create kevinpage index.html
 
47) 啟動容器的同時新增配置(target如果報錯,就使用dst或destination)
# docker service create --name nginx --publish 80:80 --replicas 3 --config src=kevinpage,target=/usr/share/nginx/html/index.html nginx

 

 

遇到問題記錄:

1、刪除節點報錯 Error response from daemon: rpc error: code = FailedPrecondition desc = node krngsansedm5pr6e6dziscs4e is not down and can't be removed 解決方法如下: -f 強制刪除 # docker node rm -f node1-swarm   2、新增節點報錯 Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one. 解決方法如下:根據提示先執行# docker swarm leave,再輸入work節點令牌 &nbs