用docker swarm搭建docker集群


前言

在項目中通常用高可用的方式部署多個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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM