前言
多節點 Swarm 集群下,可能節點的配置不同(比如 CPU、內存等),部署着不同類型的服務(比如 Web服務、Job服務等),當這些服務以 Service 或者 Stack 的形式部署到集群,默認情況下會隨機分配到各個節點。
- 場景1:不同類型的服務對服務器需求的資源是不同的,為了更合理的利用服務器資源,我們可能希望某些服務能夠部署到指定的服務器上。
- 場景2:Swarm 集群中的節點跨機房,為了內部服務間通信更快,我們可能希望關聯比較密切的服務能夠部署到同一機房的節點上。
以上場景要如何做到呢? 很簡單,先給節點添加標簽,然后服務發布時添加限制條件即可!
Node Label 管理
示例集群信息:
- 添加標簽
docker node update --label-add role=masl manager-node
- 查看標簽
docker node inspect manager-node
- 刪除標簽
docker node update --label-rm role manager-node
服務部署條件約束
- Service 方式
docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --replicas 2 -p 8081:8080 --constraint 'node.labels.role == masl' 172.16.99.2:40305/masl:dev-yc-67
- Stack 方式
version: '3.6' services: masl: image: 172.16.99.2:40305/masl:dev-yc-67 ports: - target: 8080 published: 8081 protocol: tcp mode: ingress deploy: mode: global placement: constraints: # 添加條件約束 - node.labels.role==role restart_policy: condition: on-failure max_attempts: 3
注:constraints
為數組,填寫多個約束時,它們之間的關系是 AND
條件約束補充
constraints
可以匹配
node
標簽和
engine
標簽,
engine.labels
適用於 Docker Engine 標簽,如操作系統,驅動程序等,
node.labels
適用於上述人為添加到節點的。
node | attribute matches | example |
---|---|---|
node.id | Node ID | node.id==2ivku8v2gvtg4 |
node.hostname | Node hostname | node.hostname!=node-2 |
node.role | Node role | node.role==manager |
node.labels | user defined node labels | node.labels.security==high |
engine.labels | Docker Engine's labels | engine.labels.operatingsystem==ubuntu 14.04 |
參考鏈接:https://www.jianshu.com/p/2a11a40a9573