(一)項目案例
1、準備主機
(1)關閉防火墻,或者開放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于節點之間的通信)、UDP端口4789(用于overlay網絡流量監控)
(2)安裝docker
(3)設置靜態ip
(4)修改主機名
2、創建Swarm集群
(1)主節點創建新的Swarm集群
[root@manager01 ~]# docker swarm init --advertise-addr 192.168.75.129
Swarm initialized: current node (y8rm15jh2qs5e3qsh6n13cxfh) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-48xia8024q8de6jxhca3whxenfeayo7hx8tdvg7lb1c28i4zfo-e8m7203crmlpwsmdfn3afyyss 192.168.75.129:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
(2)第一個工作節點加入集群
[root@worker01 ~]# docker swarm join --token SWMTKN-1-48xia8024q8de6jxhca3whxenfeayo7hx8tdvg7lb1c28i4zfo-e8m7203crmlpwsmdfn3afyyss 192.168.75.129:2377
(3)第二個工作節點加入集群
[root@worker02 ~]# docker swarm join --token SWMTKN-1-48xia8024q8de6jxhca3whxenfeayo7hx8tdvg7lb1c28i4zfo-e8m7203crmlpwsmdfn3afyyss 192.168.75.129:2377
This node joined a swarm as a worker.
(4)查看集群節點信息
[root@manager01 ~]# docker info
3、查看節點信息
[root@manager01 ~]# docker node inspect worker01 --pretty
注:
(1)STATUS列表示節點當前狀態,Ready表示正常,Down表示已宕機
(2)AVAILABILITY列表示該節點的可用性狀態,有3種狀態
- 活動(Active):調度器能夠安排任務到該節點。
- 暫停(Pause):調度器不能安排任務到該節點。但是已經存在的任務會繼續運行
- 候選者(Drain):調度器不能安排任務到該節點,且會停止已存在的任務,并將這些任務分配到其他處于活動狀態的節點中。
(3)MANAGER STATUS列表示管理器狀態,共有以下4中狀態
- 領導者(Leader):為Swarm集群做出所有管理和編排的主要管理器節點
- 候選者(Reachable):如果領導節點變為不可用,則候選者節點有資格成為新的領導者節點。
- 不可用(Unavailable):該節點不能和其他管理節點產生任何聯系,這種情況下,應該添加一個新的管理器節點到集群中,或者將一個工作節點升級為管理器節點。
- 空白:表明該節點是工作者節點
4、讓節點脫離集群
(1)在工作節點執行,使worker02脫離集群,要在worker02主機上執行
[root@worker02 ~]# docker swarm leave
(2)在主節點查看worker02的信息,并刪除該節點
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
y8rm15jh2qs5e3qsh6n13cxfh * manager01 Ready Active Leader 23.0.2
f0aw8dor6hlkth9kzy4m3k0vt worker01 Ready Active 23.0.2
xjpsue874nrm0hm3tw39mvwhl worker02 Down Active 23.0.2
[root@manager01 ~]# docker node rm worker02
worker02
[root@manager01 ~]#
5、讓節點以管理器角色加入集群
(1)獲取加入管理角色的命令
[root@manager01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:docker swarm join --token SWMTKN-1-48xia8024q8de6jxhca3whxenfeayo7hx8tdvg7lb1c28i4zfo-3davlb9zjkr6gvvkrtu8mz3w2 192.168.75.129:2377[root@manager01 ~]#
(2)worker02加入集群的管理節點
[root@worker02 ~]# docker swarm join --token SWMTKN-1-48xia8024q8de6jxhca3whxenfeayo7hx8tdvg7lb1c28i4zfo-3davlb9zjkr6gvvkrtu8mz3w2 192.168.75.129:2377
(3)查看集群節點信息
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
y8rm15jh2qs5e3qsh6n13cxfh * manager01 Ready Active Leader 23.0.2
f0aw8dor6hlkth9kzy4m3k0vt worker01 Ready Active 23.0.2
pgm7vq62akim0ms9kz8duguru worker02 Ready Active Reachable 23.0.2
[root@manager01 ~]#
6、降級和升級節點
(1)在管理節點降級為工作節點,在管理節點執行
[root@worker02 ~]# docker node demote worker02
(2)在工作節點升級為管理節點,在工作節點執行
[root@worker02 ~]# docker node promote worker02
(二)Docker Swarm 集群部署和管理服務
1、將服務部署到Swarm集群中
(1)創建服務
# docker service create --name swarm-web01 nginx
(2)使用docker service ls 命令查看正在運行的服務列表
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r5wx100nb2t6 swarm-web01 replicated 1/1 nginx:latest
REPLICAS列為m/n:n代表副本數,m代表正在運行的副本
(3)使用 docker service ps 命令查看顯示任務列表信息,查看每個副本運行節點的狀態信息
[root@master01 ~]# docker service ps swarm-web01
(4)使用docker service inspect 顯示有關服務的詳細信息,–pretty選項表示易于閱讀的格式
[root@master01 ~]# docker service inspect --pretty swarm-web01ID: r5wx100nb2t6vrtdsobnc1deg #服務ID
Name: swarm-web01 #服務名稱
Service Mode: Replicated #服務模式,這里為復制模式Replicas: 1 #副本數
Placement: #服務配置
UpdateConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Update order: stop-first
RollbackConfig: #回滾配置Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Rollback order: stop-first
ContainerSpec: #容器定義Image: nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Init: false
Resources:
Endpoint Mode: vip #端點模式
2、伸縮服務
(1)增加服務副本數
# docker service scale swarm-web01=5
查看任務列表(管理節點)
# docker service ps swarm-web01
(2)減少文件副本數
# docker service scale swarm-web01=3
3、刪除swarm服務
# docker service rm swarm-web01
4、對服務的任務進行滾動更新
(1)部署nginx到集群中,并配置8秒的更新延遲策略
# docker service create --replicas 3 --name my-web01 --update-delay 8s nginx
–update-delay 選項用于配置更新一個或多個任務之間的延遲時間,時間可以使用的單位有秒(s)、分鐘(min)或小時(h)、還可以組合使用更多單位的時間,如5min30s,表示延遲5分鐘30秒
默認情況下,調度器一次更新一個任務,可以通過 --update-parallelism 選項來配置調度器同事(并發)更新的最大服務任務數。
默認情況下,當對單個任務的更新完成并返回運行狀態時,調度器會調度另一個任務來更新,直到所有任務被更新。如果在任務更新期間的任何時間都返回失敗(FAILED)狀態,則調度器會暫停更新。可以使用 --update-failure-action 選項來控制 docker service create 或 docker service update 命令的行為。
(2)查看my-web01服務的詳細信息
[root@master01 ~]# docker service inspect my-web01 --prettyID: c5k770ixaswchg3p96lsh9g3p
Name: my-web01
Service Mode: ReplicatedReplicas: 3
Placement:
UpdateConfig: #更新配置Parallelism: 1 #同時更新的最大任務數Delay: 8s #更新之間的延遲操作時間On failure: pause #更新失敗后的操作Monitoring Period: 5s #每個任務更新后的延遲時間Max failure ratio: 0 #更新期間容許的失敗率Update order: stop-first #更新順序
RollbackConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Rollback order: stop-first
ContainerSpec: #容器定義Image: nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Init: false
Resources:
Endpoint Mode: vip
(3)使用 docker service update 命令更新容器鏡像
# docker service update --image nginx:latest my-web01
(4)手動回滾到前一個版本
# docker service update --rollback my-web01
(三)配置和管理Docker Swarm網絡
1、創建自定義overlay網絡
# docker network create -d overlay nginx-net01
查看創建的overlay網絡
# docker network ls
2、將swarm服務連接到自定義overlay網絡
部署服務時,如果不使用 --network 選項顯示聲明,則服務將連接到默認的ingress網絡,在生產環境下,建議使用自定義 overlay 網絡。
(1)創建服務并連接到 nginx-net01 網絡
# docker service create --name my-nginx01 --publish published=8000,target=80 --replicas=3 --network nginx-net01 nginx
(2)查看該服務的詳細信息
[root@master01 ~]# docker service inspect my-nginx01 --prettyID: qxmmj8przpjlrdulxm57sz1l6
Name: my-nginx01
Service Mode: ReplicatedReplicas: 3
Placement:
UpdateConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Update order: stop-first
RollbackConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Rollback order: stop-first
ContainerSpec:Image: nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Init: false
Resources:
Networks: nginx-net01
Endpoint Mode: vip
Ports:PublishedPort = 8000 #發布端口Protocol = tcp #發布協議TargetPort = 80 #目標端口PublishMode = ingress #發布模式
注:自定義 overlay 網絡的服務發布模式仍然為ingress,即通過路由網發布。
(2)為 swarm 服務更換overlay 網絡連接。
創建新的網絡
# docker network create -d overlay nginx-net100
為服務添加overlay網絡
# docker service update --network-add nginx-net100 my-nginx01
(3)overlay 網絡在工作節點上會隨著服務的刪除而自動刪除,但在管理器節點上并不會自動刪除,在管理器節點上一次執行以下命令刪除上述服務和網絡
# docker service rm my-nginx01
# docker network rm nginx-net01 nginx-net100
3、驗證swarm服務發布模式
- ipgress:路由網模式,不管該節點有沒有部署該服務,都能通過該節點訪問該服務
- host:主機模式,如果該節點沒有部署該服務,這 curl http://未部署節點ip:80 無法訪問
(1)創建2個副本的服務,并以路由網模式對外發布端口
# docker service create --name my-nginx01 --publish published=8088,target=80 --replicas 2 nginx
(2)訪問worker02 節點上的服務(目前在worker02 節點未運行該服務),發現可以訪問
[root@master01 ~]# curl http://192.168.65.141:8088
(3)創建2個副本的服務,并以主機模式對外發布端口
# docker service create --name my-nginx02 --publish published=8080,target=80,mode=host --replicas 2 nginx
(4)查看服務的發布模式
[root@master01 ~]# docker service inspect my-nginx02 --pretty
...
...
Ports:PublishedPort = 8080Protocol = tcpTargetPort = 80PublishMode = host #發布模式
(5)訪問worker02 節點上的服務(目前在worker02 節點未運行該服務),發現訪問被拒絕
[root@master01 ~]# curl http://192.168.65.141:8080
curl: (7) Failed connect to 192.168.65.141:8080; 拒絕連接