Сетка маршрутизации в режиме роя Docker не работает должным - PullRequest
2 голосов
/ 13 марта 2019

Я пытался создать сервисы в модели Docker Swarm, следуя этому документу

Я создал два узла в рое: enter image description here

Затем создайте службу развертывания, я использую jwilder/whoami здесь вместо nginx в документе, docker service create --name my-web --publish published=8888,target=8000 --replicas 2 jwilder/whoami

Похоже, они начали успешно: enter image description here

Как сказано в документе:

Когда вы обращаетесь к порту 8080 на любом узле, Docker направляет ваш запрос на активный контейнер.

ТАК, на мой взгляд, я могу получить доступ к службе my-web с любого узла, однако я обнаружил, что работает только один узел:

enter image description here

Что происходит?

1 Ответ

2 голосов
/ 15 марта 2019

Это может быть вызвано тем, что порты заблокированы между узлами. Сеть Swarm Mesh использует «входную» сеть для подключения опубликованного порта к VIP для службы. Эта входящая сеть является оверлейной сетью, реализованной с помощью vxlan. Для этого вам нужно:

  • TCP-порт 2377 для управления кластером
  • TCP и UDP-порт 7946 для связи между узлами
  • UDP-порт 4789 для наложения сетевого трафика

Ссылка: https://docs.docker.com/network/overlay/

Возможно, эти порты могут быть заблокированы на многих уровнях, включая iptables, брандмауэры на маршрутизаторах, и я даже видел, как VMware блокирует это с помощью своего инструмента NSX, который также реализовал vxlan.

Для iptables я обычно использую следующие команды:

iptables -A INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp -m udp --dport 4789 -j ACCEPT
iptables -A INPUT -p 50 -j ACCEPT

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

...