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 不支持。
中添加的
我正在使用 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 serviceHow 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
扩展 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 不支持。