用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 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

技术分享图片

对应的,将 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

技术分享图片

以上是关于用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)的主要内容,如果未能解决你的问题,请参考以下文章

深入玩转K8S之利用Label控制Pod位置

用 label 控制 Pod 的位置 - 每天5分钟玩转 Docker 容器技术(128)

k8s通过label来控制pod的位置

k8d创建资源(负载均衡原理,回滚指定版本,label控制pod的位置)

四控制执行流程

C# 用FOR循环控制Label控件方法~!