上一節我們討論了 Service 部署的兩種模式:global mode 和 replicated mode。無論采用 global mode 還是 replicated mode,副本運行在哪些節點都是由 Swarm 決定的,作為用戶我們有沒有可能精細控制 Service 的運行位置呢?
答案是:能,使用 label。
邏輯分兩步:
-
為每個 node 定義 label。
-
設置 service 運行在指定 label 的 node 上。
label 可以靈活描述 node 的屬性,其形式是 key=value,用戶可以任意指定,例如將 swarm-worker1
作為測試環境,為其添加 label env=test
:
docker node update --label-add env=test swarm-worker1
對應的,將 swarm-worker2
作為生產環境,添加 label env=prod
:
docker node update --label-add env=prod swarm-worker2
現在部署 service 到測試環境:
docker service create \
--constraint node.labels.env==test \
--replicas 3 \
--name my_web \
--publish 8080:80 \
httpd
--constraint node.labels.env==test
限制將 service 部署到 label=test 的 node,即 swarm-worker1
。從部署結果看,三個副本全部都運行在 swarm-worker1
上。
可以通過 docker service inspect
查看 --constraint
的設置:
更新 service,將其遷移到生產環境:
docker service update --constraint-rm node.labels.env==test my_web
docker service update --constraint-add node.labels.env==prod my_web
刪除並添加新的 constraint,設置 node.labels.env==prod
,最終所有副本都遷移到了 swarm-worker2
。
label 還可以跟 global 模式配合起來使用,比如只收集生產環境中容器的日志。
docker service create \
--mode global \
--constraint node.labels.env==prod \
--name logspout \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
gliderlabs/logspout
只有 swarm-worker2
節點上才會運行 logspout。
Label 就討論到這里,下一節我們學習 Health Check。
書籍:
1.《每天5分鍾玩轉Docker容器技術》
https://item.jd.com/16936307278.html
2.《每天5分鍾玩轉OpenStack》
https://item.jd.com/12086376.html