ZBLOG

LVS负载后端两台服务器,使用IPIP包,有一台能正常收到包,有一台后端服务能收到IPIP的包,但是应用层没有收到包,需要如何排查配置

这个问题需要从网络协议栈的各个层面进行排查。以下是一个系统化的排查方案:

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>

请按照这个顺序排查,重点关注:

  1. rp_filter设置差异
  2. Calico节点配置一致性
  3. MTU和分片问题
  4. iptables/conntrack状态

建议先从前三个开始,这些是最常见的原因。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24384

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?