我有一個 12 個節點的 docker swarm 叢集。部署在單一節點上的容器可以透過覆蓋網路很好地相互訪問,但是當它們部署在不同的節點上時,會出現連接問題:主機名稱已解析,我可以從另一個容器ping 通一個容器,但是當我嘗試透過tcp 存取其他容器時(例如使用 telnet)我等待很長時間,然後連接逾時。每個節點上已經為 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
但是,當我嘗試使用 telnet 連接其他節點時(此容器中有 nginx 正在偵聽連接埠 80):
root@37be801ebe8b:/# telnet second 80
Trying 10.0.5.18...
telnet: Unable to connect to remote host: Connection timed out
有人可以建議解決這個問題的方法嗎?
答案1
問題在於出站資料包的校驗和錯誤。因此,哪些內容被網路介面丟棄。
解決方案是停用校驗和卸載。使用ethtool:
# ethtool -K <interface> tx off
答案2
我在多個 VMWare ESXi 虛擬機器上部署了 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