用 Label 控制 Service 的位置 - 每天5分鍾玩轉 Docker 容器技術(106)


上一節我們討論了 Service 部署的兩種模式:global mode 和 replicated mode。無論采用 global mode 還是 replicated mode,副本運行在哪些節點都是由 Swarm 決定的,作為用戶我們有沒有可能精細控制 Service 的運行位置呢?

答案是:能,使用 label。

邏輯分兩步:

  1. 為每個 node 定義 label。

  2. 設置 service 運行在指定 label 的 node 上。

label 可以靈活描述 node 的屬性,其形式是 key=value,用戶可以任意指定,例如將 swarm-worker1 作為測試環境,為其添加 label env=test

docker node update --label-add env=test swarm-worker1

544.png

對應的,將 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

545.png

--constraint node.labels.env==test 限制將 service 部署到 label=test 的 node,即 swarm-worker1。從部署結果看,三個副本全部都運行在 swarm-worker1 上。

可以通過 docker service inspect 查看 --constraint 的設置:

546.png

更新 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

547.png

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。

548.png

Label 就討論到這里,下一節我們學習 Health Check。

書籍:

1.《每天5分鍾玩轉Docker容器技術》
https://item.jd.com/16936307278.html

2.《每天5分鍾玩轉OpenStack》
https://item.jd.com/12086376.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM