HAProxy-пиры как развертывание роя

HAProxy-пиры как развертывание роя

Я пытаюсь настроить кластер «активный-активный» с помощью swarm и haproxy. Я борюсь с определением пиров, поскольку оно учитывает имя хоста и IP-адрес. С swarm это может быть немного сложно.

Я хочу использовать режим host для портов на прокси-сервере, чтобы иметь возможность маршрутизировать трафик с помощью DNS и TCP Roundrobin на узлы прокси-сервера.

 proxy:
    image: "saps-proxy:5"
    hostname: '{{.Node.Hostname}}'
    dns: 127.0.0.11
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
      - target: 1024
        mode: host
        protocol: tcp
    deploy:
      mode: global
      placement: { constraints: ["node.labels.type == proxy"] }
      resources: { limits: { memory: 2G } }

В haproxy.cfg я определяю раздел peers.

peers layer7-loadbalancer
    bind *:1024
    server hostname1.bloom.com
    server hostname2.bloom.com 10.128.0.2:1024  # (ip of real host)

Кажется, это работает для локального пира. Но я думаю, что на самом деле он использует IP контейнера. Я также не могу создавать реплики из этого.

Поэтому я пробую другой синтаксис. При таком написании HAProxy будет связывать IP:port с именем пира, которое соответствует имени хоста.

peers layer7-loadbalancer
    peer hostname1.bloom.com 10.128.0.1:1024  # (ip of real host)
    peer hostname2.bloom.com 10.128.0.2:1024  # (ip of real host)

Но я получаю сообщение об ошибке.

Starting proxy hostname1.bloom.com: 
cannot bind socket (Cannot assign requested address) [10.128.0.1:1024]

Это имеет смысл, поскольку IP-адрес контейнера на самом деле не является IP-адресом хоста. Вот почему этот адрес не может быть привязан изнутри контейнера.

На данный момент я не совсем уверен, как решить эту проблему.

решение1

Вы включили DNS (dns: 127.0.0.11), поэтому используйте имя службы вместо IP-адреса в строке пира.

Связанный контент