在同一节点中复制的服务-Docker



我希望复制一个服务。

此服务在Worker角色上复制,在某些情况下,服务在同一节点中复制两次,而不是每个节点复制一次。

我的docker-compose.yml

version: "3"
services:
api-test:
# replace username/repo:tag with your name and image details
image: some-image
deploy:
replicas: 2
placement:
constraints:
- node.role == worker
restart_policy:
condition: on-failure
ports:
- "4001:80"
networks:
- some-network
networks:
some-network:

使用1.13中引入的HA调度策略(请参阅本PR),除非其他节点无法进行调度,否则群模式调度器不可能执行此行为。如果定义了排除节点的约束,或者定义了节点上不可用的资源预留(CPU和内存),则节点可能无法进行调度。在您提供的撰写文件中,我没有看到任何一个。

一个潜在的问题是重新启动策略。这定义了单个容器的重新启动策略,同时您还可以在中断后使用集群模式重新部署容器。结果可能是运行的复制副本太多。因此,我建议从您的服务中删除restart_policy部分,并让swarm模式单独处理调度。

否则,我看到的一个节点上有多个容器的主要原因是重新启动集群中的节点。Swarm模式将重新安排仍在运行的节点(或第一个要重新启动的节点)上的服务,一旦其他节点重新连接,它不会先发制人地停止正在运行的任务,将其安排在另一个节点上。您可以使用以下命令强制服务重新平衡:

docker service update --force $service_name

这实际上是Docker Swarm的正常行为。您可以看到Swarm根据许多标准(每个工作负载、可用性等)选择节点来部署服务。

因此,如果您想确保在每个节点上复制具有特定标签/角色的服务(例如worker),则应该使用global模式而不是replicas模式(请参阅此处)。

这样你的合成文件就会看起来像这样:

version: "3"
services:
api-test:
# replace username/repo:tag with your name and image details
image: some-image
deploy:
mode: global
placement:
constraints:
- node.role == worker
restart_policy:
condition: on-failure
ports:
- "4001:80"
networks:
- some-network
networks:
some-network:

这将在每个worker节点上仅部署一次api-test服务。

最新更新