Docker群在不同节点上的副本

sas*_*sas 6 docker docker-compose docker-swarm

我正在使用带有其部署密钥的docker-compose文件版本3来运行群集(docker版本1.13),并且我想复制一项服务以使其再次具有弹性以应对单节点故障。

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

deploy:
    replicas: 2
Run Code Online (Sandbox Code Playgroud)

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

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

是否有一种简单的方法可以以通用的方式指定此约束,而不必求助于global和标签的组合以使其他实例远离?

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

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

在此处输入图片说明

小智 7

扩展VonC答案,并且在您的示例中,您使用的是撰写文件,而不是 cli,您可以添加max_replicas_per_node: 1,如

version: '3.8'
...
yourservice:
    deploy:
          replicas: 2
          placement:
            max_replicas_per_node: 1
Run Code Online (Sandbox Code Playgroud)

撰写模式版本3.8是这里的关键,因为下面不支持 max_replicas_per_node 3.8

这是在https://github.com/docker/cli/pull/1410中添加的


Von*_*onC 3

docker/cliPR 1612似乎解决了问题 26259,并已在docker 19.03中发布。

--replicas-max-per-node为 docker 服务添加了新的 switch开关

如何验证

创建两个服务并指定--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
Run Code Online (Sandbox Code Playgroud)

查看命令输出的差异:

$ 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)"   
Run Code Online (Sandbox Code Playgroud)

错误消息将是:

no suitable node (max replicas per node limit exceed)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

更新服务(最大副本数应保持其值)

docker service update --replicas=1 test
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
2
Run Code Online (Sandbox Code Playgroud)

将最大副本数更新为 1:

docker service update --replicas-max-per-node=1 test
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
1
Run Code Online (Sandbox Code Playgroud)

并重置为0:

docker service update --replicas-max-per-node=0 test
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
0
Run Code Online (Sandbox Code Playgroud)