您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何進行swam群集配置,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
每一個宿主機(包括物理機與虛擬機)通常僅運行一個docker主進程(單宿主機可以配置為運行多個docker主進程,但截至18.09.6版本,這一功能仍處于實驗階段,且存在諸多問題尚未解決,生產環境中應避免以該方式部署)。默認情況下,多個宿主機上的docker主進程之間相互獨立,每個docker主進程僅可管理本地容器,稱為獨立容器( standalone container)模式。docker-ce自1.12版本起引入群集(swarm)模式,實現了docker主進程的集群化管理,包括容器分配,規模伸縮,負載均衡,更新回滾,以及網絡設置等功能。
群集內包含一或多個運行于swarm模式的宿主機,每個宿主機稱為一個節點,分為2種角色等級:管理(manager)與工作(worker),具有相同角色的節點可以存在多個。角色可以在群集初始化時分配,或在群集初始化后更改。
管理節點負責群集管理,包括維持群集狀態,調度服務,以及處理swarm模式API調用(包括http請求與命令行接口),工作節點負責執行容器。除退出群集之外,非管理節點無法執行任何與群集、節點、服務相關的操作。默認情況下,管理節點同時也作為工作節點。swarm允許群集內僅存在單個管理節點,但不允許僅存在工作節點而無任一管理節點。
swarm調度器根據節點的可用性(availability)決定是否為某個節點指派任務,包括:
Active:節點期望接受新任務。
Pause:節點不期望接受新任務,但現存的任務仍將在當前節點繼續運行。
Drain:節點不期望接受新任務,現存的任務將被關閉,調度器重新分配相應數量的任務并指派至其他可用節點。
節點的可用性可以在群集初始化時指定,默認為Active,或在群集初始化后更改。
群集內包含多個管理節點時,僅其中一個為主管理節點,狀態為Leader,其他均為備用管理節點,狀態為Reachable。swarm通過Raft Consensus算法提供了管理節點的容錯機制,可以實現管理節點在失效配額內的自動選舉與切換功能。假設管理節點總數量為N,失效配額為M,則二者之間的關系為M = (N - 1) / 2,M的值向下取整。例如管理節點總數為5或6時,最多允許其中2個同時失效。失效的管理節點數量若在配額范圍內,則swarm將在其他管理狀態為Reachable的節點內自動選舉一個新的主管理節點;若超出配額范圍(包括僅存在單個管理節點的情況),則群集功能將不可用,必須手動重建群集以恢復故障。群集內容器的運行狀態不受管理節點失效的影響,除非所有節點(包括管理節點與工作節點)在物理層面不可用。
生產環境中應避免使用單管理節點群集,但管理節點之間執行的狀態同步操作會產生額外的網絡開銷。docker官方推薦管理節點數量應盡量為奇數,且最大值為7,以更好地發揮swarm的容錯功能。因此,群集內應至少部署3個管理節點,以提供基本的可用性與容錯性。
服務是swarm群集的主要操作對象,用于定義容器的期望運行狀態,包括容器運行所使用的鏡像與容器內部執行的命令,以及其他可配置的參數,如環境變量,開放端口,網絡模式,系統資源,掛載選項,回滾更新策略等。服務的狀態可以在命令行或配置文件中指定,swarm調度器根據服務狀態的定義,將任務指派給可用的工作節點。
服務分為2種運行模式:副本(replicated)與全局(global)。副本模式在所有工作節點中運行指定數量的任務,每個可用的節點上運行的任務數量由調度器分配;全局模式則在每一個可用的工作節點上都運行一個任務,任務的數量依賴于可用節點的數量。某一特定的服務僅可運行于兩種模式之一,默認為副本模式。
任務是swarm群集的原子性調度單元,容器從啟動到終止構成對應任務的整個生存周期。容器是任務的實例化,二者之間具有一一對應的關系,而與容器相關的操作由工作節點上的docker主進程完成,因此任務與節點之間同樣具有一一對應的關系。
任務經分配后,具有以下狀態,調度器根據這些狀態持續監視容器與節點的運行情況:
NEW:任務已初始化。
PENDING:任務已就緒,等待指派。
ASSIGNED:任務已指派至節點。
ACCEPTED:任務已被工作節點接受,等待執行。
PREPARING:節點正在準備執行任務。
STARTING:任務正在啟動。
RUNNING:任務正在運行。
COMPLETE:任務因執行成功而退出。
FAILED:任務因執行出錯而退出。
SHUTDOWN:任務被節點關閉。
REJECTED:任務被節點拒絕。
ORPHANED:任務已指派,但節點長時間不可達。
REMOVE:任務未終止,但與之相關聯的服務被移除,或減小規模。
容器啟動失敗或因錯誤而終止時,調度器將分配一個新的任務,并嘗試重新運行該容器。由于任務、節點與容器之間的對應關系,同一個任務只能運行在被指派的特定節點上,直到終止,而無法從一個節點轉移至另一節點。
本節以tomcat容器為例,簡述群集、服務與任務的基本管理。
宿主機3臺:dock_host_0(192.168.9.168/24),dock_host_1(192.168.9.169/24),dock_host_2(192.168.9.170/24),系統與軟件環境一致,均為全新最小化安裝,單物理網卡,操作系統版本CentOS Linux release 7.6.1810 (Core),內核版本3.10.0-957.12.2.el7.x86_64,關閉selinux與防火墻。docker為默認安裝,版本18.09.6,無其他額外設置。
基礎鏡像為最新版CentOS 7官方鏡像。
jdk環境以命名卷jdks的方式掛載至容器的/opt/jdks目錄。
源碼包jdk-8u212-linux-x64.tar.gz與apache-tomcat-8.5.40.tar.gz,位于宿主機的/opt/目錄。
tomcat環境位于容器的/opt/apps/app_0目錄。
群集的初始化包括創建(docker swarm init)與加入(docker swarm join),二者均開啟docker引擎的swarm模式。
1. 創建群集。
docker swarm init命令用于創建群集,并將自身節點設置為主管理角色。
宿主機docker_host_0創建群集,節點的管理狀態為Leader:
[root@docker_host_0 ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.168/24 [root@docker_host_0 ~]# [root@docker_host_0 ~]# uname -r 3.10.0-957.12.2.el7.x86_64 [root@docker_host_0 ~]# [root@docker_host_0 ~]# docker -v Docker version 18.09.6, build 481bc77156 [root@docker_host_0 ~]# [root@docker_host_0 ~]# docker swarm init Swarm initialized: current node (5h7m2fspnhtg0lr0x6d481qdr) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-434u94ack6bd9gwgxbvf2dqiw 192.168.9.168:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. [root@docker_host_0 ~]#
2. 查看節點屬性。
docker node ls命令用于查看群集內的節點屬性,包括:
ID:節點ID。
HOSTNAME:節點主機名。
STATUS:節點狀態,Ready表示該節點可用,Down表示該節點已退出群集,Unknown表示該節點與管理節點之間的session同步出錯。
AVAILABILITY:節點可用性(Active/Pause/Drain)。
MANAGER STATUS:管理狀態/角色,Leader表示主管理節點,Reachable表示備用管理節點,為空表示僅為工作節點。
ENGINE VERSION:docker引擎版本。
[root@docker_host_0 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr * docker_host_0 Ready Active Leader 18.09.6 [root@docker_host_0 ~]#
3. 查看群集的加入方式。
docker swarm join-token --rotate manager/worker命令用于查看或設置(--rotate)管理節點/工作節點加入群集時使用的token,輸出中包含docker主進程以相應角色加入群集的方式。
[root@docker_host_0 ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-381n4jpj6ur4il4k6qo0wifhq 192.168.9.168:2377 [root@docker_host_0 ~]# docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-434u94ack6bd9gwgxbvf2dqiw 192.168.9.168:2377 [root@docker_host_0 ~]#
4. 加入群集。
根據管理節點中docker swarm join-token manager/worker命令的輸出,分別將宿主機docker_host_1與docker_host_2以管理/工作角色加入群集。
[root@docker_host_1 ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.169/24 [root@docker_host_1 ~]# [root@docker_host_1 ~]# uname -r 3.10.0-957.12.2.el7.x86_64 [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker -v Docker version 18.09.6, build 481bc77156 [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-381n4jpj6ur4il4k6qo0wifhq 192.168.9.168:2377 This node joined a swarm as a manager. [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh * docker_host_1 Ready Active Reachable 18.09.6 [root@docker_host_1 ~]#
[root@docker_host_2 ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.170/24 [root@docker_host_2 ~]# [root@docker_host_2 ~]# uname -r 3.10.0-957.12.2.el7.x86_64 [root@docker_host_2 ~]# [root@docker_host_2 ~]# docker -v Docker version 18.09.6, build 481bc77156 [root@docker_host_2 ~]# [root@docker_host_2 ~]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-434u94ack6bd9gwgxbvf2dqiw 192.168.9.168:2377 This node joined a swarm as a worker. [root@docker_host_2 ~]# [root@docker_host_2 ~]# docker node ls Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager. [root@docker_host_2 ~]#
5. 設置節點角色。
docker node promote/demote命令用于對指定節點的角色進行升級/降級。
備用管理節點與主管理節點具有相同的群集操作權限。
提升docker_host_2節點的角色等級:
[root@docker_host_1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh * docker_host_1 Ready Active Reachable 18.09.6 rvomnj0q7aari989o3c4t6w02 docker_host_2 Ready Active 18.09.6 [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker node promote docker_host_2 Node docker_host_2 promoted to a manager in the swarm. [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh * docker_host_1 Ready Active Reachable 18.09.6 rvomnj0q7aari989o3c4t6w02 docker_host_2 Ready Active Reachable 18.09.6 [root@docker_host_1 ~]#
docker info命令可以查看群集相關的信息,包括是否開啟swarm模式,群集ID,管理節點數,節點總數,管理節點IP,當前節點角色/ID/IP等。
[root@docker_host_1 ~]# docker info ... Swarm: active NodeID: cos4ftcikaykcit9m15kqmvlh Is Manager: true ClusterID: odbfcfeayjogvdn34m3nruq2f Managers: 3 Nodes: 3 Default Address Pool: 10.0.0.0/8 SubnetSize: 24 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 10 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Force Rotate: 0 Autolock Managers: false Root Rotation In Progress: false Node Address: 192.168.9.169 Manager Addresses: 192.168.9.168:2377 192.168.9.169:2377 192.168.9.170:2377 ... [root@docker_host_1 ~]#
至此,群集內包含3個管理節點,docker_host_0為主管理節點,其余為備用管理節點。
1. 準備應用鏡像。
在docker_host_0中以dockerfile方式構建鏡像,名稱為tomcat_app:8.5.40。
設置tomcat:
server.xml中的pattern字段用于設置默認的訪問日志格式,更改為%A:%{local}p %a:%{remote}p,表示本端IP:端口 對端IP:端口,以區分訪問來源。
[root@docker_host_0 ~]# cd /opt/ [root@docker_host_0 opt]# [root@docker_host_0 opt]# ls apache-tomcat-8.5.40.tar.gz containerd jdk-8u212-linux-x64.tar.gz [root@docker_host_0 opt]# [root@docker_host_0 opt]# tar axf apache-tomcat-8.5.40.tar.gz [root@docker_host_0 opt]# [root@docker_host_0 opt]# sed -i 's/pattern="%h %l %u %t/pattern="%A:%{local}p %a:%{remote}p %t/' apache-tomcat-8.5.40/conf/server.xml [root@docker_host_0 opt]# [root@docker_host_0 opt]# sed -n '/pattern="%A:%/p' apache-tomcat-8.5.40/conf/server.xml pattern="%A:%{local}p %a:%{remote}p %t "%r" %s %b" /> [root@docker_host_0 opt]#
設置數據卷,用于掛載jdk環境:
[root@docker_host_0 opt]# docker volume create jdks jdks [root@docker_host_0 opt]# [root@docker_host_0 opt]# tar axf jdk-8u212-linux-x64.tar.gz -C /var/lib/docker/volumes/jdks/_data/ [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker volume ls DRIVER VOLUME NAME local jdks [root@docker_host_0 opt]#
設置dockerfile:
[root@docker_host_0 opt]# vi dockerfile-for-tomcat FROM centos:latest COPY apache-tomcat-8.5.40 /opt/apps/app_0 EXPOSE 8080 ENV JAVA_HOME /opt/jdks/jdk1.8.0_212 WORKDIR /opt/apps/app_0 CMD bin/catalina.sh run [root@docker_host_0 opt]#
編譯鏡像:
[root@docker_host_0 opt]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker build -f dockerfile-for-tomcat -t tomcat_app:8.5.40 . Sending build context to Docker daemon 219.1MB Step 1/6 : FROM centos:latest latest: Pulling from library/centos 8ba884070f61: Pull complete Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475 Status: Downloaded newer image for centos:latest ---> 9f38484d220f Step 2/6 : COPY apache-tomcat-8.5.40 /opt/apps/app_0 ---> 155b18437d11 Step 3/6 : EXPOSE 8080 ---> Running in 93fdd5ea8433 Removing intermediate container 93fdd5ea8433 ---> 1c2487ffdd9b Step 4/6 : ENV JAVA_HOME /opt/jdks/jdk1.8.0_212 ---> Running in 2ef953a36a71 Removing intermediate container 2ef953a36a71 ---> 459c7c25ccc2 Step 5/6 : WORKDIR /opt/apps/app_0 ---> Running in 8dc1cde1177e Removing intermediate container 8dc1cde1177e ---> 35af515cc94f Step 6/6 : CMD bin/catalina.sh run ---> Running in 6733ba74c3d0 Removing intermediate container 6733ba74c3d0 ---> 74df48f4f0fc Successfully built 74df48f4f0fc Successfully tagged tomcat_app:8.5.40 [root@docker_host_0 opt]# [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tomcat_app 8.5.40 74df48f4f0fc 5 seconds ago 216MB centos latest 9f38484d220f 2 months ago 202MB [root@docker_host_0 opt]#
2. 創建全局服務。
在節點docker_host_0上,以tomcat_app:8.5.40鏡像創建服務(docker service create),模式(--mode)為全局,名稱(--name)為webapp_g,掛載(--mount)數據卷,開放端口(-p/--publish)8080:
[root@docker_host_0 opt]# docker service create --name webapp_g --mount type=volume,src=jdks,dst=/opt/jdks --mode global -p 8080:8080 tomcat_app:8.5.40 image tomcat_app:8.5.40 could not be accessed on a registry to record its digest. Each node will access tomcat_app:8.5.40 independently, possibly leading to different nodes running different versions of the image. kp6qdrzoswljwfmiphh29pogv overall progress: 1 out of 3 tasks 5h7m2fspnhtg: running rvomnj0q7aar: No such image: tomcat_app:8.5.40 cos4ftcikayk: No such image: tomcat_app:8.5.40 ^COperation continuing in background. Use `docker service ps kp6qdrzoswljwfmiphh29pogv` to check progress. [root@docker_host_0 opt]#
3. 查看服務屬性。
docker service ls命令用于查看當前群集中運行的服務列表與相關信息,包括:
ID:服務ID。
NAME:服務名稱。
MODE:服務運行模式(global/replicated)。
REPLICAS:成功分配的任務數/請求分配的任務數。
IMAGE:鏡像名稱。
PORTS:開放端口與協議。
[root@docker_host_0 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS kp6qdrzoswlj webapp_g global 1/3 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_0 opt]#
4. 查看任務屬性。
docker service ps命令用于查看指定服務中的任務執行情況,包括:
ID:任務ID。
NAME:任務對應的容器名稱。
IMAGE:鏡像名稱。
NODE:任務指派的節點。
DESIRED STATE:任務的期望狀態。
CURRENT STATE:任務的當前狀態。
ERROR:錯誤信息。
PORTS:開放端口。
-f/--filter選項以鍵值對的方式過濾輸出,當前支持的鍵包括id/name/node/desired-state,分別對應以上參數。
[root@docker_host_0 opt]# docker service ps -f "node=docker_host_0" webapp_g ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ncd0lscuk5ts webapp_g.5h7m2fspnhtg0lr0x6d481qdr tomcat_app:8.5.40 docker_host_0 Running Running about a minute ago [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker service ps -f "node=docker_host_1" webapp_g ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS umkwfusbj5rt webapp_g.cos4ftcikaykcit9m15kqmvlh tomcat_app:8.5.40 docker_host_1 Ready Preparing 3 seconds ago bp49pjyqh6ku \_ webapp_g.cos4ftcikaykcit9m15kqmvlh tomcat_app:8.5.40 docker_host_1 Shutdown Rejected 3 seconds ago "No such image: tomcat_app:8.5…" qepo1tzhcz68 \_ webapp_g.cos4ftcikaykcit9m15kqmvlh tomcat_app:8.5.40 docker_host_1 Shutdown Rejected 8 seconds ago "No such image: tomcat_app:8.5…" 2gg2f0d8d3tk \_ webapp_g.cos4ftcikaykcit9m15kqmvlh tomcat_app:8.5.40 docker_host_1 Shutdown Rejected 15 seconds ago "No such image: tomcat_app:8.5…" rc41gutotc64 \_ webapp_g.cos4ftcikaykcit9m15kqmvlh tomcat_app:8.5.40 docker_host_1 Shutdown Rejected 21 seconds ago "No such image: tomcat_app:8.5…" [root@docker_host_0 opt]# [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker service ps -f "node=docker_host_2" webapp_g ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS k8iyvkp5iv14 webapp_g.rvomnj0q7aari989o3c4t6w02 tomcat_app:8.5.40 docker_host_2 Ready Rejected 1 second ago "No such image: tomcat_app:8.5…" wbxd2787npfl \_ webapp_g.rvomnj0q7aari989o3c4t6w02 tomcat_app:8.5.40 docker_host_2 Shutdown Rejected 5 seconds ago "No such image: tomcat_app:8.5…" tv7x0fl8qwpe \_ webapp_g.rvomnj0q7aari989o3c4t6w02 tomcat_app:8.5.40 docker_host_2 Shutdown Rejected 11 seconds ago "No such image: tomcat_app:8.5…" vatre7kv4ggt \_ webapp_g.rvomnj0q7aari989o3c4t6w02 tomcat_app:8.5.40 docker_host_2 Shutdown Rejected 16 seconds ago "No such image: tomcat_app:8.5…" xge3egwymkmj \_ webapp_g.rvomnj0q7aari989o3c4t6w02 tomcat_app:8.5.40 docker_host_2 Shutdown Rejected 22 seconds ago "No such image: tomcat_app:8.5…" [root@docker_host_0 opt]#
全局模式的服務在每一個可用節點上都運行一個任務實例,但docker_host_1與docker_host_2節點的本地與鏡像倉庫不存在tomcat_app:8.5.40鏡像,因此另2個任務實例一直因"No such image"錯誤而被節點拒絕(任務狀態為Rejected),隨后分配新的任務再次嘗試執行。
群集服務隱藏了容器的運行細節,對外表現為相同的形式。向任一節點發送請求均可訪問,即使指定的容器未運行在該節點,調度器會將傳入的連接分配至群集內成功運行的容器。
docker_host_0節點上的任務成功執行,指定的容器運行且端口已開啟:
[root@docker_host_0 opt]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8330cf1374db tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 4 minutes ago Up 4 minutes 8080/tcp webapp_g.5h7m2fspnhtg0lr0x6d481qdr.ncd0lscuk5tsvsdmcqse3vibm [root@docker_host_0 opt]# [root@docker_host_0 opt]# ss -atn | grep 8080 LISTEN 0 128 :::8080 :::* [root@docker_host_0 opt]#
docker_host_1與docker_host_2節點上的任務未成功執行,但端口依然開啟,且可提供訪問:
[root@docker_host_1 ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker_host_1 ~]# [root@docker_host_1 ~]# ss -atn | grep 8080 LISTEN 0 128 :::8080 :::* [root@docker_host_1 ~]# [root@docker_host_1 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.168:8080 200 [root@docker_host_1 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.169:8080 200 [root@docker_host_1 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.170:8080 200 [root@docker_host_1 ~]#
[root@docker_host_2 ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker_host_2 ~]# [root@docker_host_2 ~]# ss -atn | grep 8080 LISTEN 0 128 :::8080 :::* [root@docker_host_2 ~]# [root@docker_host_2 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.168:8080 200 [root@docker_host_2 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.169:8080 200 [root@docker_host_2 ~]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.170:8080 200 [root@docker_host_2 ~]#
5. 設置節點可用性。
docker swarm init/join命令的--availability選項用于在創建/加入群集時設置節點的可用性,默認為active。
docker node update命令用于設置指定節點的可用性(--availability "active"|"pause"|"drain"),標簽(--label-add/--label-rm)與角色(--role "worker"|"manager")
將docker_host_1節點的可用性更改為pause,docker_host_2節點的可用性更改為drain:
[root@docker_host_1 ~]# docker node update --availability pause docker_host_1 docker_host_1 [root@docker_host_1 ~]# docker node update --availability drain docker_host_2 docker_host_2 [root@docker_host_1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh * docker_host_1 Ready Pause Reachable 18.09.6 rvomnj0q7aari989o3c4t6w02 docker_host_2 Ready Drain Reachable 18.09.6 [root@docker_host_1 ~]#
docker_host_1與docker_host_2節點因鏡像不存在而拒絕了任務,處于關閉狀態,因此將二者的節點可用性更改為pause與drain后,服務請求分配的任務數從3變為1,先前失敗的2個任務不再嘗試執行,結果為僅docker_host_1節點上運行了1個任務(容器)。
[root@docker_host_0 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS kp6qdrzoswlj webapp_g global 1/1 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker service ps -f 'desired-state=running' webapp_g ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ncd0lscuk5ts webapp_g.5h7m2fspnhtg0lr0x6d481qdr tomcat_app:8.5.40 docker_host_0 Running Running 40 minutes ago [root@docker_host_0 opt]#
6. 節點角色降級。
將docker_host_1與docker_host_2節點的角色降級為非管理節點:
[root@docker_host_0 opt]# docker node demote docker_host_1 Manager docker_host_1 demoted in the swarm. [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker node demote docker_host_2 Manager docker_host_2 demoted in the swarm. [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr * docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh docker_host_1 Ready Pause 18.09.6 rvomnj0q7aari989o3c4t6w02 docker_host_2 Ready Drain 18.09.6 [root@docker_host_0 opt]#
7. 退出群集。
退出群集是非管理節點有權限執行的唯一群集相關操作,包括docker swarm leave命令與POST /swarm/leave接口,二者效果相同。執行退出操作后,swarm模式隨之關閉。
docker守護進程默認監聽在本地的UNIX域套接字/var/run/docker.sock。
docker_host_1節點通過命令行接口退出群集:
[root@docker_host_1 ~]# docker swarm leave Node left the swarm. [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker info -f '{{.Swarm}}' { inactive false [] 0 0 <nil>} [root@docker_host_1 ~]#
docker_host_2節點執行HTTP API退出群集:
[root@docker_host_2 ~]# curl -0 -i -X POST --unix-socket /var/run/docker.sock http:/swarm/leave HTTP/1.0 200 OK Api-Version: 1.39 Docker-Experimental: false Ostype: linux Server: Docker/18.09.6 (linux) Date: Fri, 24 May 2019 05:04:55 GMT Content-Length: 0 [root@docker_host_2 ~]# docker info -f '{{.Swarm}}' { inactive false [] 0 0 <nil>} [root@docker_host_2 ~]#
退出群集后,相應節點的信息條目仍然存在,但狀態變為Down:
[root@docker_host_0 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr * docker_host_0 Ready Active Leader 18.09.6 cos4ftcikaykcit9m15kqmvlh docker_host_1 Down Pause 18.09.6 rvomnj0q7aari989o3c4t6w02 docker_host_2 Down Drain 18.09.6 [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker info -f '{{.Swarm.Nodes}}' 3 [root@docker_host_0 opt]#
8. 移除節點。
docker node rm命令用于從群集內移除指定節點。
將docker_host_1與docker_host_2節點從群集內移除:
[root@docker_host_0 opt]# docker node rm docker_host_1 docker_host_1 [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker node rm docker_host_2 docker_host_2 [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr * docker_host_0 Ready Active Leader 18.09.6 [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker info -f '{{.Swarm.Nodes}}' 1 [root@docker_host_0 opt]#
9. 移除服務。
docker service rm命令用于從群集內移除指定的服務。
將webapp_g服務從群集內移除:
[root@docker_host_0 opt]# docker service rm webapp_g webapp_g [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker_host_0 opt]#
將宿主機docker_host_1與docker_host_2重新以管理角色加入群集:
[root@docker_host_0 opt]# docker swarm join-token --rotate manager Successfully rotated manager join token. To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.168:2377 [root@docker_host_0 opt]#
[root@docker_host_1 ~]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.168:2377 This node joined a swarm as a manager. [root@docker_host_1 ~]# [root@docker_host_1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 upn0vc4vx47224gxaxn6hwec9 * docker_host_1 Ready Active Reachable 18.09.6 [root@docker_host_1 ~]#
[root@docker_host_2 ~]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.168:2377 This node joined a swarm as a manager. [root@docker_host_2 ~]# [root@docker_host_2 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 upn0vc4vx47224gxaxn6hwec9 docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z * docker_host_2 Ready Active Reachable 18.09.6 [root@docker_host_2 ~]#
至此,群集內仍保持3個管理節點,docker_host_0為主管理節點。
1. 導入鏡像。
在docker_host_0節點上將鏡像tomcat_app:8.5.40打包,并傳輸至docker_host_1與docker_host_2節點:
[root@docker_host_0 opt]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tomcat_app 8.5.40 74df48f4f0fc About an hour ago 216MB centos latest 9f38484d220f 2 months ago 202MB [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker image save tomcat_app:8.5.40 -o tomcat_app.tar [root@docker_host_0 opt]# [root@docker_host_0 opt]# ll -h tomcat_app.tar -rw------- 1 root root 214M May 24 05:28 tomcat_app.tar [root@docker_host_0 opt]# [root@docker_host_0 opt]# scp tomcat_app.tar root@192.168.9.169:/opt tomcat_app.tar 100% 214MB 78.5MB/s 00:02 [root@docker_host_0 opt]# scp tomcat_app.tar root@192.168.9.170:/opt tomcat_app.tar 100% 214MB 96.0MB/s 00:02 [root@docker_host_0 opt]#
在docker_host_1與docker_host_2節點上分別導入鏡像,并設置jdk環境所需的數據卷:
[root@docker_host_1 ~]# cd /opt/ [root@docker_host_1 opt]# [root@docker_host_1 opt]# ls containerd jdk-8u212-linux-x64.tar.gz tomcat_app.tar [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker image load -i tomcat_app.tar d69483a6face: Loading layer 209.5MB/209.5MB 59eb00de447b: Loading layer 14.39MB/14.39MB Loaded image: tomcat_app:8.5.40 [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tomcat_app 8.5.40 74df48f4f0fc About an hour ago 216MB [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker volume create jdks jdks [root@docker_host_1 opt]# [root@docker_host_1 opt]# tar axf jdk-8u212-linux-x64.tar.gz -C /var/lib/docker/volumes/jdks/_data/ [root@docker_host_1 opt]#
[root@docker_host_2 ~]# cd /opt/ [root@docker_host_2 opt]# [root@docker_host_2 opt]# ls containerd jdk-8u212-linux-x64.tar.gz tomcat_app.tar [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker image load -i tomcat_app.tar d69483a6face: Loading layer 209.5MB/209.5MB 59eb00de447b: Loading layer 14.39MB/14.39MB Loaded image: tomcat_app:8.5.40 [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tomcat_app 8.5.40 74df48f4f0fc About an hour ago 216MB [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker volume create jdks jdks [root@docker_host_2 opt]# [root@docker_host_2 opt]# tar axf jdk-8u212-linux-x64.tar.gz -C /var/lib/docker/volumes/jdks/_data/ [root@docker_host_2 opt]#
2. 創建副本服務。
docker service create命令不指定--mode選項,則默認創建副本模式的服務,且數量為1。
以副本模式執行tomcat_app:8.5.40鏡像,數量(--replicas)為3,名稱為webapp_d:
[root@docker_host_1 opt]# docker service create --name webapp_d --mount type=volume,src=jdks,dst=/opt/jdks --replicas 3 -p 8080:8080 tomcat_app:8.5.40 image tomcat_app:8.5.40 could not be accessed on a registry to record its digest. Each node will access tomcat_app:8.5.40 independently, possibly leading to different nodes running different versions of the image. hmhqo34e46m1syf4eoawre3fx overall progress: 3 out of 3 tasks 1/3: running 2/3: running 3/3: running verify: Service converged [root@docker_host_1 opt]#
任務被平均指派至3個節點并成功運行:
[root@docker_host_1 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hmhqo34e46m1 webapp_d replicated 3/3 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker service ps webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS e2eynnrned2j webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 6 minutes ago nd8qg74l4t7b webapp_d.2 tomcat_app:8.5.40 docker_host_2 Running Running 6 minutes ago e2ef0oc66sqh webapp_d.3 tomcat_app:8.5.40 docker_host_0 Running Running 6 minutes ago [root@docker_host_1 opt]#
3. 更改節點可用性(pause)。
將docker_host_2節點的可用性更改為pause:
[root@docker_host_1 opt]# docker node update --availability pause docker_host_2 docker_host_2 [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 upn0vc4vx47224gxaxn6hwec9 * docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z docker_host_2 Ready Pause Reachable 18.09.6 [root@docker_host_1 opt]#
docker_host_2節點上正在運行的任務仍繼續運行:
[root@docker_host_1 opt]# docker service ps webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS e2eynnrned2j webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 15 minutes ago nd8qg74l4t7b webapp_d.2 tomcat_app:8.5.40 docker_host_2 Running Running 15 minutes ago e2ef0oc66sqh webapp_d.3 tomcat_app:8.5.40 docker_host_0 Running Running 15 minutes ago [root@docker_host_1 opt]#
4. 更改副本規模。
docker service scale命令用于更改副本服務的運行數量,參數格式為服務名或ID=值,指定的值為最終運行的副本數量,可以增大或減小。
將服務的副本數量設置為6:
[root@docker_host_1 opt]# docker service scale webapp_d=6 webapp_d scaled to 6 overall progress: 6 out of 6 tasks 1/6: running 2/6: running 3/6: running 4/6: running 5/6: running 6/6: running verify: Service converged [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hmhqo34e46m1 webapp_d replicated 6/6 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_1 opt]#
docker_host_2節點的可用性為pause,因此不再接受新的任務,新增的3個任務被指派至另2個節點:
[root@docker_host_1 opt]# docker service ps webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS e2eynnrned2j webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 21 minutes ago nd8qg74l4t7b webapp_d.2 tomcat_app:8.5.40 docker_host_2 Running Running 21 minutes ago e2ef0oc66sqh webapp_d.3 tomcat_app:8.5.40 docker_host_0 Running Running 21 minutes ago 67mfqjvqgi7b webapp_d.4 tomcat_app:8.5.40 docker_host_0 Running Running 2 minutes ago qrdqrzm2f6si webapp_d.5 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago mejk0zee8ovy webapp_d.6 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago [root@docker_host_1 opt]#
5. 更改節點可用性(drain)。
將docker_host_2節點的可用性更改為drain:
[root@docker_host_1 opt]# docker node update --availability drain docker_host_2 docker_host_2 [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Ready Active Leader 18.09.6 upn0vc4vx47224gxaxn6hwec9 * docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z docker_host_2 Ready Drain Reachable 18.09.6 [root@docker_host_1 opt]#
副本總數未改變,但docker_host_2節點上先前運行的任務(nd8qg74l4t7b)被關閉,新的任務(tuuq6q1tlcib)被指派至docker_host_0節點,結果為docker_host_0與docker_host_1節點各自運行3個任務:
[root@docker_host_1 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hmhqo34e46m1 webapp_d replicated 6/6 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker service ps webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS e2eynnrned2j webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 28 minutes ago tuuq6q1tlcib webapp_d.2 tomcat_app:8.5.40 docker_host_0 Running Running 13 seconds ago nd8qg74l4t7b \_ webapp_d.2 tomcat_app:8.5.40 docker_host_2 Shutdown Shutdown 15 seconds ago e2ef0oc66sqh webapp_d.3 tomcat_app:8.5.40 docker_host_0 Running Running 28 minutes ago 67mfqjvqgi7b webapp_d.4 tomcat_app:8.5.40 docker_host_0 Running Running 9 minutes ago qrdqrzm2f6si webapp_d.5 tomcat_app:8.5.40 docker_host_1 Running Running 9 minutes ago mejk0zee8ovy webapp_d.6 tomcat_app:8.5.40 docker_host_1 Running Running 9 minutes ago [root@docker_host_1 opt]#
docker_host_2節點上的容器退出,但端口依然開放,且可對外提供訪問:
[root@docker_host_2 opt]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50187866b04e tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 36 minutes ago Exited (143) 8 minutes ago webapp_d.2.nd8qg74l4t7b2oju7bzs9qsk1 [root@docker_host_2 opt]# [root@docker_host_2 opt]# ss -atn | grep 8080 LISTEN 0 128 :::8080 :::* [root@docker_host_2 opt]#
[root@docker_host_1 opt]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.170:8080 200 [root@docker_host_1 opt]#
至此,群集內依然保持3個管理節點,docker_host_0為主管理節點。
3個管理節點的失效配額為(3 - 1) / 2 = 1,若失效數量若小于或等于配額,則swarm自動執行選舉與切換;若超出配額范圍,則須手動強制重建群集(docker swarm init -f/--force)。
出現故障時,需要查看群集、節點、服務、任務等信息,結合命令行輸出與日志對故障原因進行定位。CentOS 7下的docker日志文件默認為/var/log/message,可設置為單獨的文件,參考docker CE on Linux示例淺析(一)安裝與基本運行。
管理節點的/var/lib/docker/swarm/目錄用于保存群集狀態與管理日志,可以按備份目錄-導入目錄-重建群集的步驟執行故障恢復。docker官方建議備份與導入操作在docker主進程停用后執行。
1. 故障模擬。
將主管理節點docker_host_0中的docker守護進程停止:
[root@docker_host_0 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr * docker_host_0 Ready Active Leader 18.09.6 upn0vc4vx47224gxaxn6hwec9 docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z docker_host_2 Ready Drain Reachable 18.09.6 [root@docker_host_0 opt]# [root@docker_host_0 opt]# systemctl stop docker [root@docker_host_0 opt]#
主管理角色自動切換至docker_host_2節點,群集相關的功能不受影響,但docker_host_0節點的狀態先后變為Unknown與Down,管理狀態變為Unreachable:
[root@docker_host_1 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Unknown Active Unreachable 18.09.6 upn0vc4vx47224gxaxn6hwec9 * docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z docker_host_2 Ready Drain Leader 18.09.6 [root@docker_host_1 opt]#
副本數量未改變,但先前運行在docker_host_0節點上的3個任務都被關閉,新分配的任務被指派至docker_host_1節點,結果為docker_host_1節點上運行了6個任務:
[root@docker_host_1 opt]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hmhqo34e46m1 webapp_d replicated 6/6 tomcat_app:8.5.40 *:8080->8080/tcp [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker service ps webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS e2eynnrned2j webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago wnrm2ndqjk7r webapp_d.2 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago tuuq6q1tlcib \_ webapp_d.2 tomcat_app:8.5.40 docker_host_0 Shutdown Running 16 minutes ago nd8qg74l4t7b \_ webapp_d.2 tomcat_app:8.5.40 docker_host_2 Shutdown Shutdown 16 minutes ago xazm6xhtji5d webapp_d.3 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago e2ef0oc66sqh \_ webapp_d.3 tomcat_app:8.5.40 docker_host_0 Shutdown Running 44 minutes ago oervwdwtj9ei webapp_d.4 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago 67mfqjvqgi7b \_ webapp_d.4 tomcat_app:8.5.40 docker_host_0 Shutdown Running 25 minutes ago qrdqrzm2f6si webapp_d.5 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago mejk0zee8ovy webapp_d.6 tomcat_app:8.5.40 docker_host_1 Running Running 2 minutes ago [root@docker_host_1 opt]#
將管理節點docker_host_2中的docker守護進程停止:
[root@docker_host_2 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Down Active Unreachable 18.09.6 upn0vc4vx47224gxaxn6hwec9 docker_host_1 Ready Active Reachable 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z * docker_host_2 Ready Drain Leader 18.09.6 [root@docker_host_2 opt]# [root@docker_host_2 opt]# systemctl stop docker [root@docker_host_2 opt]#
群集功能不可用,但仍可訪問運行中的容器:
[root@docker_host_1 opt]# docker node ls Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker service ls Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online. [root@docker_host_1 opt]# docker service ps webapp_g Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online. [root@docker_host_1 opt]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da48a25cf5b2 tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 13 minutes ago Up 13 minutes 8080/tcp webapp_d.4.oervwdwtj9eixi9ye225bfaqu 2cfc8b941397 tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 13 minutes ago Up 13 minutes 8080/tcp webapp_d.2.wnrm2ndqjk7r6couisn3jhuuv c419aa6ac995 tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 13 minutes ago Up 13 minutes 8080/tcp webapp_d.3.xazm6xhtji5dir6xed8gdmmim 577267e59128 tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 37 minutes ago Up 37 minutes 8080/tcp webapp_d.6.mejk0zee8ovyiukv2yxh88n4s bfa09130f72f tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" 37 minutes ago Up 37 minutes 8080/tcp webapp_d.5.qrdqrzm2f6siee5pz7a84p6gi 9c9455285a21 tomcat_app:8.5.40 "/bin/sh -c 'bin/cat…" About an hour ago Up About an hour 8080/tcp webapp_d.1.e2eynnrned2j9732uhf1v0dhi [root@docker_host_1 opt]# [root@docker_host_1 opt]# ss -atn | grep 8080 LISTEN 0 128 :::8080 :::* [root@docker_host_1 opt]# [root@docker_host_1 opt]# curl -I -o /dev/null -s -w %{http_code} 192.168.9.169:8080 200
2. 重建群集。
在docker_host_1節點上手動強制重建群集,并移除失效的docker_host_0與docker_host_2節點:
[root@docker_host_1 opt]# docker swarm init --force-new-cluster Swarm initialized: current node (upn0vc4vx47224gxaxn6hwec9) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-434u94ack6bd9gwgxbvf2dqiw 192.168.9.169:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 5h7m2fspnhtg0lr0x6d481qdr docker_host_0 Down Active 18.09.6 upn0vc4vx47224gxaxn6hwec9 * docker_host_1 Ready Active Leader 18.09.6 jekdpdzmwcxrdfsxaudzbdp2z docker_host_2 Unknown Drain 18.09.6 [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker node rm docker_host_0 docker_host_0 [root@docker_host_1 opt]# docker node rm docker_host_2 docker_host_2 [root@docker_host_1 opt]#
由于docker_host_1節點的/var/lib/docker/swarm/目錄保存了群集狀態數據,因此執行重建后,群集ID與先前一致(odbfcfeayjogvdn34m3nruq2f),表明并未創建新的群集。
[root@docker_host_1 opt]# ll /var/lib/docker/swarm/ total 8 drwxr-xr-x 2 root root 75 May 24 05:10 certificates -rw------- 1 root root 193 May 24 07:24 docker-state.json drwx------ 4 root root 55 May 24 05:10 raft -rw------- 1 root root 69 May 24 07:24 state.json drwxr-xr-x 2 root root 22 May 24 05:10 worker [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker info -f '{{.Swarm.Cluster.ID}}' odbfcfeayjogvdn34m3nruq2f [root@docker_host_1 opt]# [root@docker_host_1 opt]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.169:2377 [root@docker_host_1 opt]#
故障節點docker_host_0與docker_host_2強制脫離群集后,以管理角色重新加入:
[root@docker_host_0 opt]# systemctl start docker [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker swarm leave -f Node left the swarm. [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.169:2377 This node joined a swarm as a manager. [root@docker_host_0 opt]# [root@docker_host_0 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION i6jberxzc51hprbtgh94e1nzw * docker_host_0 Ready Active Reachable 18.09.6 upn0vc4vx47224gxaxn6hwec9 docker_host_1 Ready Active Leader 18.09.6 [root@docker_host_0 opt]#
[root@docker_host_2 opt]# systemctl start docker [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker swarm leave -f Node left the swarm. [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker swarm join --token SWMTKN-1-4nsmenxl72484akypkevpirfse35u2ouxusbgemzzkuz0otgyv-cav7ypxfv6hzuyz5hq7jvn87l 192.168.9.169:2377 This node joined a swarm as a manager. [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION i6jberxzc51hprbtgh94e1nzw docker_host_0 Ready Active Reachable 18.09.6 upn0vc4vx47224gxaxn6hwec9 docker_host_1 Ready Active Leader 18.09.6 sp544qzpe3ghr4ox6gvdv3ylo * docker_host_2 Ready Active Reachable 18.09.6 [root@docker_host_2 opt]#
群集恢復后,所有任務全部運行在docker_host_1節點:
[root@docker_host_2 opt]# docker service ps -f 'desired-state=running' webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS m9qad5jldkmf webapp_d.1 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago 43ycztehfjft webapp_d.2 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago eu49cks7twj1 webapp_d.3 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago pagn85s95a4l webapp_d.4 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago mep9zebz50be webapp_d.5 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago q8cetbu1lgpa webapp_d.6 tomcat_app:8.5.40 docker_host_1 Running Running 22 minutes ago [root@docker_host_2 opt]#
docker service update --force命令用于強制對群集任務進行負載均衡,該操作包括任務的停止與重新分配。
[root@docker_host_2 opt]# docker service update --force webapp_d webapp_d overall progress: 6 out of 6 tasks 1/6: running 2/6: running 3/6: running 4/6: running 5/6: running 6/6: running verify: Service converged [root@docker_host_2 opt]# [root@docker_host_2 opt]# docker service ps -f 'desired-state=running' webapp_d ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pezzriea1ql3 webapp_d.1 tomcat_app:8.5.40 docker_host_0 Running Running 35 seconds ago miehr525l161 webapp_d.2 tomcat_app:8.5.40 docker_host_2 Running Running 22 seconds ago ivo43js9eolh webapp_d.3 tomcat_app:8.5.40 docker_host_1 Running Running 13 seconds ago ool0tu1tyke3 webapp_d.4 tomcat_app:8.5.40 docker_host_1 Running Running 18 seconds ago unysta4y6woe webapp_d.5 tomcat_app:8.5.40 docker_host_0 Running Running 26 seconds ago j63gtlovl0k9 webapp_d.6 tomcat_app:8.5.40 docker_host_2 Running Running 31 seconds ago [root@docker_host_2 opt]#
以上就是如何進行swam群集配置,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。