目录

记一次k8s网络故障处理

最终版故障分析报告

1. 故障关键信息

项目 确认信息
故障节点 192.168.6.18 (10节点集群中的单点异常)
内核版本 3.10.0-1160.80.1.el7.x86_64 (CentOS 7默认内核)
根本触发条件 内存可用量持续 <10% → 网卡接收队列阻塞 → DNS丢包
临时解决方案 节点排水后重启 → 故障消失

2. 根因深度分析

../images/neterror4.png

核心问题定位

内核 3.10.0-1160 在内存压力下存在网络栈处理缺陷:

  • 内存回收机制激进:直接阻塞软中断(softIRQ),导致 netdev_max_backlog 队列堆积
  • UDP包处理劣化:单队列设计使DNS响应包在竞争中被丢弃(/proc/net/softnet_stat 第3列计数激增)
  • 单节点隔离性故障:故障节点存在 内存泄漏进程(需进一步排查),其他节点负载正常

3. 故障复现

../images/neterror1.png

../images/neterror2.png


4. 最终解决方案

等级 措施 作用
紧急处置 1. 驱逐故障节点工作负载
2. 重启节点释放泄露内存
立即恢复业务
短期加固 1. 所有节点调优内核:
net.core.netdev_max_backlog=5000
net.core.rmem_default=16777216
2. 禁止Pod调度到故障节点
降低80%丢包率
长期根治 1. 升级内核至5.4+(ACK推荐:el7-5.4.109-1.al7.x86_64
2. 替换 Cilium eBPF 网络方案
3. 部署内存泄漏检测工具(e.g. tracee
彻底避免内存竞争问题

5. 预防机制建议

../images/neterror5.png

监控体系增强

  • 添加告警规则:sum(rate(node_net_softnet_stat_dropped[2m])) > 10

  • DaemonSet部署内核级检测工具:

    1
    2
    
    # 追踪内存分配异常
    $ perf record -e kmem:kmalloc -e kmem:kfree -p $(pidof kubelet)