1. 问题背景:OKE集群中的TCP流量异常
那天凌晨2点37分,我正盯着监控大屏上突然飙升的TCP重传率曲线发呆。这个运行在Oracle Kubernetes Engine(OKE)上的电商应用集群,从23分钟前开始出现诡异的网络行为——部分服务的TCP连接就像掉进了黑洞,发出的数据包有去无回。
关键现象:TCP握手成功率98.2%(正常),但建立连接后15%的请求会在第三次数据传输时超时,且tcpdump显示服务端确实收到了SYN但未回复ACK。
2. 排查路线图设计
2.1 初始假设验证
首先排除了最明显的可能性:
- 防火墙规则:检查了NSG和SL规则,确认50000-32767端口段放行
- 负载均衡:LB健康检查通过,后端实例均在线
- 基础资源:节点CPU/内存/网络带宽均有余量
bash复制# 验证conntrack表状态
watch -n 1 'cat /proc/sys/net/netfilter/nf_conntrack_count'
# 输出显示连接数在12000左右波动(未达上限)
2.2 TCP协议栈深度检查
当常规手段无效时,我们转向内核参数分析:
bash复制sysctl -a | grep -E 'net.ipv4.tcp_.*timeout'
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_retries2 = 15
发现tcp_retries2参数异常(默认15次重试,实际配置为5)。但这只能解释部分超时,无法说明为何特定数据包消失。
3. 关键转折点:MTU与TCP Segmentation
3.1 数据包大小分析
通过tcpdump捕获异常流量时,注意到一个规律:
text复制18:42:15.123456 IP 10.0.1.12.34234 > 10.0.2.15.8080: Flags [P.], seq 1:1449, ack 1, win 501, options [nop,nop,TS val 100 ecr 200], length 1448
18:42:15.123789 IP 10.0.1.12.34234 > 10.0.2.15.8080: Flags [P.], seq 1449:1453, ack 1, win 501, options [nop,nop,TS val 101 ecr 200], length 4
# 第二个包永远丢失!
3.2 网络拓扑还原
OKE的默认CNI配置(使用OCI VCN-Native Pod Networking)会创建veth pair设备,其MTU默认为1500。但实际物理网络存在以下路径:
mermaid复制graph TD
Pod-->veth0(MTU1500)
veth0-->cni0(MTU1500)
cni0-->eth0(MTU9000)
eth0-->物理交换机(MTU1500)
这种MTU不匹配导致大包被丢弃,且由于TCP MSS协商机制缺陷,没有正确触发PMTUD。
4. 解决方案与验证
4.1 临时修复方案
在受影响Pod中强制设置MTU:
yaml复制apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
initContainers:
- name: set-mtu
image: busybox
command: ["ip", "link", "set", "dev", "eth0", "mtu", "1400"]
securityContext:
privileged: true
4.2 永久修复方案
修改OKE集群的CNI配置:
bash复制kubectl edit configmap -n kube-system cni-config
# 添加以下字段
{
"mtu": 1400,
"plugins": [
{
"type": "oci-vcn-ip",
"mtu": 1400
}
]
}
5. 经验总结与避坑指南
- MTU检测脚本:部署前建议运行以下检查
bash复制ping -M do -s 1472 -c 3 <目标IP> # 1472+28=1500
- OKE特定建议:
- 使用Terratest在CI/CD中集成网络验证
- 避免混合使用不同MTU的节点池
- TCP调优参数:
bash复制sysctl -w net.ipv4.tcp_mtu_probing=1 # 启用自动探测
sysctl -w net.ipv4.tcp_base_mss=1024 # 保守初始值
这次排查让我深刻认识到:云原生环境下的网络问题,往往藏在抽象层之间的缝隙里。下次再遇到TCP黑洞,我的检查清单会从MTU匹配开始。
