前言 |
在項目中通常用高可用的方式部署多個web應用服務,如果web應用服務項目部署在IIS上面,通常用負載均衡指向多台IIS服務器來實現高可用;如果使用docker容器部署web應用服務項目,可以用k8s或者docker swarm來偏排容器,以容器集群的方式實現高可用。
本篇講述用docker swarm來實現docker集群編排。
使用負載均衡 + IIS方式的缺點:
web應用節點不能動態擴容。
當web應用節點掛掉之后,需要額外寫一個守護程序用來檢測web應用是否處於運行狀態, 如果web應用停止,由守護程序啟動web應用。
部署成本高,要一台一台的部署web應用。
使用docker swarm編排docker集群的優勢:
可以動態對web應用進行動態擴容。
由docker swarm來監控docker節點是否可用,如果docker節點出故障不可用,docker swarm會創建一新的docker節點來代替出故障的docker節點。
不需要到每一台服務器去部署web應用服務,用docker swarm的service命令一次性動態部署多個web應用服務。
docker swarm介紹 |
docker swarm 分為管理節點(manger node)、工作節點(work node)、服務(services),任務(Task)。
swarm可以包含一個或多個管理節點,一個或多個工作節點。
(1) 工作節點:運行docker的服務器。
工作節點接收管理節點的任務,並執行任務。
(2) 管理節點:
管理節點同時也是工作節點,維護集群的狀態。 管理節點分為首領管理節點與非首領管理節點,首領管理節點只有一個,非首領管理節點可以有多個。
當首領管理節點不可用時,docker swarm會選舉其中一個非首領管理節點為首領管理節點。當非首領管理節點接到命令時會將命令轉交給首領管理節點,首領管理節點會把命令執行於整個swarm集群。
如果工作點都掛掉只剩下一個管理節點,docker swarm仍然可以保持集群和服務的運行。
管理節點建議用奇數個,最好3個或5個,一般不超過5個,因為swarm內部是通過RAFT協議達成共識狀態,管理節點越多,越不容易達成共識。
(3) 服務:服務定義了swarm node上要執行的任務。
在管理節點上一行命令可以完成多個服務實例的創建,均衡的分配服務實例到工作節點。
swarm服務編排的主要功能是保證service在期望狀態下運行,當某個工作節點或工作節點中運行的服務實例掛掉時,管理節點會在其它某個可用的工作節點(包含管理節點)中創建一個新的服務實例,並始終保持可用服務實例的數量。
(4) 任務:運行在docker里面的容器,swarm集群里運行的各個服務實例的容器就是任務,比如5個webapi容器也叫5個任務。
dokcer swarm常用命令 |
# 創建網絡
docker network create -d overlay my-network
# 查看網絡
docker network ls
# 創建並啟動服務
docker service create image_name
docker service create -p 80:80 image_name
docker service create --replicas 5 image_name
docker service create --name your_service_name -p 8001:50001 --replicas 3 image_name
docker service create --name your_service_name --network my-network -p 8001:50001 --replicas 3 image-name
# 更新鏡像到某個版本,同時並發更新2個副本,每輪更新完之后間隔30秒
docker service update --image 鏡像名:版本號 --update-parallelism 2 --update-delay 30s 服務名
# 停止某個服務並刪除
docker service rm your_service_name
# 查看已經在運行的服務
docker service ls
# 查看某個服務運行狀態
docker service ps your_service_name
# 查看某個節點的運行狀態
docker node ps 主機名
# 增加和刪除DNS
docker service update --dns-add 131.10.23.63 your_service_name
docker service update --dns-rm 131.10.23.63 your_service_name
# 增加和刪除端口映射
docker service update --publish-add 80:80 your_service_name
docker service update --publish-rm 80:80 your_service_name
# 縮容和擴容
docker service scale your_service_name=2
docker service scale your_service_name=5
docker service update --replicas 6 your_service_name
# 查看一個或多個節頻數的詳細信息
docker service inspect your_service_name
# 檢查節點的可用性
docker node inspect --pretty node1
# 將節點設置為drain狀態,禁止在某個節點上運行service
docker node update --availability drain node_name
# 啟用被清空的節點
docker node update --availability active node_name
swarm集群搭建 |
第1步,准備工作
准備5台centos虛擬機,並在每台centos虛擬機上安裝好docker,各虛擬機要能相互ping通與訪問。
在其中一個虛擬機上安裝docker私有倉庫harbor,並上傳一個業務鏡像到harbor。
harbor安裝教程:https://www.cnblogs.com/yyee/p/13121272.html
5台centos虛擬機的主機名與 IP分別為:
主機名:yyee-centos-2,IP:192.168.0.102
主機名:yyee-centos-3,IP:192.168.0.103
主機名:yyee-centos-4,IP:192.168.0.104
主機名:yyee-centos-5,IP:192.168.0.105
主機名:yyee-centos-6,IP:192.168.0.106
yyee-centos-1這台虛擬機用來做harbor服務器。
harbor服務器地址為:https//192.168.0.101
(上傳到harbor的業務鏡像 eshop/demo1.mvcone)
第2步,初始化swarm
用主機名為:yyee-centos-2,IP為:192.168.0.102 的這台服務器來作為swarm集群的首領節點。
切換到yyee-centos-2服務器,初始化swarm:
docker swarm init --advertise-addr 192.168.0.102:2377 --listen-addr 192.168.0.102:2377
--advertise-addr 表示不論這台機器有多少個ip,swarm使用192.168.0.102這個ip,2377端口是swarm默認用的端口。
--listen-addr 表示swarm工作點節的監聽端口。
--advertise-addr跟--listen-addr兩個參數一定要寫。
執行初始化命令后,輸出工作節點的token信息:
Swarm initialized: current node (ogyj7zoooxuwvvrqac71vrh6q) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-4tl00cn536nw7gs3xef8ehw8n 192.168.0.102:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
(這個是工作節點的token信息)
這段信息是說當前節點現在是管理節點,使用docker swarm join-token manager 命令將當前節點加入到swarm集群並為首領導節點。
現在將當前管理節點加入swarm:
docker swarm join-token manager
將當前管理節點加入swarm后自動成了首領節點,輸出管理節點的 token信息:
To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-7wpqojsl3c6vgz2c137we4cf5 192.168.0.102:2377
(這個是管理節點的token信息)
對比兩次生成的 token可以看出,加入 swarm管理節點與加入 swarm工作節點的 token是不同的。
區分其它工作節點是加入到swarm中的管理節點還是加入到swarm中的工作節點,是在執行docker swarm join --token命令的時候以token來分區的,--token參數后面跟管理節點的token就加入管理節點,--token參數后面跟工作節點的token就加入工作節點。
第3步,將其它虛擬機加入swarm集群
按順序切換到yyee-centos-3到yyee-centos-6四台服務器,分別將這些節點加入到swarm管理節點或工作節點:
# 將yyee-centos-3加入管理節點 docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-7wpqojsl3c6vgz2c137we4cf5 192.168.0.102:2377 --advertise-addr 192.168.0.103:2377 --listen-addr 192.168.0.103:2377 # 將yyee-centos-4加入管理節點 docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-7wpqojsl3c6vgz2c137we4cf5 192.168.0.102:2377 --advertise-addr 192.168.0.104:2377 --listen-addr 192.168.0.104:2377 # 將yyee-centos-5加入工作節點 docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-4tl00cn536nw7gs3xef8ehw8n 192.168.0.102:2377 --advertise-addr 192.168.0.105:2377 --listen-addr 192.168.0.105:2377 # 將yyee-centos-6加入工作節點 docker swarm join --token SWMTKN-1-6aqpwmmhhzuo8tgvzn42aqww5woroccuhhli86q9en3b4yndt2-4tl00cn536nw7gs3xef8ehw8n 192.168.0.102:2377 --advertise-addr 192.168.0.106:2377 --listen-addr 192.168.0.106:2377
-- token 要加入的swarm管理節點token、ip、端口。
--advertise-addr 工作節點IP及口端。
--listen-add 工作節點的監聽 ip及端口。
切換到某個管理節點(非管理節點不可以執行docker node ls命令),查看swarm集群中的節點列表:
docker node ls
ID后面跟*號的,表示當前是在哪個節點上執行的docker nodel ls命令。
從信息中看出,有一個首領節點,兩個管理節點,兩個工作節點。
如果出現錯誤:Error response from daemon: rpc error: code = Unavailable desc = all SubConns are in TransientFailure ,需要關閉所有節點的防火牆或開放所有節點的2377端口。防火命令使用說明參考:https://www.cnblogs.com/yyee/p/13140188.html
# 關閉防火牆 systemctl stop firewalld.service systemctl disable firewalld.service # 或者開放端口 firewall-cmd --zone=public --add-port=2376/tcp --permanent firewall-cmd --zone=public --add-port=2377/tcp --permanent firewall-cmd --zone=public --add-port=7946/tcp --permanent firewall-cmd --zone=public --add-port=7946/udp --permanent firewall-cmd --zone=public --add-port=4789/udp --permanent # 重啟防火牆 firewall-cmd --reload
如果出現錯誤:Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid ,因為集群時間不一致導致的。
解決辦法:
1. 通過date命令查看各個主機的當前時間,發現時間不一致;
2. 需要在每個工作節點上同步時間;
3. 在manager節點(yyee-centos-1)上執行命令docker swarm leave --force 離開集群,然后docker swarm init重新初始化集群,然后worker節點加入集群,因為時間改變,證書失效,重新初始化生成證書。
在每個節點上執行:
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
然后重新初始化swarm,重新將工作節點加入到swarm。
第4步,提升或降級管理節點
提升工作節點為管理節點: docker node promote 節點ID
降級管理節點為工作節點: docker node demote 節點ID
提升與降級管理節點需要在管理節點上執行命令:
# 提升工作節點為管理節點 docker node promote 節點ID docker node promote vz0u0ao6k3zxksivuv6kkgftj #將yyee-centos-5 提升為管理節點 # 降級管理節點為工作節點 docker node demote 節點ID docker node demote vz0u0ao6k3zxksivuv6kkgftj #將yyee-centos-5 降級為工作節點
到這里swarm集群就搭建好了。
創建服務 |
使用 docker service create 命令創建服務
# docker service create --name 服務名稱 -p 對外端口:容器內部端口 --replicas 副本數量 鏡像名 docker service create --name my-mvcone -p 8001:50001 --replicas 3 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1
--name 服務名稱
--replicas 指定服務創建副本的個數。
192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 私有倉庫ip:端口/項目名稱/鏡像名
服務創建完成輸出 :
查看所有服務列表:
dokcer service ls
從服務列表信息看出,my-mvcone服務有三個副本。
查看服務狀態:
docker service ps my-mvcone
從服務狀態信息看出服務有三個實例在運行:
瀏覽服務運行結果:
服務擴容 |
給my-mvcone服務擴容到6個副本
docker service update --replicas 6 my-mvcone #或者用擴容別名命令 docker service scale my-mvcone=6
然后查看服務副本個數及服務狀態
#查看服務副本個數
docker service ls
#查看服務狀態
docker service ps my-mvcone
升級服務版本 |
當項目迭代升級,有新的版本發布的時候,需要將將 my-mvcone服務從舊版本升級到新版本。
執行服務更新命令,將my-mvcone服務從v1.0.1升級到v1.0.2:
# 更新鏡像到某個版本,同時並發更新2個副本,每輪更新完之后間隔30秒 docker service update --image 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.2 --update-parallelism 2 --update-delay 30s my-mvcone
升級到 v1.0.2版本之后:
服務升級完成,從v1.0.1升級到了v1.0.2 。
更新回滾 |
如果更新后效果不理想,可以通過 --rollback 快速恢復到更新之前的狀態。
docker service update my_mveone --rollback
回滾加 --rollback參數。
退出swarm集群 |
將某個工作節點退出swarm集群。
docker swarm leave
或
docker swarm leave --force