Docker 不同节点上的 swarm 副本

Docker swarm replicas on different nodes

我正在使用 docker-compose 文件版本 3,其部署密钥为 运行 群(docker 版本 1.13),我想复制一个服务为了使它恢复单节点故障。

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

deploy:
    replicas: 2

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

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

是否有一种简单的方法以通用方式指定此约束,而不必诉诸 global 和标签的组合来避免其他实例出现?

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

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

您使用的 docker 是什么版本?根据this post in 1.13 此类问题已得到纠正,请查看:https://github.com/docker/docker/issues/26259#issuecomment-260899732

希望这能回答您的问题。

docker/cli PR 1612 seems to resolve issue 26259, and has been released in docker 19.03.

Added new switch --replicas-max-per-node switch to docker service

How to verify it

Create two services and specify --replicas-max-per-node one of them:

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

See difference on command outputs:

$ 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

Create a service with max 2 replicas:

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

Update the service (max replicas should keep its value)

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

Update the max replicas to 1:

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

And reset to 0:

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

扩展 答案,并且在您的示例中,您使用的是撰写文件,而不是 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

中添加的