【问题标题】:Docker swarm replicas on different nodes不同节点上的 Docker swarm 副本
【发布时间】:2017-03-06 11:43:49
【问题描述】:

我正在使用 docker-compose 文件版本 3 及其部署密钥来运行 swarm(docker 版本 1.13),我想复制一个服务以使其再次恢复单节点故障。

但是,当我添加这样的部署部分时:

deploy:
    replicas: 2

在我的四节点集群中,有时我会在同一个节点上安排两个副本。我缺少的是在不同节点上安排两个实例的约束。

我知道我可以使用 global 模式,但这会在每个节点上运行一个实例,即在我的情况下是四个实例而不是两个。

是否有一种简单的方法可以以通用方式指定此约束,而无需使用global 和标签的组合来阻止其他实例?

编辑:再次尝试后,我发现这次容器要安排在不同的节点上。我开始怀疑我是否设置了'node.hostname == X' 约束。

编辑 2:在另一个服务更新后 - 并且没有任何放置限制 - 服务再次被安排在同一节点上(如 ManoMarks Visualizer 所示):

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    扩展VonC 答案,并且在您的示例中,您使用的是撰写文件,而不是cli,您可以添加max_replicas_per_node: 1,如

    version: '3.8'
    ...
    yourservice:
        deploy:
              replicas: 2
              placement:
                max_replicas_per_node: 1
    

    组合模式版本3.8 是这里的关键,因为3.8 以下不支持 max_replicas_per_node。

    这是在https://github.com/docker/cli/pull/1410中添加的

    【讨论】:

      【解决方案2】:

      docker/cli PR 1612 好像解决了issue 26259,并且已经在docker 19.03 发布了。

      新增开关--replicas-max-per-node 切换到docker服务

      如何验证

      创建两个服务并指定--replicas-max-per-node其中之一:

      docker service create --detach=true --name web1 --replicas 2 nginx
      docker service create --detach=true --name web2 --replicas 2 --replicas-max-per-node 1 nginx
      

      查看命令输出的差异:

      $ docker service ls
      ID                  NAME                MODE                REPLICAS               IMAGE               PORTS
      0inbv7q148nn        web1                replicated          2/2                    nginx:latest        
      9kry59rk4ecr        web2                replicated          1/2 (max 1 per node)   nginx:latest
      
      $ docker service ps --no-trunc web2
      ID                          NAME                IMAGE                                                                                  NODE                DESIRED STATE       CURRENT STATE            ERROR                                                     PORTS
      bf90bhy72o2ry2pj50xh24cfp   web2.1              nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c   limint              Running             Running 34 seconds ago                                                             
      xedop9dwtilok0r56w4g7h5jm   web2.2              nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c                       Running             Pending 35 seconds ago   "no suitable node (max replicas per node limit exceed)"   
      

      错误信息是:

      no suitable node (max replicas per node limit exceed)
      

      来自Sebastiaan van Stijn的示例:

      创建一个最多包含 2 个副本的服务:

      docker service create --replicas=2 --replicas-max-per-node=2 --name test nginx:alpine
      docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
      2
      

      更新服务(最大副本数应保持其值)

      docker service update --replicas=1 test
      docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
      2
      

      将最大副本数更新为 1:

      docker service update --replicas-max-per-node=1 test
      docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
      1
      

      并重置为 0:

      docker service update --replicas-max-per-node=0 test
      docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
      0
      

      【讨论】:

        【解决方案3】:

        您使用的是什么版本的 docker?根据 1.13 的这个帖子,这种问题已经修复,请看:https://github.com/docker/docker/issues/26259#issuecomment-260899732

        希望能回答你的问题。

        【讨论】:

        • 对不起,我应该提到 - 1.13 是我使用的版本。
        • 感谢您提供指向该问题的链接 - 不过它似乎仍然处于打开状态。与该问题相关的是建议添加虚拟主机端口的解决方法:github.com/docker/docker/issues/26259#issuecomment-277716832 我想这会起作用,但感觉有点“hacky”。​​
        • 再次尝试后,我发现这一次容器将被安排在不同的节点上。我开始怀疑我是否有一个 'node.hostname == X' 约束。那么可能不是问题!
        • 我正在使用 Docker 18.03 并且仍然遇到问题。而且我对该特定服务没有任何放置限制。我可能会尝试虚拟主机端口破解。
        猜你喜欢
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        相关资源
        最近更新 更多