Docker swarm复制品在不同的节点上

时间:2017-03-06 11:43:49

标签: docker docker-compose docker-swarm

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

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

deploy:
    replicas: 2

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

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

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

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

编辑2:经过另一次服务更新 - 没有任何放置限制 - 再次在同一节点上安排服务(由ManoMarks Visualizer显示):

enter image description here

3 个答案:

答案 0 :(得分:2)

扩展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

中添加的

答案 1 :(得分:1)

您使用的是什么版本的泊坞窗?根据1.13中的这篇文章,这类问题已得到纠正,请看看:https://github.com/docker/docker/issues/26259#issuecomment-260899732

希望能回答你的问题。

答案 2 :(得分:1)

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