Службы не запускаются на узлах Docker Swarm - PullRequest
0 голосов
/ 27 октября 2019

Я хочу развернуть HA Postgresql с Failover Patroni и HAProxy (например, с одной точкой входа) в Docker Swarm.

У меня есть 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

Когда я использую эту команду, мои службы создаются, но службы patroni2 и patroni3 не запускаются на другихузлы, роли которых работник . Они вообще не запускаются!

Я хочу увидеть, как мои службы развернуты на всех узлах (3 - один менеджер и два рабочих), которые существуют в Docker Swarm. Но если я удаляю ограничения, все мои службы запускаются на одномузел, когда я развертываю docker-compose.yml в Swarm.

Может быть, эти службы не видят мою сеть, хотя я развертываю ее, используя официальную документацию Docker.

1 Ответ

0 голосов
/ 27 октября 2019

При разных именах служб докер не будет пытаться распределить контейнеры по нескольким узлам и обратится к наименее используемому узлу, который удовлетворяет требованиям, где наименее используемое измеряется количеством запланированных контейнеров.

Вы можете попытаться решить эту проблему, используя то же имя службы и 3 реплики. Это потребует, чтобы они были определены одинаково. Чтобы сделать это, вы можете использовать несколько функций, во-первых, etcd.tasks будет преобразовываться в отдельные IP-адреса каждого etcd сервисного контейнера. А вторыми являются шаблоны служб , которые можно использовать для добавления значений, таких как {{.Task.Slot}}, в параметры имени хоста, монтирования тома и переменных env. Сложность в том, что список в конце, скорее всего, не даст вам того, что вы хотите, что является способом уникальной адресации каждой реплики из других реплик. Кажется, что имя хоста будет работать, но, к сожалению, оно не разрешается в реализации DNS докера (и его нелегко реализовать, поскольку возможно создать контейнер с возможностью изменять имя хоста после того, как докер его развернул).

Опция, с которой вам остается, настраивает ограничения для каждой службы для запуска на определенных узлах. Это не идеально, и снижает отказоустойчивость этих служб. Если у вас есть много узлов, которые можно разделить на 3 группы, то использование меток узлов решит проблему.

...