您好,登錄后才能下訂單哦!
如何進行Docker Swarm 集群環境搭建及彈性服務部署,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
五臺安裝了 Docker 的 CentOS 機器,版本為:CentOS 7.8.2003
Docker Engine 1.12+(最低要求 1.12,本文使用 19.03.12)
防火墻開啟以下端口或者關閉防火墻:
TCP 端口 2377,用于集群管理通信;
TCP 和 UDP 端口 7946,用于節點之間通信;
UDP 端口 4789,用于覆蓋網絡。
角色 | IP | HOSTNAME | Docker 版本 |
---|---|---|---|
Manager | 192.168.10.101 | manager1 | 19.03.12 |
Manager | 192.168.10.102 | manager2 | 19.03.12 |
Manager | 192.168.10.103 | manager3 | 19.03.12 |
Worker | 192.168.10.10 | worker1 | 19.03.12 |
Worker | 192.168.10.11 | worker2 | 19.03.12 |
可以通過 hostname 主機名
修改機器的主機名(立即生效,重啟后失效);
或者 hostnamectl set-hostname 主機名
修改機器的主機名(立即生效,重啟也生效);
或者 vi /etc/hosts
編輯 hosts 文件,如下所示, 給 127.0.0.1 添加主機名(重啟生效)。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 manager1 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
在任意節點下通過 docker swarm init
命令創建一個新的 Swarm 集群并加入,且該節點會默認成為 Manager 節點。根據我們預先定義的角色,在 101 ~ 103 的任意一臺機器上運行該命令即可。
通常,第一個加入集群的管理節點將成為 Leader
,后來加入的管理節點都是 Reachable
。當前的 Leader 如果掛掉,所有的 Reachable 將重新選舉一個新的 Leader。
[root@localhost ~]# docker swarm init --advertise-addr 192.168.10.101 Swarm initialized: current node (clumstpieg0qzzxt1caeazg8g) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5ob7jlej85qsygxubqypjuftiwruvew8e2cr4u3iuo4thxyrhg-3hbf2u3i1iagurdprl3n3yra1 192.168.10.101:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Docker 中內置的集群模式自帶了公鑰基礎設施(PKI)系統,使得安全部署容器變得簡單。集群中的節點使用傳輸層安全協議(TLS)對集群中其他節點的通信進行身份驗證、授權和加密。
默認情況下,通過 docker swarm init
命令創建一個新的 Swarm 集群時,Manager 節點會生成新的根證書頒發機構(CA)和密鑰對,用于保護與加入群集的其他節點之間的通信安全。
Manager 節點會生成兩個令牌,供其他節點加入集群時使用:一個 Worker 令牌,一個 Manager 令牌。每個令牌都包括根 CA 證書的摘要和隨機生成的密鑰。當節點加入群集時,加入的節點使用摘要來驗證來自遠程管理節點的根 CA 證書。遠程管理節點使用密鑰來確保加入的節點是批準的節點。
若要向該集群添加 Manager 節點,管理節點先運行 docker swarm join-token manager
命令查看管理節點的令牌信息。
docker swarm join-token manager
然后在其他節點上運行 docker swarm join
并攜帶令牌參數加入 Swarm 集群,該節點角色為 Manager。
通過創建集群時返回的結果可以得知,要向這個集群添加一個 Worker 節點,運行下圖中的命令即可。或者管理節點先運行 docker swarm join-token worker
命令查看工作節點的令牌信息。
然后在其他節點上運行 docker swarm join
并攜帶令牌參數加入 Swarm 集群,該節點角色為 Worker。
在任意 Manager 節點中運行 docker info
可以查看當前集群的信息。
在任意 Manager 節點中運行 docker node ls
可以查看當前集群節點信息。
docker node ls
*
代表當前節點,現在的環境為 3 個管理節點構成 1 主 2 從,以及 2 個工作節點。
節點 MANAGER STATUS
說明:表示節點是屬于 Manager 還是 Worker,沒有值則屬于 Worker 節點。
Leader
:該節點是管理節點中的主節點,負責該集群的集群管理和編排決策;
Reachable
:該節點是管理節點中的從節點,如果 Leader 節點不可用,該節點有資格被選為新的 Leader;
Unavailable
:該管理節點已不能與其他管理節點通信。如果管理節點不可用,應該將新的管理節點加入群集,或者將工作節點升級為管理節點。
節點 AVAILABILITY
說明:表示調度程序是否可以將任務分配給該節點。
Active
:調度程序可以將任務分配給該節點;
Pause
:調度程序不會將新任務分配給該節點,但現有任務仍可以運行;
Drain
:調度程序不會將新任務分配給該節點,并且會關閉該節點所有現有任務,并將它們調度在可用的節點上。
刪除節點之前需要先將該節點的 AVAILABILITY
改為 Drain
。其目的是為了將該節點的服務遷移到其他可用節點上,確保服務正常。最好檢查一下容器遷移情況,確保這一步已經處理完成再繼續往下。
docker node update --availability drain 節點名稱|節點ID
然后,將該 Manager 節點進行降級處理,降級為 Worker 節點。
docker node demote 節點名稱|節點ID
然后,在已經降級為 Worker 的節點中運行以下命令,離開集群。
docker swarm leave
最后,在管理節點中對剛才離開的節點進行刪除。
docker node rm 節點名稱|節點ID
刪除節點之前需要先將該節點的 AVAILABILITY
改為 Drain
。其目的是為了將該節點的服務遷移到其他可用節點上,確保服務正常。最好檢查一下容器遷移情況,確保這一步已經處理完成再繼續往下。
docker node update --availability drain 節點名稱|節點ID
然后,在準備刪除的 Worker 節點中運行以下命令,離開集群。
docker swarm leave
最后,在管理節點中對剛才離開的節點進行刪除。
docker node rm 節點名稱|節點ID
注意:跟集群管理有關的任何操作,都是在 Manager 節點上操作的。
下面這個案例,使用 nginx 鏡像創建了一個名為 mynginx 的服務,該服務會被隨機指派給一個工作節點運行。
docker service create --replicas 1 --name mynginx -p 80:80 nginx
docker service create
:創建服務;
--replicas
:指定一個服務有幾個實例運行;
--name
:服務名稱。
可以通過 docker service ls
查看運行的服務。
[root@manager1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hepx06k5ik5n mynginx replicated 1/1 nginx:latest *:80->80/tcp
可以通過 docker service inspect 服務名稱|服務ID
查看服務的詳細信息。
[root@manager1 ~]# docker service inspect mynginx [ { "ID": "k0dbjg1zzy3l3g71kdwa56ect", "Version": { "Index": 127 }, "CreatedAt": "2020-09-16T10:05:55.627974095Z", "UpdatedAt": "2020-09-16T10:05:55.629507771Z", "Spec": { "Name": "mynginx", "Labels": {}, "TaskTemplate": { "ContainerSpec": { "Image": "nginx:latest@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0", "Init": false, "StopGracePeriod": 10000000000, "DNSConfig": {}, "Isolation": "default" }, "Resources": { "Limits": {}, "Reservations": {} }, "RestartPolicy": { "Condition": "any", "Delay": 5000000000, "MaxAttempts": 0 }, "Placement": { "Platforms": [ { "Architecture": "amd64", "OS": "linux" }, { "OS": "linux" }, { "OS": "linux" }, { "Architecture": "arm64", "OS": "linux" }, { "Architecture": "386", "OS": "linux" }, { "Architecture": "mips64le", "OS": "linux" }, { "Architecture": "ppc64le", "OS": "linux" }, { "Architecture": "s390x", "OS": "linux" } ] }, "ForceUpdate": 0, "Runtime": "container" }, "Mode": { "Replicated": { "Replicas": 1 } }, "UpdateConfig": { "Parallelism": 1, "FailureAction": "pause", "Monitor": 5000000000, "MaxFailureRatio": 0, "Order": "stop-first" }, "RollbackConfig": { "Parallelism": 1, "FailureAction": "pause", "Monitor": 5000000000, "MaxFailureRatio": 0, "Order": "stop-first" }, "EndpointSpec": { "Mode": "vip", "Ports": [ { "Protocol": "tcp", "TargetPort": 80, "PublishedPort": 80, "PublishMode": "ingress" } ] } }, "Endpoint": { "Spec": { "Mode": "vip", "Ports": [ { "Protocol": "tcp", "TargetPort": 80, "PublishedPort": 80, "PublishMode": "ingress" } ] }, "Ports": [ { "Protocol": "tcp", "TargetPort": 80, "PublishedPort": 80, "PublishMode": "ingress" } ], "VirtualIPs": [ { "NetworkID": "st2xiy7pjzap093wz4w4u6nbs", "Addr": "10.0.0.15/24" } ] } } ]
可以通過 docker service ps 服務名稱|服務ID
查看服務運行在哪些節點上。
在對應的任務節點上運行 docker ps
可以查看該服務對應容器的相關信息。
接下來我們測試一下服務是否能被正常訪問,并且該集群下任意節點的 IP 地址都要能訪問到該服務才行。
測試結果:5 臺機器均可正常訪問到該服務。
將 service 部署到集群以后,可以通過命令彈性擴縮容 service 中的容器數量。在 service 中運行的容器被稱為 task(任務)。
通過 docker service scale 服務名稱|服務ID=n
可以將 service 運行的任務擴縮容為 n 個。
通過 docker service update --replicas n 服務名稱|服務ID
也可以達到擴縮容的效果。
將 mynginx service 運行的任務擴展為 5 個:
[root@manager1 ~]# docker service scale mynginx=5 mynginx scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged
通過 docker service ps 服務名稱|服務ID
查看服務運行在哪些節點上。
我們再來一波縮容的操作,命令如下:
[root@manager1 ~]# docker service update --replicas 3 mynginx mynginx overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged
通過 docker service ps 服務名稱|服務ID
查看服務運行在哪些節點上。
在 Swarm 集群模式下真正意義實現了所謂的彈性服務,動態擴縮容一行命令搞定,簡單、便捷、強大。
通過 docker service rm 服務名稱|服務ID
即可刪除服務。
[root@manager1 ~]# docker service rm mynginx mynginx [root@manager1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS
以下案例將演示 Redis 版本如何滾動升級至更高版本再回滾至上一次的操作。
首先,創建 5 個 Redis 服務副本,版本為 5,詳細命令如下:
# 創建 5 個副本,每次更新 2 個,更新間隔 10s,20% 任務失敗繼續執行,超出 20% 執行回滾,每次回滾 2 個 docker service create --replicas 5 --name redis \ --update-delay 10s \ --update-parallelism 2 \ --update-failure-action continue \ --rollback-monitor 20s \ --rollback-parallelism 2 \ --rollback-max-failure-ratio 0.2 \ redis:5
--update-delay
:定義滾動更新的時間間隔;
--update-parallelism
:定義并行更新的副本數量,默認為 1;
--update-failure-action
:定義容器啟動失敗之后所執行的動作;
--rollback-monitor
:定義回滾的監控時間;
--rollback-parallelism
:定義并行回滾的副本數量;
--rollback-max-failure-ratio
:任務失敗回滾比率,超過該比率執行回滾操作,0.2 表示 20%。
然后通過以下命令實現服務的滾動更新。
docker service update --image redis:6 redis
回滾服務,只能回滾到上一次操作的狀態,并不能連續回滾到指定操作。
docker service update --rollback redis
命令 | 說明 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token worker | 查看工作節點的 token |
docker swarm join-token manager | 查看管理節點的 token |
docker swarm join | 加入集群 |
命令 | 說明 |
---|---|
docker node ls | 查看集群所有節點 |
docker node ps | 查看當前節點所有任務 |
docker node rm 節點名稱|節點ID | 刪除節點(-f 強制刪除) |
docker node inspect 節點名稱|節點ID | 查看節點詳情 |
docker node demote 節點名稱|節點ID | 節點降級,由管理節點降級為工作節點 |
docker node promote 節點名稱|節點ID | 節點升級,由工作節點升級為管理節點 |
docker node update 節點名稱|節點ID | 更新節點 |
命令 | 說明 |
---|---|
docker service create | 創建服務 |
docker service ls | 查看所有服務 |
docker service inspect 服務名稱|服務ID | 查看服務詳情 |
docker service logs 服務名稱|服務ID | 查看服務日志 |
docker service rm 服務名稱|服務ID | 刪除服務(-f 強制刪除) |
docker service scale 服務名稱|服務ID=n | 設置服務數量 |
docker service update 服務名稱|服務ID | 更新服務 |
看完上述內容,你們掌握如何進行Docker Swarm 集群環境搭建及彈性服務部署的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。