不同节点上的Docker群集副本
我正在使用docker compose file version 3及其部署密钥来运行swarm(docker version 1.13),我想复制一个服务,以使其能够再次恢复单节点故障 但是,当我添加这样的部署部分时:不同节点上的Docker群集副本,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我正在使用docker compose file version 3及其部署密钥来运行swarm(docker version 1.13),我想复制一个服务,以使其能够再次恢复单节点故障 但是,当我添加这样的部署部分时: deploy: replicas: 2 在我的四节点集群中,有时两个副本都安排在同一节点上。我缺少的是在不同节点上调度这两个实例的约束 我知道我可以使用global模式,但这会在每个节点上运行一个实例,也就是说,在我的例子中,四个实例而不是两个 是否有一种简单的方法可
deploy:
replicas: 2
在我的四节点集群中,有时两个副本都安排在同一节点上。我缺少的是在不同节点上调度这两个实例的约束
我知道我可以使用global
模式,但这会在每个节点上运行一个实例,也就是说,在我的例子中,四个实例而不是两个
是否有一种简单的方法可以以通用的方式指定此约束,而不必求助于全局
和标签的组合来避免其他实例
编辑:再次尝试后,我发现这次要在不同节点上安排容器。我开始怀疑我是否有一个
'node.hostname==X'
约束
编辑2:在另一次服务更新之后-并且没有任何放置约束-服务将再次在同一节点上计划(如所示):
您使用的是什么版本的docker?根据1.13中的这篇文章,此类问题已得到纠正,请务必查看: 希望这能回答您的问题。似乎已解决,并已于年发布 添加了新的交换机<代码>--每个节点的最大副本数代码>切换到docker服务 如何验证 创建两个服务并指定
--每个节点的最大副本数
其中一个:
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)
例如:
创建最多包含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
更新服务(最大副本数应保持其价值)
将最大副本数更新为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
扩展answer,正如在您的示例中使用的是compose文件,而不是cli,您可以为每个节点添加max\u replications\u:1
,如中所示
version: '3.8'
...
yourservice:
deploy:
replicas: 2
placement:
max_replicas_per_node: 1
组合架构版本3.8
在这里很关键,因为下面的3.8
不支持每个节点最多复制副本
这是在中添加的,对不起,我应该提到–1.13是我正在使用的版本。感谢链接到该问题-看起来它仍然是开放的。与该问题相关的是一个建议添加虚拟主机端口的解决方案:我想这可能会奏效,但感觉有点“黑客”。再次尝试后,我发现这次要在不同节点上调度容器。我开始怀疑我是否有一个'node.hostname==X'约束。那可能不是问题!我正在使用Docker 18.03,但仍遇到此问题。我对那个特殊的服务没有任何位置限制。我可能会尝试虚拟主机端口攻击。
version: '3.8'
...
yourservice:
deploy:
replicas: 2
placement:
max_replicas_per_node: 1