起因
由于要進(jìn)行服務(wù)的微服務(wù)化部署成畦,由于硬件限制这揣,我們目前采用的是Swarm作為容器編排的工具。對應(yīng)于k8s中的pod怀吻,swarm中有dab這種概念瞬浓,即分布式應(yīng)用包,目前還沒有去探索這個的使用蓬坡,由于還是實驗性的特性猿棉,目前還不涉及,這里主要還是通過docker-compose.yaml的方式將多個微服務(wù)統(tǒng)一運維屑咳。
采用的技術(shù)
使用的是docker stack deploy <args>
命令進(jìn)行的部署萨赁。
官網(wǎng)上該命令有如下的參數(shù):
由于使用的是docker-compose文件,這里直接通過compose-file
進(jìn)行部署即可兆龙,例如官網(wǎng)的例子
docker stack deploy --compose-file docker-compose.yml vossibility
甚至可以通過疊加compose文件杖爽,來修改前一個文件中的配置
docker stack deploy --compose-file docker-compose.yml -c docker-compose.prod.yml vossibility
那么再來看看其他的可選命令:
namespace
和kubeconfig
是k8s的專屬命令,這里就不做過多解釋紫皇,直接看swarm相關(guān)的慰安。
可選參數(shù) | 參數(shù)含義 |
---|---|
prune | 表示削減不再引用的服務(wù) |
resolve-image | 請求倉庫來重新解析鏡像的摘要和支持的平臺 |
with-registry-auth | 發(fā)送倉庫的授權(quán)詳情到Swarm代理 |
orchestrator | 使用的容器編排服務(wù) |
目前覺得prune
這個參數(shù)比較關(guān)鍵,可以把一些down掉的service進(jìn)行自動清理坝橡。
回歸正題
如何通過docker-compose.yml
配置文件進(jìn)行集群化部署呢?
首先需要知道的泻帮,docker-compose文件中哪個部分主要對應(yīng)了swarm中的運維需求,答案就是deploy
參數(shù)下的各種配置计寇。
上圖中的配置一個個來看;
首先來看锣杂,最下面標(biāo)注的docker stack deploy不支持的參數(shù)
脂倦,具體可以參考下圖:
上面的參數(shù),就算yaml中包含元莫,在stack的時候也會被忽略赖阻,當(dāng)然也可以為了docker-compose up
留著這些配置。
下面對于各個參數(shù)的說明中的例子踱蠢,直接偷懶粘貼官網(wǎng)的例子了火欧。
endpoint_mode:
這個命令是在 3.2
版本中開始引入的,主要是用于指定服務(wù)發(fā)現(xiàn)方法茎截,以方便外部的客戶端連接到swarm
主要包含兩個:
- vip: 這個是默認(rèn)的方案苇侵。即通過虛擬的IP對外暴露服務(wù),客戶端無法察覺有多少個節(jié)點提供服務(wù)企锌,也不知道實際提供服務(wù)的IP和端口榆浓。
- dnsrr:這個是DNS的輪詢調(diào)度∷涸埽客戶端訪問的時候陡鹃,Docker會通過DNS列表返回對應(yīng)的服務(wù)一系列IP地址,客戶連接其中的一個抖坪。這種方式通常用于使用自己的負(fù)載均衡器萍鲸,或者window和linux的混合應(yīng)用。
version: "3.9"
services:
wordpress:
image: wordpress
ports:
- "8080:80"
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
mysql:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: dnsrr
volumes:
db-data:
networks:
overlay:
labels
標(biāo)簽是用于service之上擦俐,并非附加在service中的容器上脊阴。
如果像將其附在所有容器上,則在deploy
之外定義labels.
version: "3.9"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
mode
用于指定是以副本模式(默認(rèn))
啟動還是全局模式
捌肴,如果是全局模式
蹬叭,類似于開始于k8s中的DaemonSet,會在每個節(jié)點上啟動且只啟動一個服務(wù)状知。
version: "3.9"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
placement
這個參數(shù)在運維的時候尤為關(guān)鍵,主要用于指定容忍
和偏好
孽查,這個在k8s中同樣有對應(yīng)的概念
version: "3.9"
services:
db:
image: postgres
deploy:
placement:
constraints:
- "node.role==manager"
- "engine.labels.operatingsystem==ubuntu 18.04"
preferences:
- spread: node.labels.zone
其中饥悴,容忍
包含了:
node attribute | matches | example |
---|---|---|
node.id | 節(jié)點id | node.id==2ivku8v2gvtg4 |
node.hostname | 節(jié)點主機名 | node.hostname!=node-2 |
node.role | 節(jié)點角色 (manager/worker) | node.role==manager |
node.platform.os | 姐節(jié)點操作系統(tǒng) | node.platform.os==windows |
node.platform.arch | 節(jié)點架構(gòu) | node.platform.arch==x86_64 |
node.labels | 用戶定義的labels | node.labels.security==high |
engine.labels | Docker 引擎的 labels | engine.labels.operatingsystem==ubuntu-14.04 |
容忍,表示服務(wù)可以部署在符合容忍限定的節(jié)點上盲再。
至于偏好
,只有一個參數(shù)西设,就是spread,其參數(shù)值為節(jié)點的屬性答朋,即容忍表中的內(nèi)容贷揽。
偏好,表示的是服務(wù)可以均勻分布在指定的標(biāo)簽下梦碗,如:
node.labels.zone
這個標(biāo)簽在集群中有三個值禽绪,分別為west蓖救、east、north印屁,那么服務(wù)中的副本將會等分為三份循捺,分布到帶有三個標(biāo)簽的節(jié)點上。
max_replicas_per_node
這個是3.8中添加的配置雄人。
字面意思从橘,就是控制每個節(jié)點上最多的副本數(shù)
version: "3.9"
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
placement:
max_replicas_per_node: 1
要注意的是,當(dāng)
最大副本數(shù)*集群中可部署服務(wù)的節(jié)點數(shù)<副本數(shù)
础钠,會報錯恰力。
replicas
用于指定副本數(shù),只有mode為副本模式的時候生效旗吁。
resources
這個參數(shù)在運維的時候尤為關(guān)鍵踩萎,主要用于限制服務(wù)的資源。
注意這里的配置在版本3中和版本2有較大差別阵漏。
version: "3.9"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
limit用于限制最大的資源使用數(shù)量驻民,reservation為最低的資源占用量。
restart_policy
重啟策略
version: "3.9"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
- condition: 表示的是重啟的條件履怯,分為 none回还,on-failure,any(默認(rèn))
- delay:表示嘗試重啟的時間間隔(默認(rèn)5s)
- max_attempts: 最多的嘗試次數(shù)(默認(rèn)一直重試)
- window:在判斷重啟是否成功之前等待時間(一個總的時間,如果超過這個時間還沒有成功叹洲,則不再重啟)
rollback_config
3.7版本加入
用于指定回滾的策略
由于和升級策略相關(guān)參數(shù)基本一直柠硕,放在下面講
update_config
用于指定升級的策略
version: "3.9"
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
- parallelism:同時升級[回滾]的容器數(shù)
- delay:升級[回滾]的時間間隔
- failure_action:失敗后如何做:continue, rollback(僅在update_config中有), or pause (默認(rèn) pause)
- monitor: 檢測失敗的時間檢測(默認(rèn)為5s,支持ns、us运提、ms蝗柔、s、m民泵、h)
- max_failure_ratio:最大失敗率
- order:有兩個stop-first(默認(rèn))和start-first癣丧,一個是先停止舊的,一個是先啟動新的栈妆,之后覆蓋舊的
以上胁编。