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

问题描述 投票:0回答:2

我想要一个服务被复制。

此服务在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:
docker docker-compose replication docker-swarm
2个回答
1
投票

使用1.13(see this PR)中引入的HA调度策略,除非其他节点不可用于调度,否则不应该从群集模式调度程序中执行此行为。如果已定义排除它的约束,或者您已定义节点上不可用的资源预留(CPU和内存),则节点可能无法进行调度。我没有看到你提供的撰写文件中的任何一个。

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

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

docker service update --force $service_name

0
投票

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

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

那样你的compose文件看起来像这样:

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:

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

© www.soinside.com 2019 - 2024. All rights reserved.