这个问题需要从网络协议栈的各个层面进行排查。以下是一个系统化的排查方案:
1. 基础网络连通性检查
检查IPIP隧道状态
# 在两台后端服务器上检查tunl0状态
ip addr show tunl0
ip link show tunl0
# 确认tunl0接口是否UP
ip link set tunl0 up # 如果状态为DOWN
验证路由配置
# 检查是否有正确的路由指向tunl0
ip route show table all | grep tunl0
# 预期应该看到类似:
# 10.96.0.0/12 dev tunl0 scope link
# 或者Calico相关的路由
2. IPIP包接收情况分析
使用tcpdump抓包分析
# 在异常服务器上同时抓取多个接口的包
tcpdump -i any -n host <VIP> -w /tmp/debug.pcap &
# 或者分别抓取
tcpdump -i eth0 -n host <VIP> # 物理网卡
tcpdump -i tunl0 -n host <VIP> # IPIP隧道接口
检查IPIP包的解封装
# 查看IPIP相关的iptables规则
iptables -t mangle -L -v -n
iptables -t nat -L -v -n
# 检查是否有DROP规则影响
iptables -L -v -n | grep DROP
3. 内核参数和系统配置
检查IP转发和路由相关参数
# 确认IP转发已开启(两台服务器应该一致)
sysctl net.ipv4.ip_forward
# 检查RP_filter(严格反向路径校验)
sysctl net.ipv4.conf.all.rp_filter
sysctl net.ipv4.conf.tunl0.rp_filter
# 临时关闭RP_filter测试(生产环境谨慎)
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
检查conntrack状态
# 查看连接跟踪表大小和状态
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
# 清空conntrack表测试(临时)
conntrack -F
4. Calico特定配置排查
检查Calico节点配置差异
# 比较两台节点的Calico配置差异
calicoctl get node <node-name> -o yaml
# 重点检查:
# - IP地址分配
# - BGP配置
# - IPIP模式设置
calicoctl get ippool -o yaml # IP池配置对比两台节点是否一致?
Felix日志分析
kubectl logs -n kube-system daemonset/calico-node | grep -i drop
journalctl -u calico-felix | grep DROP # systemd系统适用?
5. LVS和后端服务排查
确认LVS转发模式和后端健康状态
ipvsadm -ln # LVS虚拟服务和真实服务器列表?
curl http://<VIP>:<port>/health # VIP本身是否能访问?
ss-tulnp | grep <service-port> # backend本地端口监听正常吗?
netstat-an | grep <port>
6. MTU和分片问题排查
MTU一致性检查
ip link show | grep mtu # eth0, tunl0等接口MTU值?
ping-s1472-Mdo<目标IP> # PMTU发现测试,1480-8=1472有效载荷?
tracepath<目标IP> # MTU路径发现!
注意:eth0 MTU(1500) = IP头(20) + IPIP头(20) + inner packet(1460),所以应用层数据超过1460字节可能被分片。
快速诊断脚本
创建一个诊断脚本在两台服务器上运行对比:
#!/bin/bash
echo "=== Network Interface Status ===" ip addr show tunl0 ip addr show eth0 echo""
echo "=== Routing Table ===" ip route show table all | grep tunl0 echo""
echo "=== Sysctl Parameters ===" sysctl net.ipv4.ip_forward sysctl net.ipv4.conf.all.rp_filter sysctl net.ipv4.conf.tunl0.rp_filter echo""
echo "=== Iptables Rules ===" iptables-t mangle-L-v-n | head-20 echo""
echo "=== Service Listening ===" ss-tulnp | grep:<service-port>
请按照这个顺序排查,重点关注:
rp_filter设置差异
- Calico节点配置一致性
- MTU和分片问题
- iptables/conntrack状态
建议先从前三个开始,这些是最常见的原因。
内容由零声教学AI助手提供,问题来源于学员提问




