Docker Swarm. Container in einem Overlay-Netzwerk, aber auf verschiedenen Knoten, können sich nicht über TCP erreichen.

Docker Swarm. Container in einem Overlay-Netzwerk, aber auf verschiedenen Knoten, können sich nicht über TCP erreichen.

Ich habe einen Docker-Swarm-Cluster mit 12 Knoten. Auf einem einzelnen Knoten bereitgestellte Container können sich problemlos über ein Overlay-Netzwerk erreichen, aber wenn sie auf verschiedenen Knoten bereitgestellt werden, gibt es Verbindungsprobleme: Hostnamen werden aufgelöst und ich kann einen Container von einem anderen aus anpingen, aber wenn ich versuche, einen anderen Container über TCP zu erreichen (z. B. mit Telnet), muss ich lange warten und dann kommt es zu einem Verbindungstimeout. Die Firewall auf jedem Knoten ist bereits für Docker Swarm eingerichtet, wobei die Ports 2377, 7946 und 4789 geöffnet sind.

Beispiel: Auf meinem Masterknoten habe ich diese Befehle ausgeführt, um für verschiedene Knoten geplante Dienste zu erstellen:

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

Dann führe ich zuerst vom Container aus:

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

Aber dann, wenn ich versuche, einen anderen Knoten mit Telnet zu verbinden (in diesem Container befindet sich Nginx, das auf Port 80 lauscht):

root@37be801ebe8b:/# telnet second 80
Trying 10.0.5.18...
telnet: Unable to connect to remote host: Connection timed out

Kann jemand eine Problemumgehung für dieses Problem vorschlagen?

Antwort1

Antwort hier gefundenhttps://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else

Das Problem lag in den falschen Prüfsummen der ausgehenden Pakete, die deshalb von der Netzwerkschnittstelle gelöscht wurden.

Die Lösung bestand darin, das Checksum-Offloading zu deaktivieren. Mit ethtool:

# ethtool -K <interface> tx off

Antwort2

Ich habe meinen Docker Swarm-Cluster auf mehreren VMWare ESXi-VMs bereitgestellt und die von @hattivatt vorgeschlagene Lösung ausprobiert. Sie hat funktioniert. Allerdings bleibt dies nach einem Neustart nicht bestehen und erforderte zusätzlichen Aufwand. Ehrlich gesagt schien dies nicht der richtige Weg zu sein.

Ich habe den von Docker Swarm verwendeten Datenport geändert (standardmäßig 4789) und es hat funktioniert!

docker swarm init --advertise-addr w.x.y.z --listen-addr w.x.y.z --data-path-port 1234

EntsprechendTrägerUndVMWare, dies könnte bei der Verwendung von NSX passieren und einen Konflikt am VXLAN-Port verursachen.Ich benutze es jedoch nicht!

verwandte Informationen