0

我想在 docker swarm 中部署带有故障转移 Patroni 和 HAProxy(如单个入口点)的 HA Postgresql。

我有 docker-compose.yml -

version: "3.7"

services:
    etcd1:
        image: patroni
        networks:
          - test
        env_file:
          - docker/etcd.env
        container_name: test-etcd1
        hostname: etcd1
        command: etcd -name etcd1 -initial-advertise-peer-urls http://etcd1:2380


    etcd2:
        image: patroni
        networks:
          - test
        env_file:
          - docker/etcd.env
        container_name: test-etcd2
        hostname: etcd2
        command: etcd -name etcd2 -initial-advertise-peer-urls http://etcd2:2380

    etcd3:
        image: patroni
        networks:
          - test
        env_file:
          - docker/etcd.env
        container_name: test-etcd3
        hostname: etcd3
        command: etcd -name etcd3 -initial-advertise-peer-urls http://etcd3:2380

    patroni1:
        image: patroni
        networks:
          - test
        env_file:
          - docker/patroni.env
        hostname: patroni1
        container_name: test-patroni1
        environment:
            PATRONI_NAME: patroni1
        deploy:
          placement:
            constraints: [node.role == manager]
#              - node.labels.type == primary
#              - node.role == manager

    patroni2:
        image: patroni
        networks:
          - test
        env_file:
          - docker/patroni.env
        hostname: patroni2
        container_name: test-patroni2
        environment:
            PATRONI_NAME: patroni2
        deploy:
          placement:
            constraints: [node.role == worker]
#              - node.labels.type != primary
#              - node.role == worker

    patroni3:
        image: patroni
        networks:
          - test
        env_file:
          - docker/patroni.env
        hostname: patroni3
        container_name: test-patroni3
        environment:
            PATRONI_NAME: patroni3
        deploy:
          placement:
            constraints: [node.role == worker]
#              - node.labels.type != primary
#              - node.role == worker

    haproxy:
        image: patroni
        networks:
          - test
        env_file:
          - docker/patroni.env
        hostname: haproxy
        container_name: test-haproxy
        ports:
            - "5000:5000"
            - "5001:5001"
        command: haproxy

networks:   
  test:
    driver: overlay
    attachable: true

并使用以下命令在 docker swarm 中部署此服务:

docker stack deploy --compose-file docker-compose.yml test

当我使用此命令时,我的服务正在创建,但 service patoni2parents3不会在其他节点上启动,这些节点的角色是worker。他们根本没有开始!

我希望看到我的服务部署在 docker swarm 中存在的所有节点(3 - 一名经理和两名工作人员)上但是如果我删除约束,当我在 swarm 中部署 docker-compose.yml 时,我的所有服务都在一个节点上开始。

可能是这个服务看不到我的网络,尽管我使用 docker 官方文档部署它。

4

1 回答 1

0

使用不同的服务名称,docker 不会尝试将容器分散到多个节点上,而是会回退到满足要求的最少使用的节点,其中最少使用的节点是通过调度容器的数量来衡量的。

您可以尝试通过使用相同的服务名称和 3 个副本来解决此问题。这将要求它们的定义相同。为了使这项工作发挥作用,您可以利用一些功能,第一个功能etcd.tasks将解析为每个etcd服务容器的单独 IP 地址。第二个是服务模板,可用于注入诸如{{.Task.Slot}}进入主机名、卷安装和环境变量的设置。挑战在于最后的列表可能不会给您想要的东西,这是一种从其他副本中唯一地解决每个副本的方法。主机名似乎可以工作,但不幸的是,它在 docker 的 DNS 实现中没有解析(并且不容易实现,因为可以创建一个容器,在 docker 部署后具有更改主机名的能力)。

您剩下的选项是配置每个服务的约束以在特定节点上运行。这不太理想,并且降低了这些服务的容错能力。如果您有很多可以分成 3 组的节点,那么使用节点标签可以解决问题。

于 2019-10-27T16:15:58.383 回答