已排查:1.ufw?status?防火墻已關閉??2.selinux已關閉???3.netstat -ntpl ?:::8088 未限制ip
問題:docker swarm多主機之間的端口無法訪問,但能ping通,同一主機下的端口也可以訪問。
原因:docker overlay網絡內部使用vxlan技術實現網絡內部互通,通過 udp 4789 端口進行流量轉發,此端口可以在swarm初始化時修改。
解決:tcpdump每臺機器物理網卡的4789端口的流量:tcpdump -i ens160 udp port 4789 -vv -X;
在worker節點上訪問manager節點的tcp 9999服務,可以看到如下報文:
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
13:40:49.011232 IP (tos 0x0, ttl 64, id 25866, offset 0, flags [none], proto UDP (17), length 110)
????master-01.41787 > 10.168.1.181.4789: [bad udp cksum 0x174d -> 0x4773!] UDP, length 82
0x0000: ?4500 006e 650a 0000 4011 fcc6 0aa8 01aa ?E..ne...@.......
顯示udp報文異常:bad udp cksum 0x174d -> 0x4773,原因是linux默認開啟了內核計算cksum和網卡計算cksum,此處一般為網卡計算cksum錯誤,需要關閉網卡計算的功能;
命令 ethtool -k ens160 查看開啟的情況。
其中tx-checksumming為網卡計算cksum的配置項,需要將其關閉:
ethtool --offload ens160 tx off
同時需要將manager節點的此配置也關閉,步驟同上;
最后檢查是否可以連通即可。
開機自動關閉:修改 /root/.bashrc 文件,添加如下行:
# disable ts-checksumming on boot
/sbin/ethtool --offload ens160 tx off
注意:修改/root/.bashrc 文件只會在以 root 用戶身份登錄時生效。對所有用戶生效可以修改/etc/bashrc