91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行swam群集配置

發布時間:2021-10-12 10:56:30 來源:億速云 閱讀:133 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關如何進行swam群集配置,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

概述

    每一個宿主機(包括物理機與虛擬機)通常僅運行一個docker主進程(單宿主機可以配置為運行多個docker主進程,但截至18.09.6版本,這一功能仍處于實驗階段,且存在諸多問題尚未解決,生產環境中應避免以該方式部署)。默認情況下,多個宿主機上的docker主進程之間相互獨立,每個docker主進程僅可管理本地容器,稱為獨立容器( standalone container)模式。docker-ce自1.12版本起引入群集(swarm)模式,實現了docker主進程的集群化管理,包括容器分配,規模伸縮,負載均衡,更新回滾,以及網絡設置等功能。

節點(node)

    群集內包含一或多個運行于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個管理節點,以提供基本的可用性與容錯性。

服務(service)

    服務是swarm群集的主要操作對象,用于定義容器的期望運行狀態,包括容器運行所使用的鏡像與容器內部執行的命令,以及其他可配置的參數,如環境變量,開放端口,網絡模式,系統資源,掛載選項,回滾更新策略等。服務的狀態可以在命令行或配置文件中指定,swarm調度器根據服務狀態的定義,將任務指派給可用的工作節點。

    服務分為2種運行模式:副本(replicated)與全局(global)。副本模式在所有工作節點中運行指定數量的任務,每個可用的節點上運行的任務數量由調度器分配;全局模式則在每一個可用的工作節點上都運行一個任務,任務的數量依賴于可用節點的數量。某一特定的服務僅可運行于兩種模式之一,默認為副本模式。

任務(task)

    任務是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群集配置,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

成安县| 含山县| 扎鲁特旗| 大渡口区| 平舆县| 安丘市| 高州市| 饶河县| 容城县| 罗江县| 历史| 罗源县| 定日县| 玛纳斯县| 滦平县| 和林格尔县| 民勤县| 柳河县| 利辛县| 梁平县| 资阳市| 南江县| 三亚市| 黄陵县| 汉阴县| 定陶县| 宁陵县| 奉化市| 股票| 雷波县| 吉安县| 开鲁县| 察隅县| 化州市| 时尚| 屏山县| 仪征市| 卓尼县| 龙山县| 特克斯县| 龙南县|