docker swarm
Docker Swarm 是Docker官?的跨節(jié)點(diǎn)的容器編排?具。?戶只需要在單?的管理節(jié)點(diǎn)上操作,即可管理集群下的所有節(jié)點(diǎn)和容器
解決的問題
- 解決docker server的集群化管理和部署
- Swarm通過對(duì)Docker宿主機(jī)上添加的標(biāo)簽信息來將宿主機(jī)資源進(jìn)?細(xì)粒度分區(qū),通過分區(qū)來幫助?戶將容器部署到?標(biāo)宿主機(jī)上,同樣通過分區(qū)?式還能提供更多的資源調(diào)度策略擴(kuò)展。
單機(jī)模式
swarm模式
能做什么
- 管理節(jié)點(diǎn)?可?,原??持管理節(jié)點(diǎn)?可?,采?raft共識(shí)算法來?撐管理節(jié)點(diǎn)?可?
- 應(yīng)?程序?可?,?持服務(wù)伸縮,滾動(dòng)更新和應(yīng)?回滾等部署策略
相關(guān)概念
-
docker的兩種模式,單引擎模式和swarm集群模式
-
單引擎模式,之docker server沒有加?任何集群,且?身也沒有加?初始化為swarm 節(jié)點(diǎn),簡(jiǎn)單的說就我我們平時(shí)所操作的孤?的docker server。
-
swarm模式,當(dāng)docker server 加?到任意swarm集群,或者通過docker swarm init初始化swarm集群時(shí),docker server會(huì)?動(dòng)切換到swarm 集群模式。
-
-
swarm集群中節(jié)點(diǎn)分類,分為:manager(管理節(jié)點(diǎn))、node(?作節(jié)點(diǎn))
- manager:是Swarm Daemon?作的節(jié)點(diǎn),包含了調(diào)度器、路由、服務(wù)發(fā)現(xiàn)等功能,負(fù)責(zé)接收客戶端的集群管理請(qǐng)求以及調(diào)度Node進(jìn)?具體?作。manager 本身也是?個(gè)node節(jié)點(diǎn)
- Node:接受manager調(diào)度,對(duì)容器進(jìn)?創(chuàng)建、擴(kuò)容和銷毀等具體操作。
-
raft共識(shí)算法,是實(shí)現(xiàn)分布式共識(shí)的?種算法,主要?來管理?志復(fù)制的?致性。(實(shí)現(xiàn)manager節(jié)點(diǎn)存儲(chǔ)相同一致性狀態(tài))
當(dāng)Docker引擎在swarm模式下運(yùn)?時(shí),manager節(jié)點(diǎn)實(shí)現(xiàn)Raft?致性算法來管理全局集群狀態(tài)。Docker swarm模式之所以使??致性算法,是為了確保集群中負(fù)責(zé)管理和調(diào)度任務(wù)的所有manager節(jié)點(diǎn)都存儲(chǔ)相同的?致狀態(tài)。
在整個(gè)集群中具有相同的?致狀態(tài)意味著,如果出現(xiàn)故障,任何管理器節(jié)點(diǎn)都可以拾取任務(wù)并將服務(wù)恢復(fù)到穩(wěn)定狀態(tài)。例如,如果負(fù)責(zé)在集群中調(diào)度任務(wù)的領(lǐng)導(dǎo)管理器意外死亡,則任何其他管理器都可以選擇調(diào)度任務(wù)并重新平衡任務(wù)以匹配所需狀態(tài)。
使??致性算法在分布式系統(tǒng)中復(fù)制?志的系統(tǒng)需要特別??。它們通過要求?多數(shù)節(jié)點(diǎn)在值上達(dá)成?致,確保集群狀態(tài)在出現(xiàn)故障時(shí)保持?致。
Raft最多可承受(N-1)/2次故障,需要(N/2)+1名成員的多數(shù)或法定?數(shù)才能就向集群提議的值達(dá)成?致。這意味著,在運(yùn)?Raft的5個(gè)管理器集群中,如果3個(gè)節(jié)點(diǎn)不可?,系統(tǒng)將?法處理更多的請(qǐng)求來安排其他任務(wù)。現(xiàn)有任務(wù)保持運(yùn)?,但如果管理器集不正常,調(diào)度程序?法重新平衡任務(wù)以應(yīng)對(duì)故障。
-
Swarm管理節(jié)點(diǎn)?可?
- Swarm管理節(jié)點(diǎn)內(nèi)置有對(duì)HA的?持,即使有?個(gè)或多個(gè)節(jié)點(diǎn)發(fā)送故障,剩余管理節(jié)點(diǎn)也會(huì)繼續(xù)保證Swarm運(yùn)轉(zhuǎn)
- Swarm實(shí)現(xiàn)了?種主從?式的多管理節(jié)點(diǎn)的HA,即使有多個(gè)管理節(jié)點(diǎn)也只有?個(gè)節(jié)點(diǎn)出于活動(dòng)狀態(tài),處于活動(dòng)狀態(tài)的節(jié)點(diǎn)被稱為主節(jié)點(diǎn)(leader),?主節(jié)點(diǎn)也是唯??個(gè)會(huì)對(duì)Swarm發(fā)送控制命令的節(jié)點(diǎn),如果?個(gè)備?管理節(jié)點(diǎn)接收到了Swarm命令,則它會(huì)將其轉(zhuǎn)發(fā)給主節(jié)點(diǎn)
集群管理
創(chuàng)建集群
- 不包含在任何Swarm中的Docker節(jié)點(diǎn),該Docker節(jié)點(diǎn)被稱為運(yùn)?于單引擎(Single-Engine)模式,?旦加?Swarm集群,則切換為Swarm模式
- docker swarm init 會(huì)通知Docker來初始化?個(gè)新的Swarm,并且將?身設(shè)置為第?個(gè)管理節(jié)點(diǎn)。同時(shí)也會(huì)使該節(jié)點(diǎn)開啟Swarm模式
- –advertise-addr IP:2377 指定其他節(jié)點(diǎn)?來連接到當(dāng)前管理節(jié)點(diǎn)的IP和端?,這?指令是可選的,當(dāng)節(jié)點(diǎn)有多個(gè)IP時(shí),可以指定其中?個(gè)
- –listen-addr 指定?于承載Swarm流量的IP和端?,其設(shè)置通常與–advertise-addr相匹配,但是當(dāng)節(jié)點(diǎn)上有多個(gè)IP的時(shí)候,可?于指定具體某個(gè)IP
- –autolock 啟?管理器?動(dòng)鎖定(需要解鎖密鑰才能啟動(dòng)已停?的管理器)
- –force-new-cluster 強(qiáng)制從當(dāng)前狀態(tài)創(chuàng)建新群集
docker swarm init
talenty@k8smaster:~$ docker swarm init
Swarm initialized: current node (h799byvplbyoo7ic7wgtl2x0t) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4cn3m0nzkdi3flts2hojqcww4ez52xgx6saaygq38oz8actthz-5qe4s1sigc486wyk3diqvk8my 192.168.22.130:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
將節(jié)點(diǎn)加入集群
docker swarm join --token SWMTKN-1-4cn3m0nzkdi3flts2hojqcww4ez52xgx6saaygq38oz8actthz-5qe4s1sigc486wyk3diqvk8my 192.168.22.130:2377
#或者
# ?成work節(jié)點(diǎn) join-token
docker swarm join-token worker
# ?成manager節(jié)點(diǎn) join-token
docker swarm join-token manager
# 此命令為 join-token 命令執(zhí)?結(jié)果,在相應(yīng)的節(jié)點(diǎn)執(zhí)?該結(jié)果即可加?到集群
docker swarm join --token SWMTKN-1-36o8i823751vozwd75mpzgsy28h4ti93zbn4o9wht8kywj35ir-6zh4id2t0ck4on4oyw95xs3cs 192.168.22.130:2377
查看集群狀態(tài)
docker info
將節(jié)點(diǎn)從集群中移除
# 將節(jié)點(diǎn)從集群中移除 (只能移除worker節(jié)點(diǎn))
docker swarm leave
# 將節(jié)點(diǎn)從集群中強(qiáng)制移除(包括manager節(jié)點(diǎn))
docker swarm leave -f
更新集群
# 更新集群的部分參數(shù)
docker swarm update --autolock=false
鎖定/解鎖集群
- 重啟?個(gè)舊的管理節(jié)點(diǎn)或者進(jìn)?備份恢復(fù)可能對(duì)集群造成影響,?個(gè)舊的管理節(jié)點(diǎn)重新接?Swarm會(huì)?動(dòng)解密并獲得Raft數(shù)據(jù)庫(kù)中?時(shí)間序列的訪問權(quán),這會(huì)帶來安全隱患。進(jìn)?備份恢復(fù)可能會(huì)抹掉最新的Swarm配置
- 為了規(guī)避上述問題,Docker提供?動(dòng)鎖機(jī)制來鎖定Swarm,這會(huì)強(qiáng)制要求重啟的管理節(jié)點(diǎn)在提供個(gè)集群解鎖碼之后才有權(quán)重新接?集群(也可以防?原來的主節(jié)點(diǎn)宕機(jī)后快速的重新接?集群,和當(dāng)前主節(jié)點(diǎn)?起成為雙主,雙主也是?種腦裂問題)
# 設(shè)置為?動(dòng)鎖定集群
docker swarm update --autolock=true
# 當(dāng)集群設(shè)置為 --autolock后,可以通過該命令查詢解鎖集群的秘鑰
# 如果該節(jié)點(diǎn)必須為集群有效的管理節(jié)點(diǎn)
docker swarm unlock-key
# 重啟管理節(jié)點(diǎn),集群將被?動(dòng)鎖定
service docker restart
# 重啟后的管理節(jié)點(diǎn)必須提供解鎖碼后才能重新接?集群
docker swarm unlock
節(jié)點(diǎn)管理
docker node -h
# 降級(jí)節(jié)點(diǎn)
demote Demote one or more nodes from manager in the swarm
# 查看節(jié)點(diǎn)詳情
inspect Display detailed information on one or more nodes
# 查看所有節(jié)點(diǎn)
ls List nodes in the swarm
# 升級(jí)節(jié)點(diǎn)
promote Promote one or more nodes to manager in the swarm
# 查看節(jié)點(diǎn)上運(yùn)?的任務(wù),默認(rèn)當(dāng)前節(jié)點(diǎn)
ps List tasks running on one or more nodes, defaults to current node
# 刪除節(jié)點(diǎn)
rm Remove one or more nodes from the swarm
# 更新節(jié)點(diǎn)
update Update a node
查看集群節(jié)點(diǎn)列表
docker node ls 1
升級(jí)或降級(jí)節(jié)點(diǎn)
# 降級(jí)?個(gè)或多個(gè)節(jié)點(diǎn)
docker node demote <NODE>
# 通過修改單個(gè)節(jié)點(diǎn)的role屬性,來降級(jí)節(jié)點(diǎn)
docker node update --role worker <NODE>
# 升級(jí)?個(gè)或多個(gè)節(jié)點(diǎn)
docker node promote <NODE>
# 通過修改單個(gè)節(jié)點(diǎn)的role屬性,來升級(jí)節(jié)點(diǎn)
docker node update --role manager <NODE>
更改節(jié)點(diǎn)狀態(tài)
# 更改節(jié)點(diǎn)狀態(tài)
docker node update --availability active|pause|drain <NODE>
# active: 正常
# pause:掛起
# drain:排除
- 正常節(jié)點(diǎn),可正常部署應(yīng)?
- 掛起節(jié)點(diǎn),已經(jīng)部署的應(yīng)?不會(huì)發(fā)?變化,新應(yīng)?將不會(huì)部署到該節(jié)點(diǎn)
- 排除節(jié)點(diǎn),已經(jīng)部署在該節(jié)點(diǎn)的應(yīng)?會(huì)被調(diào)度到其他節(jié)點(diǎn)
刪除節(jié)點(diǎn)
# 只能刪除已關(guān)閉服務(wù)的?作節(jié)點(diǎn)
docker node rm <node>
# 只能強(qiáng)制刪除?作節(jié)點(diǎn)
docker node rm -f <node>
管理節(jié)點(diǎn)的刪除只能先將管理節(jié)點(diǎn)降級(jí)為?作節(jié)點(diǎn),再執(zhí)?刪除動(dòng)作
# 停?docker server
sudo service docker stop
服務(wù)管理
常用命令
docker service -h
# 創(chuàng)建?個(gè)服務(wù)
create Create a new service
# 查看服務(wù)詳細(xì)信息
inspect Display detailed information on one or more services
# 查看服務(wù)?志
logs Fetch the logs of a service or task
# 列出所有服務(wù)
ls List services
# 列出?個(gè)或多個(gè)服務(wù)的任務(wù)列表
ps List the tasks of one or more services
# 刪除?個(gè)或多個(gè)服務(wù)
rm Remove one or more services
# 回滾
rollback Revert changes to a service's configuration
# 彈性伸縮?個(gè)或多個(gè)服務(wù)
scale Scale one or multiple replicated services
# 更新服務(wù)
update Update a service
在集群上部署應(yīng)用
隨便準(zhǔn)備一個(gè)gin服務(wù)代碼打包的鏡像
部署
docker service create --name myhello2 --publish published=8081,target=80 --replicas 2 webtestserver:v1
[root@localhost compose]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
pm43flv31rox myhello2 replicated 3/3 webtestserver:v1 *:8081->8088/tcp
查看服務(wù)下的任務(wù)
docker service ps myhello2
[root@localhost compose]# docker service ps myhello2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
i9zpdeuuspft myhello2.1 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
px1qtbnsi68u myhello2.2 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
wz77u57rteo9 myhello2.3 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
查看節(jié)點(diǎn)下的任務(wù)
docker node ps <NODE_ID>
[root@localhost compose]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
feo9ifozbs916w0usp9imsr03 * localhost.localdomain Ready Active Leader 24.0.7
[root@localhost compose]# docker node ps feo9ifozbs916w0usp9imsr03
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
i9zpdeuuspft myhello2.1 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
px1qtbnsi68u myhello2.2 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
wz77u57rteo9 myhello2.3 webtestserver:v1 localhost.localdomain Running Running 4 hours ago
訪問集群中任意節(jié)點(diǎn)(包括沒有運(yùn)?任務(wù)的節(jié)點(diǎn))對(duì)應(yīng)的端?號(hào)均能訪問到應(yīng)?程序,swarm為集群實(shí)現(xiàn)了負(fù)載均衡
查看service詳細(xì)信息
docker service inspect myhello2
查看service日志
docker service logs myhello2
伸縮服務(wù)
docker service scale myhello2=5
修改節(jié)點(diǎn)狀態(tài),查看任務(wù)部署情況
docker node update --availability active|pause|drain <NODE_ID>
部署一個(gè)個(gè)帶更新策略和回滾策略的應(yīng)?
docker service create \
--name myhello3 \
--publish published=8081,target=8088 \
--replicas 20 \
--update-delay 5s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-parallelism 2 \
--rollback-monitor 10s \
--rollback-max-failure-ratio 0.2 \
webtestserver:v1
#--update-delay 5s :每個(gè)容器依次更新,間隔5s
# --update-parallelism 2 : 每次允許兩個(gè)服務(wù)?起更新
#--update-failure-action continue : 更新失敗后的動(dòng)作是繼續(xù)
# --rollback-parallelism 2 : 回滾時(shí)允許兩個(gè)?起
# --rollback-monitor 10s :回滾監(jiān)控時(shí)間10s
# --rollback-max-failure-ratio 0.2 : 回滾失敗率20%
檢查部署后的應(yīng)?設(shè)置項(xiàng)是否都有被成功設(shè)置
# 查看并打印友好的詳細(xì)信息
docker service inspect --pretty myhello3
更新未設(shè)置成功的項(xiàng)
docker service update --update-delay 5s --rollback-monitor 10s myhello3
更新服務(wù)
打包一個(gè)新版本
docker service update --image webtestserver:v2 myhello3
回滾服務(wù)
docker service update --rollback myhello3
結(jié)合docker-copose.yml部署
部署命令
# 部署或更新 stack
deploy Deploy a new stack or update an existing stack
# 查看 stack 列表
ls List stacks
# 查看 stack 的任務(wù)列表
ps List the tasks in the stack
# 刪除 stack
rm Remove one or more stacks
# 查看stack 中的服務(wù)列表
services List the services in the stack
docker-compose.yml
version: "3.7"
services:
myhello2:
image: webtestserver:v1
ports:
- "8081:8088"
# 依賴服務(wù)redis
depends_on:
- redis
#部署參數(shù)
deploy:
mode: replicated
replicas: 20
endpoint_mode: vip
rollback_config:
parallelism: 2
delay: 10s
monitor: 10s
max_failure_ratio: 0.2
update_config:
parallelism: 2
delay: 5s
failure_action: continue
redis:
image: redis:alpine
deploy:
mode: replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
部署stack(部署一堆容器)文章來源:http://www.zghlxwxcb.cn/news/detail-787545.html
docker stack deploy -c docker-compose.yml mystack
查看服務(wù)詳情文章來源地址http://www.zghlxwxcb.cn/news/detail-787545.html
# 查看并打印友好的詳細(xì)信息
docker service inspect --pretty mystack_myhello2
docker service inspect --pretty mystack_redis
配置說明
配置說明
endpoint_mode:訪問集群服務(wù)的?式。
endpoint_mode: vip
# Docker 集群服務(wù)?個(gè)對(duì)外的虛擬 ip。所有的請(qǐng)求都會(huì)通過這個(gè)虛擬 ip 到達(dá)集群服務(wù)內(nèi)部的
機(jī)器。
endpoint_mode: dnsrr
# DNS 輪詢(DNSRR)。所有的請(qǐng)求會(huì)?動(dòng)輪詢獲取到集群 ip 列表中的?個(gè) ip 地址。
labels:在服務(wù)上設(shè)置標(biāo)簽??梢?容器上的 labels(跟 deploy 同級(jí)的配置) 覆蓋 deploy 下的 labels。
mode:指定服務(wù)提供的模式。
replicated:復(fù)制服務(wù),復(fù)制指定服務(wù)到集群的機(jī)器上。
global:全局服務(wù),服務(wù)將部署?集群的每個(gè)節(jié)點(diǎn)。
replicas:mode 為 replicated 時(shí),需要使?此參數(shù)配置具體運(yùn)?的節(jié)點(diǎn)數(shù)量。
resources:配置服務(wù)器資源使?的限制,例如上例?,配置 redis 集群運(yùn)?需要的 cpu 的百分? 和 內(nèi)存的占?。避免
占?資源過?出現(xiàn)異常。
restart_policy:配置如何在退出容器時(shí)重新啟動(dòng)容器。
condition:可選 none,on-failure 或者 any(默認(rèn)值:any)。
delay:設(shè)置多久之后重啟(默認(rèn)值:0)。
max_attempts:嘗試重新啟動(dòng)容器的次數(shù),超出次數(shù),則不再嘗試(默認(rèn)值:?直重試)。
window:設(shè)置容器重啟超時(shí)時(shí)間(默認(rèn)值:0)。
rollback_config:配置在更新失敗的情況下應(yīng)如何回滾服務(wù)。
parallelism:?次要回滾的容器數(shù)。如果設(shè)置為0,則所有容器將同時(shí)回滾。
delay:每個(gè)容器組回滾之間等待的時(shí)間(默認(rèn)為0s)。
failure_action:如果回滾失敗,該怎么辦。其中?個(gè) continue 或者 pause(默認(rèn)pause)。
monitor:每個(gè)容器更新后,持續(xù)觀察是否失敗了的時(shí)間 (ns|us|ms|s|m|h)(默認(rèn)為0s)。
max_failure_ratio:在回滾期間可以容忍的故障率(默認(rèn)為0)。
order:回滾期間的操作順序。其中?個(gè) stop-first(串?回滾),或者 start-first(并?回滾)(默認(rèn) stop-first )。
update_config:配置應(yīng)如何更新服務(wù),對(duì)于配置滾動(dòng)更新很有?。
parallelism:?次更新的容器數(shù)。
delay:在更新?組容器之間等待的時(shí)間。
failure_action:如果更新失敗,該怎么辦。其中?個(gè) continue,rollback 或者pause (默認(rèn):pause)。
monitor:每個(gè)容器更新后,持續(xù)觀察是否失敗了的時(shí)間 (ns|us|ms|s|m|h)(默認(rèn)為0s)。
max_failure_ratio:在更新過程中可以容忍的故障率。
order:回滾期間的操作順序。其中?個(gè) stop-first(串?回滾),或者 start-first(并?回滾)(默認(rèn)stop-
first)。
注:僅?持 V3.4 及更?版本
到了這里,關(guān)于docker swarm 常用命令簡(jiǎn)介以及使用案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!