Enjambre Docker. Los contenedores en una red superpuesta pero en diferentes nodos no pueden comunicarse entre sí a través de TCP

Enjambre Docker. Los contenedores en una red superpuesta pero en diferentes nodos no pueden comunicarse entre sí a través de TCP

Tengo un clúster Docker Swarm con 12 nodos. Los contenedores implementados en un solo nodo pueden comunicarse entre sí a través de una red superpuesta, pero cuando se implementan en diferentes nodos, hay problemas de conectividad: los nombres de host se resuelven y puedo hacer ping a un contenedor desde otro, pero cuando intento llegar a otro contenedor a través de tcp ( por ejemplo con telnet) Tengo una espera larga y luego se agota el tiempo de espera de la conexión. El firewall en cada nodo ya está configurado para Docker Swarm, con los puertos 2377, 7946 y 4789 abiertos.

Ejemplo: en mi nodo maestro ejecuté estos comandos para crear servicios programados para diferentes nodos:

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

Luego, desde el contenedor primero estoy ejecutando:

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

Pero luego, cuando intento conectar otro nodo con telnet (hay nginx en este contenedor escuchando en el puerto 80):

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

¿Alguien puede sugerir una solución para este problema?

Respuesta1

respuesta encontrada aquíhttps://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else

El problema estaba en las sumas de verificación incorrectas en los paquetes salientes. Que estaban cayendo en la interfaz de red debido a eso.

La solución fue desactivar la descarga de suma de comprobación. Usando ettool:

# ethtool -K <interface> tx off

Respuesta2

Implementé mi clúster Docker Swarm en varias máquinas virtuales VMWare ESXi y probé la solución que sugirió @hattivatt y funcionó. Sin embargo, esto no persiste al reiniciar y se requirió un esfuerzo adicional y, sinceramente, no parecía ser la forma correcta de hacerlo.

Cambié el puerto de datos que usa Docker Swarm (4789 por defecto) y ¡funcionó!

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

De acuerdo aporteroyVMware, esto podría suceder al usar NSX y provocar un conflicto en el puerto vxlan.Sin embargo, ¡no lo estoy usando!

información relacionada