Enxame Docker. Contêineres em uma rede sobreposta, mas em nós diferentes, não podem se comunicar via tcp

Enxame Docker. Contêineres em uma rede sobreposta, mas em nós diferentes, não podem se comunicar via tcp

Eu tenho um cluster docker swarm com 12 nós. Os contêineres implantados em um único nó podem se comunicar perfeitamente por meio da rede de sobreposição, mas quando são implantados em nós diferentes, há problemas de conectividade: os nomes dos hosts são resolvidos e posso executar ping em um contêiner de outro, mas quando tento acessar outro contêiner via tcp ( por exemplo, com telnet) estou recebendo uma longa espera e depois o tempo limite da conexão. O firewall em cada nó já está configurado para o docker swarm, com as portas 2377, 7946 e 4789 abertas.

Exemplo: No meu nó mestre executei estes comandos para criar serviços agendados para diferentes nós:

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

Então, primeiro, do contêiner, estou executando:

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

Mas então, quando estou tentando conectar outro nó com telnet (há nginx neste contêiner escutando na porta 80):

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

Alguém pode sugerir uma solução alternativa para esse problema?

Responder1

Resposta encontrada aquihttps://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else

O problema estava nas somas de verificação incorretas nos pacotes de saída. Que estavam caindo na interface de rede por causa disso.

A solução foi desabilitar o descarregamento da soma de verificação. Usando ettool:

# ethtool -K <interface> tx off

Responder2

Implantei meu cluster Docker Swarm em várias VMs VMWare ESXi e tentei a solução sugerida por @hattivatt e funcionou. No entanto, isso não persiste durante a reinicialização e foi necessário um esforço adicional e, honestamente, não parecia ser a maneira correta de fazer isso.

Mudei a porta de dados que o docker swarm usa (4789 por padrão) e funcionou!

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

De acordo comportêinereVMware, isso pode acontecer ao usar o NSX, causando conflito na porta vxlan.Porém, não estou usando!

informação relacionada