
Я пытаюсь настроить кластер «активный-активный» с помощью 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-адреса в строке пира.