. У меня есть кластер Docker Swarm с 12 узлами. Контейнеры, развернутые на одном узле, могут нормально связываться друг с другом через оверлейную сеть, но когда они развертываются на разных узлах, возникает проблема с подключением: имена хостов разрешены, и я могу пинговать один контейнер из другого, но когда я пытаюсь связаться с другим контейнером через tcp ( например, с помощью telnet) Я долго жду, а затем время ожидания соединения. Брандмауэр на каждом узле уже настроен для роя докеров с открытыми портами 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
Может ли кто-нибудь предложить обходной путь для этой проблемы?
Ответ найден здесь https://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else
Проблема была с неправильными контрольными суммами на исходящие пакеты. Которые из-за этого падали по сетевому интерфейсу.
Решением было отключить разгрузку контрольной суммы. Используя ethtool:
# ethtool -K <interface> tx off