跨主机容器网络不通?高效排错指南
问题现象与排查前提
当跨主机部署的容器无法通过IP或服务名互访时,通常表现为Ping失败或业务请求超时。排错前需确认:所有主机节点网络互通(同一子网或已路由可达)、容器运行时(Docker/Containerd)和CNI插件(Calico/Flannel/Weave)已正确安装且状态正常。
逐层排查四步法
第一步:确认容器内部网络栈
在问题容器内执行ip addr查看IP配置,ip route检查默认路由,确保有指向网关的条目。使用ping 测试,若不通则检查容器端口映射或防火墙规则(iptables -L -n)。
第二步:验证宿主机侧转发
在源宿主机执行ip route get ,确认路由指向正确的CNI接口。检查/proc/sys/net/ipv4/ip_forward是否为1。使用tcpdump -i any icmp抓包,观察数据包是否到达宿主机。
第三步:检查CNI插件与Overlay网络
- Flannel/VXLAN:确认宿主机间UDP 8285/8472端口可通,检查etcd中网络配置。
- Calico:检查BGP邻居状态(
calicoctl node status),确认IP池与路由策略正确。 - Weave:执行
weave status查看连接情况和DNS解析。
第四步:检查网络策略与安全组
Kubernetes环境下,检查NetworkPolicy是否误拦截。公有云环境需确认安全组或ACL放行了容器网络CIDR之间的流量。若使用iptables,执行iptables -L -n --line-numbers查看FORWARD链规则,确保CNI插件生成的规则未被覆盖。
常见根因速查表
- 宿主机隧道端口不通:云防火墙或物理防火墙阻断了VXLAN/IPIP端口。
- MTU不匹配:Overlay网络封装后包体超过MTU,导致分片丢失。建议统一设置MTU为1450或更低。
- IP地址冲突:不同集群或容器使用了重叠CIDR,导致路由混乱。
- CNI插件状态异常:重启容器引擎或重置CNI配置(例如
systemctl restart kubelet && systemctl restart docker)。 - 内核参数未开启:
net.bridge.bridge-nf-call-iptables=1缺失导致桥接流量被iptables丢弃。
诊断工具推荐
使用nsenter -t -n ip addr直接进入容器网络命名空间。跨主机测试工具可选择iperf3或mtr。对于Kubernetes环境,kubectl exec配合busybox镜像的wget或nc进行服务级连通性验证。
遵循以上结构化排错流程,80%以上的跨主机容器网络问题可在10分钟内定位根因。