我使用docker-compose文件版本3及其部署密钥来运行swarm(docker版本1.13),我想复制一个服务,以使其再次恢复单节点故障。
但是,当我添加像这样的部署部分时:
deploy:
replicas: 2
在我的四节点集群中,我有时最终会在同一节点上安排两个副本。我缺少的是一个约束,它在不同的节点上调度两个实例。
我知道我可以使用global
模式但是会在每个节点上运行一个实例,即我的情况下只有四个实例而不是两个实例。
是否有一种简单的方法可以通用方式指定此约束,而无需使用global
和标签的组合来保持其他实例远离?
编辑:再次尝试后,我发现这次要在不同的节点上安排容器。我开始怀疑自己是否有'node.hostname == X'
约束。
编辑2:经过另一次服务更新 - 没有任何放置限制 - 再次在同一节点上安排服务(由ManoMarks Visualizer显示):
答案 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。
答案 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