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中添加的
docker/cliPR 1612似乎解决了问题 26259,并已在docker 19.03中发布。
--replicas-max-per-node为 docker 服务添加了新的 switch开关如何验证
创建两个服务并指定
--replicas-max-per-node其中之一:Run Code Online (Sandbox Code Playgroud)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)"
错误消息将是:
no suitable node (max replicas per node limit exceed)
Run Code Online (Sandbox Code Playgroud)
创建最多包含 2 个副本的服务:
Run Code Online (Sandbox Code Playgroud)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将最大副本数更新为 1:
Run Code Online (Sandbox Code Playgroud)docker service update --replicas-max-per-node=1 test docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 1并重置为0:
Run Code Online (Sandbox Code Playgroud)docker service update --replicas-max-per-node=0 test docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 0
| 归档时间: |
|
| 查看次数: |
2908 次 |
| 最近记录: |