目錄
- 概述
- 創(chuàng)建和管理Swarm集群
- Swarm集群的服務部署實踐
1. 概述
Docker Swarm是原生的Docker集群工具。在Docker版本1.12之后,Docker引擎加入了Swarm模式,將Swarm集成進來。大多數(shù)用戶應該使用集成進Docker引擎的Swarm模式。單獨的Docker Swarm仍然可用,只是它沒有集成進Docker引擎的API和CLI命令當中。
隨著Docker的不斷開發(fā),在版本1.12之后,Docker引擎加入了Swarm模式,用戶可以通過原生的Docker CLI命令操作Swarm集群。
本篇使用的環(huán)境包括3個節(jié)點,一個作為Swarm的manager節(jié)點,兩個為worker節(jié)點,機器名和IP地址如下:
- centos7-Master: 192.168.71.131 (Swarm manager)
- centos7-WorkerA: 192.168.71.167 (Swarm worker)
- centos7-WorkerB: 192.168.71.168 (Swarm worker)
在三臺主機上,都安裝了Docker引擎1.12版,并且主機相互之間可以ping通,主機上的2377、7946、4789端口都打開。
Swarm集群端口, Docker Swarm集群開放了三個端口:
- 2377端口, 用于集群管理通信
- 7946端口, 用于集群節(jié)點之間的通信
- 4789端口, 用于overlay網(wǎng)絡流量
2. 創(chuàng)建Swarm集群
2.1 創(chuàng)建swarm管理節(jié)點
下面開始創(chuàng)建swarm。登錄到centos7主機上,執(zhí)行如下命令:
[root@centos7-Master ~]# docker swarm init --advertise-addr 192.168.71.131
Swarm initialized: current node (41atspd62he1vshs4jmhpyufj) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
192.168.71.131:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
--advertise-addr參數(shù)表示其它swarm中的worker節(jié)點使用此ip地址與manager聯(lián)系。命令的輸出包含了其它節(jié)點如何加入集群的命令。
如果你不知道或者忘記了Swarm Manager節(jié)點的Token信息, 你可以在Manager節(jié)點上執(zhí)行以下命令查看Worker節(jié)點連接所需要的Token信息。
[root@centos7-Master ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-35z0vriry09vkm17vn1tvj0wzmbv1xfy77c0po7c5op2lyhkgk-635ho8efqfhrm817gpyjkho9x \
192.168.202.15:2377
使用docker info和docker node ls查看集群中的相關(guān)信息:
[root@centos7-Master ~]# docker info
...
Swarm: active
NodeID: 41atspd62he1vshs4jmhpyufj
Is Manager: true
ClusterID: 5nl0kyz1dfmkgg2sx04vr8zoi
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
...
[root@centos7-Master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
41atspd62he1vshs4jmhpyufj * centos7 Ready Active Leader
node ID旁邊那個*號表示現(xiàn)在連接到這個節(jié)點上。
2.2 將Worker節(jié)點加入swarm集群
登錄到centos7-WorkerA主機上,執(zhí)行前面創(chuàng)建swarm時輸出的命令:
[root@centos7-workerA ~]# docker swarm join \
> --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
> 192.168.71.131:2377
This node joined a swarm as a worker.
如果當時創(chuàng)建swarm時沒有記下命令的輸出,可以通過在manager節(jié)點上運行docker swarm join-token worker命令來獲取如何加入swarm的命令。
在另一臺主機centos7-WorkerB上也執(zhí)行相同的命令,最后在manager節(jié)點上看一下集群節(jié)點的狀態(tài):
[root@centos7-Master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
0b57ews522yiz8xyhy3jz34ci centos7-WorkerB Ready Active
41atspd62he1vshs4jmhpyufj * centos7-Master Ready Active Leader
d1lurs40mlah70spbetcsl9rw centos7-WorkerA Ready Active
錯誤處理:
- 問題描述:
如果在添加Swarm集群節(jié)點時,出現(xiàn)錯誤“Error response from daemon: Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the
docker infocommand to see the current swarm status of your node."
- 原因分析:
由于Swarm集群中Manager節(jié)點中需要設置防火墻的訪問權(quán)限,將集群管理端口加入防火墻的訪問控制策略。
- 解決辦法:
在Manager節(jié)點主機的防火墻中加入端口的訪問控制策略。
2.3 管理Swarm集群
2.3.1 刪除Swarm集群節(jié)點
如果想在Docker Swarm集群中刪除Docker的節(jié)點, 需要在須刪除的Docker節(jié)點下執(zhí)行命令:
[root@centos7-WorkerA ~]# docker swarm leave
Node left the swarm.
在Docker Swarm集群中,在刪除Docker集群節(jié)點后,集群中該節(jié)點仍然存在,但是狀態(tài)顯示為Down, 需要在Swarm的Manager節(jié)點執(zhí)行以下命令, 刪除已經(jīng)移除的Worker節(jié)點:
[root@centos7-Master ~]# docker node rm --force 4ukr7ghj4iuvb89gu0g5ok1d
4ukr7ghj4iuvb89gu0g5ok1d
2.3.2 更新Swarm集群節(jié)點
如果需要對Docker Swarm節(jié)點進行更新,需要在manager節(jié)點上執(zhí)行命令:
[root@centos7-Master ~]# docker swarm update
Swarm updated.
3. Swarm集群的服務部署實踐
3.1 在Swarm中部署服務
在centos7-Master也就是manager節(jié)點上運行如下命令來部署服務:
[root@centos7-Master ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
50r6d8w4cwzi45s8865p9pdn4
參數(shù)說明:
-
--replicas參數(shù)指定啟動的服務由幾個實例組成; -
--name參數(shù)指定啟動服務的服務名; -
alpine ping docker.com指定了使用alpine鏡像創(chuàng)建服務,實例啟動時運行ping docker.com命令。
這與docker run命令是一樣的。
使用docker service ls查看正在運行服務的列表:
[root@centos7-Master ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
50r6d8w4cwzi helloworld 1/1 alpine ping docker.com
3.2 查詢Swarm中服務的信息
在部署了服務之后,登錄到manager節(jié)點,運行下面的命令來顯示服務的信息。參數(shù)--pretty使命令輸出格式化為可讀的格式,不加--pretty可以輸出更詳細的信息:
[root@centos7-Master ~]# docker service inspect --pretty helloworld
ID: 50r6d8w4cwzi45s8865p9pdn4
Name: helloworld
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: alpine
Args: ping docker.com
Resources:
使用命令docker service ps <SERVICE-ID>可以查詢到哪個節(jié)點正在運行該服務:
[root@centos7-Master ~]$ docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
541qk5jdrb71ypna9y5zw2l33 helloworld.1 alpine centos7-Master Running Running 12 minutes ago
3.3 在Swarm中動態(tài)擴展服務
登錄到manager節(jié)點,使用命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>來將服務擴展到指定的實例數(shù):
[root@centos7 ~]# docker service scale helloworld=5
helloworld scaled to 5
再次查詢服務的狀態(tài)列表:
[root@centos7-Master ~]$ docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
541qk5jdrb71ypna9y5zw2l33 helloworld.1 alpine centos7-Master Running Running 16 minutes ago
96s46qpl3qd94ntw3n2bt81m8 helloworld.2 alpine centos7-WorkerB Running Running 17 seconds ago
6p1u8hj4y31i4pjmwh8zvvf2h helloworld.3 alpine centos7-WorkerA Running Running 8 seconds ago
02jn1fxkx8juwizk6fjgv9r9n helloworld.4 alpine centos7-WorkerA Running Running 9 seconds ago
btbrvtnjjmgyb8emwmznziho9 helloworld.5 alpine centos7-Master Running Running 27 seconds ago
可見Swarm集群創(chuàng)建了4個新的task來將整個服務的實例數(shù)擴展到5個。這些服務分布在不同的Swarm節(jié)點上。
3.4 刪除Swarm集群中的服務
在manager節(jié)點上運行docker service rm helloworld便可以將服務刪除。刪除服務時,會將服務在各個節(jié)點上創(chuàng)建的容器一同刪除,而并不是將容器停止。
此外Swarm模式還提供了服務的滾動升級,將某個worker置為維護模式,及路由網(wǎng)等功能。在Docker將Swarm集成進Docker引擎后,可以使用原生的Docker CLI對容器集群進行各種操作,使集群的部署更加方便、快捷。
3.5 更新Swarm集群中的服務版本
在前面的步驟中, 我們擴展了一個服務的多個實例, 如上所示, 我們擴展了基于Tomcat Server 8.5.8的Docker鏡像。 假如,現(xiàn)在我們需要使用Tomcat Server 8.6.0版本做為Docker容器版本來替換原有的Tomcat Server 8.5.8版本。
- 在Swarm集群中的Manager節(jié)點上執(zhí)行操作,用于完成服務版本的更新。
[root@centos7-Master ~]# docker service update --image tomcat:8.6.0 tomcat-service
tomcat-service
服務版本更新計劃將按以下步驟執(zhí)行:
- 停止第一個任務
- 計劃對已停止任務的更新
- 啟動已更新任務的容器
- 如果任務更新返回“RUNNING”狀態(tài),等待指定的延遲時間后,停止下一個任務
- 如果在任務更新時,任務返回“FAILED”狀態(tài),將會暫停更新。
重新啟動一個暫停更新的服務, 可以使用docker service update <SERVICE-ID>命令, 例如:
[root@centos7-Master ~]# docker service update tomcat-service
- 查看服務版本更新結(jié)果
[root@centos7-Master ~]# docker service ps tomcat-service
3.6 停用Swarm集群中的服務節(jié)點
如果我們想要停止Swarm集群中某個服務的Worker節(jié)點, 我們可以使用docker node update --availability drain <Node-ID>來停止Worker節(jié)點上的服務。
[root@centos7-Master ~]# docker node update --availability drain centos7-WorkerA
centos7-WorkerA
在停止Worker節(jié)點上的服務后, 我們可以通過docker node inspect --pretty <Node-ID>查看節(jié)點狀態(tài)。
[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID: ayxx0k8p3hq04zjuemq6p43rq
Hostname: centos7-WorkerA
Joined at: 2016-12-26 07:07:13.422672934 +0000 utc
Status:
State: Ready
Availability: Drain
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 4
Memory: 3.703 GiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.5
使用docker service ps tomcat-service查看當前Tomcat啟動的集群信息。
[root@centos7-Master ~]# docker service ps tomcat-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2vmq4yc9rnsx4etb10z0oah66 tomcat-service.1 192.168.202.14:5000/centos-tomcat858:centos7 centos7-Master Running Running about an hour ago
6hjjuw1jp4037yt48cievtxt5 tomcat-service.2 192.168.202.14:5000/centos-tomcat858:centos7 centos7-Master Running Running 3 minutes ago
cpzh34flx1i7e9sksfr1dr3xu \_ tomcat-service.2 192.168.202.14:5000/centos-tomcat858:centos7 centos7-WorkerA Shutdown Shutdown 3 minutes ago
eaimtl1swkxrnqhs2h8clodrb tomcat-service.3 192.168.202.14:5000/centos-tomcat858:centos7 centos7-Master Running Running 3 minutes ago
54pdp8oj1ww2mtrw3ac3m0lwb \_ tomcat-service.3 192.168.202.14:5000/centos-tomcat858:centos7 centos7-WorkerA Shutdown Shutdown 3 minutes ago
如果我們需要重新啟用WorkerA的Swarm集群服務, 我們可以通過docker node update --availability active <NODE-ID>來實現(xiàn)對服務節(jié)點的啟用。
[root@centos7-Master ~]# docker node update --availability active centos7-WorkerA
centos7-WorkerA
[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID: ayxx0k8p3hq04zjuemq6p43rq
Hostname: centos7-WorkerA
Joined at: 2016-12-26 07:07:13.422672934 +0000 utc
Status:
State: Ready
Availability: Active
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 4
Memory: 3.703 GiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.5
當我們設置Swarm集群的Worker節(jié)點為可用時,它便能接收新的任務:
- 當服務需要進行擴展時
- 當對服務的版本進行更新時
- 當我們對停用另外一個Swarm集群節(jié)點時
- 當任務在另外一個活動狀態(tài)節(jié)點出現(xiàn)失敗時