У меня есть кластер docker swarm с 12 узлами. Контейнеры, развернутые на одном узле, могут нормально связываться друг с другом через оверлейную сеть, но когда они развернуты на разных узлах, возникают проблемы с подключением: имена хостов разрешаются, и я могу пинговать один контейнер с другого, но когда я пытаюсь связаться с другим контейнером по tcp (например, с помощью telnet), я получаю долгое ожидание, а затем тайм-аут соединения. Брандмауэр на каждом узле уже настроен для docker swarm, с открытыми портами 2377, 7946 и 4789.
Пример: На моем главном узле я выполнил следующие команды, чтобы создать службы, запланированные для разных узлов:
docker network create -d overlay test_net
docker service create --constraint node.labels.first==true --name first --network test_net ubuntu/nginx:1.18-20.04_beta
docker service create --constraint node.labels.second==true --name second --network test_net ubuntu/nginx:1.18-20.04_beta
Затем из контейнера сначала запускаю:
root@37be801ebe8b:/# ping second
PING second (10.0.5.18): 56 data bytes
64 bytes from 10.0.5.18: icmp_seq=0 ttl=64 time=0.092 ms
64 bytes from 10.0.5.18: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 10.0.5.18: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 10.0.5.18: icmp_seq=3 ttl=64 time=0.073 ms
^C--- second ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.079/0.092/0.000 ms
Но затем, когда я пытаюсь подключиться к другому узлу с помощью telnet (в этом контейнере есть nginx, прослушивающий порт 80):
root@37be801ebe8b:/# telnet second 80
Trying 10.0.5.18...
telnet: Unable to connect to remote host: Connection timed out
Может ли кто-нибудь предложить решение этой проблемы?
решение1
Ответ найден здесьhttps://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-работает-но-не-что-либо-еще
Проблема была в плохих контрольных суммах исходящих пакетов. Из-за этого они отбрасывались сетевым интерфейсом.
Решением было отключить выгрузку контрольной суммы. Используя ethtool:
# ethtool -K <interface> tx off
решение2
Я развернул свой кластер Docker Swarm на нескольких виртуальных машинах VMWare ESXi и попробовал решение, предложенное @hattivatt, и оно сработало. Однако это не сохраняется после перезагрузки, и потребовались дополнительные усилия, и, честно говоря, это не показалось мне правильным способом сделать это.
Я изменил порт данных, который использует Docker Swarm (по умолчанию 4789), и это сработало!
docker swarm init --advertise-addr w.x.y.z --listen-addr w.x.y.z --data-path-port 1234
В соответствии спортьеиVMWareэто может произойти при использовании NSX, вызывая конфликт на порту vxlan.Но я им не пользуюсь!