如何進(jìn)行Docker Swarm 集群環(huán)境搭建及彈性服務(wù)部署,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都app軟件開發(fā)、小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。
五臺(tái)安裝了 Docker 的 CentOS 機(jī)器,版本為:CentOS 7.8.2003
Docker Engine 1.12+(最低要求 1.12,本文使用 19.03.12)
防火墻開啟以下端口或者關(guān)閉防火墻:
TCP 端口 2377,用于集群管理通信;
TCP 和 UDP 端口 7946,用于節(jié)點(diǎn)之間通信;
UDP 端口 4789,用于覆蓋網(wǎng)絡(luò)。
角色 | 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 |
可以通過(guò) hostname 主機(jī)名
修改機(jī)器的主機(jī)名(立即生效,重啟后失效);
或者 hostnamectl set-hostname 主機(jī)名
修改機(jī)器的主機(jī)名(立即生效,重啟也生效);
或者 vi /etc/hosts
編輯 hosts 文件,如下所示, 給 127.0.0.1 添加主機(jī)名(重啟生效)。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 manager1 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
在任意節(jié)點(diǎn)下通過(guò) docker swarm init
命令創(chuàng)建一個(gè)新的 Swarm 集群并加入,且該節(jié)點(diǎn)會(huì)默認(rèn)成為 Manager 節(jié)點(diǎn)。根據(jù)我們預(yù)先定義的角色,在 101 ~ 103 的任意一臺(tái)機(jī)器上運(yùn)行該命令即可。
通常,第一個(gè)加入集群的管理節(jié)點(diǎn)將成為 Leader
,后來(lái)加入的管理節(jié)點(diǎn)都是 Reachable
。當(dāng)前的 Leader 如果掛掉,所有的 Reachable 將重新選舉一個(gè)新的 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 中內(nèi)置的集群模式自帶了公鑰基礎(chǔ)設(shè)施(PKI)系統(tǒng),使得安全部署容器變得簡(jiǎn)單。集群中的節(jié)點(diǎn)使用傳輸層安全協(xié)議(TLS)對(duì)集群中其他節(jié)點(diǎn)的通信進(jìn)行身份驗(yàn)證、授權(quán)和加密。
默認(rèn)情況下,通過(guò) docker swarm init
命令創(chuàng)建一個(gè)新的 Swarm 集群時(shí),Manager 節(jié)點(diǎn)會(huì)生成新的根證書頒發(fā)機(jī)構(gòu)(CA)和密鑰對(duì),用于保護(hù)與加入群集的其他節(jié)點(diǎn)之間的通信安全。
Manager 節(jié)點(diǎn)會(huì)生成兩個(gè)令牌,供其他節(jié)點(diǎn)加入集群時(shí)使用:一個(gè) Worker 令牌,一個(gè) Manager 令牌。每個(gè)令牌都包括根 CA 證書的摘要和隨機(jī)生成的密鑰。當(dāng)節(jié)點(diǎn)加入群集時(shí),加入的節(jié)點(diǎn)使用摘要來(lái)驗(yàn)證來(lái)自遠(yuǎn)程管理節(jié)點(diǎn)的根 CA 證書。遠(yuǎn)程管理節(jié)點(diǎn)使用密鑰來(lái)確保加入的節(jié)點(diǎn)是批準(zhǔn)的節(jié)點(diǎn)。
若要向該集群添加 Manager 節(jié)點(diǎn),管理節(jié)點(diǎn)先運(yùn)行 docker swarm join-token manager
命令查看管理節(jié)點(diǎn)的令牌信息。
docker swarm join-token manager
然后在其他節(jié)點(diǎn)上運(yùn)行 docker swarm join
并攜帶令牌參數(shù)加入 Swarm 集群,該節(jié)點(diǎn)角色為 Manager。
通過(guò)創(chuàng)建集群時(shí)返回的結(jié)果可以得知,要向這個(gè)集群添加一個(gè) Worker 節(jié)點(diǎn),運(yùn)行下圖中的命令即可?;蛘吖芾砉?jié)點(diǎn)先運(yùn)行 docker swarm join-token worker
命令查看工作節(jié)點(diǎn)的令牌信息。
然后在其他節(jié)點(diǎn)上運(yùn)行 docker swarm join
并攜帶令牌參數(shù)加入 Swarm 集群,該節(jié)點(diǎn)角色為 Worker。
在任意 Manager 節(jié)點(diǎn)中運(yùn)行 docker info
可以查看當(dāng)前集群的信息。
在任意 Manager 節(jié)點(diǎn)中運(yùn)行 docker node ls
可以查看當(dāng)前集群節(jié)點(diǎn)信息。
docker node ls
*
代表當(dāng)前節(jié)點(diǎn),現(xiàn)在的環(huán)境為 3 個(gè)管理節(jié)點(diǎn)構(gòu)成 1 主 2 從,以及 2 個(gè)工作節(jié)點(diǎn)。
節(jié)點(diǎn) MANAGER STATUS
說(shuō)明:表示節(jié)點(diǎn)是屬于 Manager 還是 Worker,沒(méi)有值則屬于 Worker 節(jié)點(diǎn)。
Leader
:該節(jié)點(diǎn)是管理節(jié)點(diǎn)中的主節(jié)點(diǎn),負(fù)責(zé)該集群的集群管理和編排決策;
Reachable
:該節(jié)點(diǎn)是管理節(jié)點(diǎn)中的從節(jié)點(diǎn),如果 Leader 節(jié)點(diǎn)不可用,該節(jié)點(diǎn)有資格被選為新的 Leader;
Unavailable
:該管理節(jié)點(diǎn)已不能與其他管理節(jié)點(diǎn)通信。如果管理節(jié)點(diǎn)不可用,應(yīng)該將新的管理節(jié)點(diǎn)加入群集,或者將工作節(jié)點(diǎn)升級(jí)為管理節(jié)點(diǎn)。
節(jié)點(diǎn) AVAILABILITY
說(shuō)明:表示調(diào)度程序是否可以將任務(wù)分配給該節(jié)點(diǎn)。
Active
:調(diào)度程序可以將任務(wù)分配給該節(jié)點(diǎn);
Pause
:調(diào)度程序不會(huì)將新任務(wù)分配給該節(jié)點(diǎn),但現(xiàn)有任務(wù)仍可以運(yùn)行;
Drain
:調(diào)度程序不會(huì)將新任務(wù)分配給該節(jié)點(diǎn),并且會(huì)關(guān)閉該節(jié)點(diǎn)所有現(xiàn)有任務(wù),并將它們調(diào)度在可用的節(jié)點(diǎn)上。
刪除節(jié)點(diǎn)之前需要先將該節(jié)點(diǎn)的 AVAILABILITY
改為 Drain
。其目的是為了將該節(jié)點(diǎn)的服務(wù)遷移到其他可用節(jié)點(diǎn)上,確保服務(wù)正常。最好檢查一下容器遷移情況,確保這一步已經(jīng)處理完成再繼續(xù)往下。
docker node update --availability drain 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
然后,將該 Manager 節(jié)點(diǎn)進(jìn)行降級(jí)處理,降級(jí)為 Worker 節(jié)點(diǎn)。
docker node demote 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
然后,在已經(jīng)降級(jí)為 Worker 的節(jié)點(diǎn)中運(yùn)行以下命令,離開集群。
docker swarm leave
最后,在管理節(jié)點(diǎn)中對(duì)剛才離開的節(jié)點(diǎn)進(jìn)行刪除。
docker node rm 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
刪除節(jié)點(diǎn)之前需要先將該節(jié)點(diǎn)的 AVAILABILITY
改為 Drain
。其目的是為了將該節(jié)點(diǎn)的服務(wù)遷移到其他可用節(jié)點(diǎn)上,確保服務(wù)正常。最好檢查一下容器遷移情況,確保這一步已經(jīng)處理完成再繼續(xù)往下。
docker node update --availability drain 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
然后,在準(zhǔn)備刪除的 Worker 節(jié)點(diǎn)中運(yùn)行以下命令,離開集群。
docker swarm leave
最后,在管理節(jié)點(diǎn)中對(duì)剛才離開的節(jié)點(diǎn)進(jìn)行刪除。
docker node rm 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
注意:跟集群管理有關(guān)的任何操作,都是在 Manager 節(jié)點(diǎn)上操作的。
下面這個(gè)案例,使用 nginx 鏡像創(chuàng)建了一個(gè)名為 mynginx 的服務(wù),該服務(wù)會(huì)被隨機(jī)指派給一個(gè)工作節(jié)點(diǎn)運(yùn)行。
docker service create --replicas 1 --name mynginx -p 80:80 nginx
docker service create
:創(chuàng)建服務(wù);
--replicas
:指定一個(gè)服務(wù)有幾個(gè)實(shí)例運(yùn)行;
--name
:服務(wù)名稱。
可以通過(guò) docker service ls
查看運(yùn)行的服務(wù)。
[root@manager1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS hepx06k5ik5n mynginx replicated 1/1 nginx:latest *:80->80/tcp
可以通過(guò) docker service inspect 服務(wù)名稱|服務(wù)ID
查看服務(wù)的詳細(xì)信息。
[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" } ] } } ]
可以通過(guò) docker service ps 服務(wù)名稱|服務(wù)ID
查看服務(wù)運(yùn)行在哪些節(jié)點(diǎn)上。
在對(duì)應(yīng)的任務(wù)節(jié)點(diǎn)上運(yùn)行 docker ps
可以查看該服務(wù)對(duì)應(yīng)容器的相關(guān)信息。
接下來(lái)我們測(cè)試一下服務(wù)是否能被正常訪問(wèn),并且該集群下任意節(jié)點(diǎn)的 IP 地址都要能訪問(wèn)到該服務(wù)才行。
測(cè)試結(jié)果:5 臺(tái)機(jī)器均可正常訪問(wèn)到該服務(wù)。
將 service 部署到集群以后,可以通過(guò)命令彈性擴(kuò)縮容 service 中的容器數(shù)量。在 service 中運(yùn)行的容器被稱為 task(任務(wù))。
通過(guò) docker service scale 服務(wù)名稱|服務(wù)ID=n
可以將 service 運(yùn)行的任務(wù)擴(kuò)縮容為 n 個(gè)。
通過(guò) docker service update --replicas n 服務(wù)名稱|服務(wù)ID
也可以達(dá)到擴(kuò)縮容的效果。
將 mynginx service 運(yùn)行的任務(wù)擴(kuò)展為 5 個(gè):
[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
通過(guò) docker service ps 服務(wù)名稱|服務(wù)ID
查看服務(wù)運(yùn)行在哪些節(jié)點(diǎn)上。
我們?cè)賮?lái)一波縮容的操作,命令如下:
[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
通過(guò) docker service ps 服務(wù)名稱|服務(wù)ID
查看服務(wù)運(yùn)行在哪些節(jié)點(diǎn)上。
在 Swarm 集群模式下真正意義實(shí)現(xiàn)了所謂的彈性服務(wù),動(dòng)態(tài)擴(kuò)縮容一行命令搞定,簡(jiǎn)單、便捷、強(qiáng)大。
通過(guò) docker service rm 服務(wù)名稱|服務(wù)ID
即可刪除服務(wù)。
[root@manager1 ~]# docker service rm mynginx mynginx [root@manager1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS
以下案例將演示 redis 版本如何滾動(dòng)升級(jí)至更高版本再回滾至上一次的操作。
首先,創(chuàng)建 5 個(gè) Redis 服務(wù)副本,版本為 5,詳細(xì)命令如下:
# 創(chuàng)建 5 個(gè)副本,每次更新 2 個(gè),更新間隔 10s,20% 任務(wù)失敗繼續(xù)執(zhí)行,超出 20% 執(zhí)行回滾,每次回滾 2 個(gè) 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
:定義滾動(dòng)更新的時(shí)間間隔;
--update-parallelism
:定義并行更新的副本數(shù)量,默認(rèn)為 1;
--update-failure-action
:定義容器啟動(dòng)失敗之后所執(zhí)行的動(dòng)作;
--rollback-monitor
:定義回滾的監(jiān)控時(shí)間;
--rollback-parallelism
:定義并行回滾的副本數(shù)量;
--rollback-max-failure-ratio
:任務(wù)失敗回滾比率,超過(guò)該比率執(zhí)行回滾操作,0.2 表示 20%。
然后通過(guò)以下命令實(shí)現(xiàn)服務(wù)的滾動(dòng)更新。
docker service update --image redis:6 redis
回滾服務(wù),只能回滾到上一次操作的狀態(tài),并不能連續(xù)回滾到指定操作。
docker service update --rollback redis
命令 | 說(shuō)明 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token worker | 查看工作節(jié)點(diǎn)的 token |
docker swarm join-token manager | 查看管理節(jié)點(diǎn)的 token |
docker swarm join | 加入集群 |
命令 | 說(shuō)明 |
---|---|
docker node ls | 查看集群所有節(jié)點(diǎn) |
docker node ps | 查看當(dāng)前節(jié)點(diǎn)所有任務(wù) |
docker node rm 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID | 刪除節(jié)點(diǎn)(-f 強(qiáng)制刪除) |
docker node inspect 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID | 查看節(jié)點(diǎn)詳情 |
docker node demote 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID | 節(jié)點(diǎn)降級(jí),由管理節(jié)點(diǎn)降級(jí)為工作節(jié)點(diǎn) |
docker node promote 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID | 節(jié)點(diǎn)升級(jí),由工作節(jié)點(diǎn)升級(jí)為管理節(jié)點(diǎn) |
docker node update 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID | 更新節(jié)點(diǎn) |
命令 | 說(shuō)明 |
---|---|
docker service create | 創(chuàng)建服務(wù) |
docker service ls | 查看所有服務(wù) |
docker service inspect 服務(wù)名稱|服務(wù)ID | 查看服務(wù)詳情 |
docker service logs 服務(wù)名稱|服務(wù)ID | 查看服務(wù)日志 |
docker service rm 服務(wù)名稱|服務(wù)ID | 刪除服務(wù)(-f 強(qiáng)制刪除) |
docker service scale 服務(wù)名稱|服務(wù)ID=n | 設(shè)置服務(wù)數(shù)量 |
docker service update 服務(wù)名稱|服務(wù)ID | 更新服務(wù) |
看完上述內(nèi)容,你們掌握如何進(jìn)行Docker Swarm 集群環(huán)境搭建及彈性服務(wù)部署的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁(yè)標(biāo)題:如何進(jìn)行DockerSwarm集群環(huán)境搭建及彈性服務(wù)部署
本文網(wǎng)址:http://aaarwkj.com/article14/ihhege.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站制作、網(wǎng)站導(dǎo)航、企業(yè)網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)