12개의 노드가 있는 docker swarm 클러스터가 있습니다. 단일 노드에 배포된 컨테이너는 오버레이 네트워크를 통해 서로 잘 연결할 수 있지만 다른 노드에 배포되면 연결 문제가 발생합니다. 호스트 이름이 확인되고 다른 컨테이너에서 한 컨테이너를 ping할 수 있지만 tcp를 통해 다른 컨테이너에 연결하려고 하면( 예를 들어 텔넷의 경우) 오래 기다리다가 연결 시간이 초과됩니다. 각 노드의 방화벽은 이미 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
그러나 다른 노드를 텔넷으로 연결하려고 하면(이 컨테이너에는 포트 80에서 수신 대기하는 nginx가 있습니다):
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-works-but-not-anything-else
문제는 아웃바운드 패킷의 잘못된 체크섬에 있었습니다. 그 때문에 네트워크 인터페이스가 중단되었습니다.
해결책은 체크섬 오프로딩을 비활성화하는 것이었습니다. ethtool 사용:
# ethtool -K <interface> tx off
답변2
여러 VMWare ESXi VM에 Docker Swarm 클러스터를 배포하고 @hattivatt가 제안한 솔루션을 시도했고 효과가 있었습니다. 그러나 이는 재부팅 후에도 지속되지 않으며 추가적인 노력이 필요했으며 솔직히 이 작업을 수행하는 적절한 방법은 아닌 것 같습니다.
docker swarm이 사용하는 데이터 포트(기본적으로 4789)를 변경했는데 작동했습니다!
docker swarm init --advertise-addr w.x.y.z --listen-addr w.x.y.z --data-path-port 1234
에 따르면포터그리고VM웨어, NSX를 사용할 때 이런 일이 발생하여 vxlan 포트에서 충돌이 발생할 수 있습니다.그러나 나는 그것을 사용하지 않습니다!