1. 问题现象与初步排查
最近在维护一套生产环境Kubernetes集群时,遇到了master-01节点网卡异常的问题。具体表现为:当主网卡发生宕机后,系统未能正确显示网卡状态为"NotReady",导致后续的故障转移和恢复流程无法正常触发。
这个问题看似简单,但实际上涉及到网络子系统、驱动层和Kubernetes节点状态管理的多个环节。我花了三天时间深入排查,最终找到了根本原因和解决方案。以下是完整的排查过程和修复方案。
首先我们需要明确几个关键现象:
- 物理网卡链路确实已经断开(通过交换机端口状态确认)
- ifconfig显示网卡状态为"UP"而非"DOWN"
- ip link show同样没有显示"NO-CARRIER"状态
- kubelet日志中持续报出"network not ready"警告
- kube-controller-manager没有将节点标记为NotReady
2. 网络子系统状态检测机制
2.1 Linux网络设备状态管理
在Linux系统中,网卡状态由内核网络子系统管理。当物理链路断开时,驱动层应该通过netif_carrier_off()函数通知上层。这个状态变化会触发以下事件链:
- 驱动检测到物理链路断开
- 调用netif_carrier_off()通知内核
- 内核更新sysfs中的carrier文件(/sys/class/net/eth0/carrier)
- 生成RTM_NEWLINK消息通过netlink广播
- 用户态工具(如iproute2)接收到状态变更
在我们的案例中,这个链条在第二步就中断了。通过检查驱动代码发现,这个型号的网卡(Intel X710)在特定固件版本下,存在carrier状态上报不准确的问题。
2.2 Kubernetes节点网络就绪检测
Kubernetes通过kubelet定期检查节点网络状态,具体逻辑如下:
go复制func (kl *Kubelet) setNodeNetworkCondition() {
// 获取网络状态
_, err := kl.getRuntimeNetworkReady()
if err != nil {
// 标记网络不可用
v1he
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容