Swarm Cluster
Swarm cluster集群是一組運行Docker並加入到集群中的機器。之后可繼續執行docker命令,不過現在它們是由集群管理器在集群上執行。集群中的機器可以是物理的,也可以是虛擬的,加入集群后被稱為節點。
可以使用不同的策略來控制容器運行的節點。確保每台機器只獲得指定容器的一個實例。
節點類型
- managers
- workers
managers節點
- 是集群中唯一能夠執行命令的機器
- 維護集群狀態
- 調度services
- swarm 模式HTTP API端點
swarm 管理器使用 Raft 來實現維護整個 swarm 集群一致的內部狀態
如果是測試的目的可以只運行一個 swarm 管理節點。如果單管理器的 swarm 出問題下線了,服務仍然會運行,不過你需要創建一個新的集群來恢復它。
要利用 swarm 模式的容錯功能,建議創建奇數的管理節點。當有多個管理節點時,如果一個leader節點宕機,其余的manager節點將選擇一個新的leader,並恢復集群狀態的編排和維護。默認情況下,管理器節點也運行任務。
- 三個管理節點的 swarm 最大允許一個管理節點宕機
- 五個管理節點的 swarm 最大允許兩個管理節點宕機
- N 個管理節點的 swarm 最大允許(N-1)/2 個管理節點宕機
Docker 推薦最多創建 7 個管理節點
worker節點
Worker 節點是 Docker Engine 的實例,其唯一目的是運行容器。 Worker 節點不參與Raft 分布狀態,不作調度的決策或提供 swam 模式的 HTTP API 服務。
為了防止調度程序將任務放置在多節點集群中的管理器節點上,可以將manager節點的狀態設為Drain ,調度程序優雅地停止節點上的任務,並在活動節點上調度任務。調度程序不會將新任務分配給狀態為Drain的節點。
改變節點角色
當管理節點下線時可能會想把 worker 節點提升為管理節點,可以通過docker node promote 來把一個 worker 節點提升為管理節點 詳細信息
也可以把管理節點降級為worker節點 詳細信息
創建一個集群
啟動一個swarm manager節點
-
添加docker damon的網絡監聽
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock
-
初始化swarm manager節點
[root@localhost ~]# docker swarm init --advertise-addr 192.168.126.128 Swarm initialized: current node (ne4zc6ntfqi608w0svyd8u68h) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. [root@localhost ~]# --advertise-addr 允許集群中的其他節點訪問Swarmkit API和覆蓋網絡。swarm中的其他節點必須能夠訪問此地址。 以worker節點加入集群的命令可以通過 docker swarm join-token worker 獲得 以manager節點加入集群的命令可通過docker swarm join-token manager 獲得
- 將當前節點切換到群集模式。
- 創建一個名為default的集群。
- 指定當前節點為群集的leader manager節點。
- 用機器主機名命名節點。
- 將管理器配置為監聽端口2377上的活動網絡接口。
- 將當前節點設置為Active,這意味着它可以從調度程序接收任務。
- 為參與集群的引擎啟動內部分布式數據存儲,以維護集群及其上運行的所有服務的一致視圖。
- 默認情況下,為群集生成一個自簽名根CA。
- 默認情況下,為worker和manager節點生成令牌以加入集群。
- 創建一個名為ingress的覆蓋網絡,用於發布集群外部的服務端口。
- 為您的網絡創建一個覆蓋的默認IP地址和子網掩碼
2376 docker守護進程端口
2377 集群管理端口
添加一個工作節點
-
添加docker damon的網絡監聽 略
-
加入集群
[root@localhost ~]# docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377 This node joined a swarm as a worker. [root@localhost ~]#
docker swarm join命令執行以下操作
- 將當前節點上的Docker引擎切換到群集模式。
- 從管理器請求TLS證書
- 用機器主機名命名節點
- 基於swarm令牌在manager監聽地址上將當前節點連接到swarm。
- 將當前節點設置為活動可用性,這意味着它可以從調度程序接收任務。
- 將入口覆蓋網絡擴展到當前節點。
查看集群
-
在swarm manager節點執行
[root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION l2o08alsqh7az4d4tov1pwjcw localhost.localdomain Ready Active 18.09.6 ne4zc6ntfqi608w0svyd8u68h * localhost.localdomain Ready Active Leader 18.09.6
AVAILABILITY 表示調度程序是否可以將任務分配給節點
- Active 可以將任務分配給節點
- Pause 調度程序不向節點分配新任務,但現有的任務仍然運行
- Drain 調度程序不向節點分配新任務,已經存在的任務也將被調用到Active節點上
MANAGER STATUS
沒有值表示不參與群集管理的工作節點- Leader 為集群做出所有的集群管理和編排決策
- Reachable 表示節點參與Raft仲裁的manager節點。如果leader節點不可用,則該節點有資格成為新的leader
- Unavailable 表示節點是一個無法與其他manager通信的節點。如果manager節點變為此狀態應該加入一個新的manager節點到集群中,或者將一個工作節點提升為一個manager
查看節點詳細信息
-
docker node inspect
docker node inspect self --pretty (查看當前節點的詳細信息) [root@node1 ~]# docker node inspect i8so3iawiupkswhqsguiw7l91 --pretty ID: i8so3iawiupkswhqsguiw7l91 Hostname: node2 Joined at: 2019-06-11 04:46:29.827796972 +0000 utc Status: State: Ready Availability: Active Address: 192.168.49.136 Manager Status: Address: 192.168.49.136:2377 Raft Status: Reachable Leader: No Platform: Operating System: linux Architecture: x86_64 Resources: CPUs: 1 Memory: 1.777GiB Plugins: Log: awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog Network: bridge, host, macvlan, null, overlay Volume: local Engine Version: 18.09.6 TLS Info: TrustRoot: -----BEGIN CERTIFICATE----- MIIBaTCCARCgAwIBAgIUdZKOgCJWeabnUvO3g/aPe9dO040wCgYIKoZIzj0EAwIw EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTkwNjExMDMwNTAwWhcNMzkwNjA2MDMw NTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH A0IABCIrZHQWBQCOmVZ1wk3iz5dUSSinyK5+O/2kI/SP0dFhyYkV3fwQTIjRp3xg 5gHkosPXJzsWD28ozkV4Gmlx9gWjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBRBQ7wdTOzgK8zl15i4+GKYM2GJSDAKBggqhkjO PQQDAgNHADBEAiAtkLmwd2f7gADeyX82Yc/0KjJOmQnVQkOsZuP+rdVQjwIgLd52 yom4uvNZpJ7O3u7uNi/dO7fB5v8tGjZ+Vm3Ouo8= -----END CERTIFICATE----- Issuer Subject: MBMxETAPBgNVBAMTCHN3YXJtLWNh Issuer Public Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIitkdBYFAI6ZVnXCTeLPl1RJKKfIrn47/aQj9I/R0WHJiRXd/BBMiNGnfGDmAeSiw9cnOxYPbyjORXgaaXH2BQ==
更新節點屬性
- 改變節點可用性
- 添加或刪除標簽元數據
- 更改節點角色
改變節點可用性
- 清空管理節點,以便只執行swarm管理任務,並且無法進行任務分配。
- 清空一個節點,以進行維護。
- 暫停節點,使其無法接收新任務。
- 恢復不可用節點或暫停節點的可用狀態。
舉例:
[root@node1 ~]# docker node update --availability drain node1
node1
Add or remove label metadata
節點標簽提供了一種靈活的節點組織方法。可以再服務中使用節點標簽,以限制task分配的節點。
在manager節點上運行docker node update --label-add 向節點添加標簽元數據。--label-add支持
[root@node1 ~]# docker node update --label-add aaa --label-add bbb=222 --label-add ccc node1
node1
--label-add 可以多次使用
Promote or demote a node
可以將節點角色有worker節點升為manager節點,或者將manager節點降級為worker節點。
【注意】無論提升或降級節點的原因是什么,都必須始終維護集群中管理器節點的仲裁。
-
若要提升一個或一組節點,從manager節點運行docker node promote:
$ docker node promote node-3 node-2 Node node-3 promoted to a manager in the swarm. Node node-2 promoted to a manager in the swarm.
-
要降級一個或一組節點,從manager節點運行docker node demote:
$ docker node demote node-3 node-2 Manager node-3 demoted in the swarm. Manager node-2 demoted in the swarm.
脫離集群
-
在node節點執行
[root@localhost ~]# docker swarm leave Node left the swarm.
-
節點離開群集后,可以在manager點上運行docker節點rm命令,將節點從節點列表中刪除。
$ docker node rm node-2
集群配置完畢!
參考
https://docs.docker.com/engine/swarm/
https://blog.51cto.com/13555423/2310922