2. 节点故障分类:从现象到根因的精准映射

在 Kubernetes 集群中,节点故障并非单一事件,而是一系列具有不同表象、根因和恢复路径的故障集合。SRE 团队若不能准确分类故障,MTTR 复盘将停留在“节点挂了”的粗粒度层面,无法指导调度策略的定向优化。本节将故障分为四大类,并给出每一类的典型特征、排查要点与调度影响。

2.1 硬件故障:物理层的不可逆损伤

硬件故障通常表现为节点状态突然变为 NotReady,且伴随硬件告警。这类故障的恢复路径唯一:更换硬件或下线节点。

故障类型 典型现象 Kubernetes 表现 恢复手段
CPU 故障 MCE(Machine Check Exception)日志、CPU 核心离线 节点偶发 NotReady,Pod 出现莫名 OOMKill 物理替换 CPU/主板
内存故障 EDAC 报错、内存 CE/UE 计数增长 kubelet 无法分配内存,Pod 频繁重启 更换内存条
磁盘故障 I/O 超时、SMART 告警、文件系统只读 Pod 挂载卷 I/O 错误,kubelet 心跳超时 更换磁盘或 RAID 卡
网卡故障 链路抖动、丢包率飙升、网卡固件异常 节点网络延迟高,CNI 插件报错 更换网卡或光模块
复盘要点: 硬件故障的 MTTR 中,诊断时间往往占 70% 以上。建议在节点上预部署 ipmitool、smartctl、mcelog 等工具,并接入告警系统,实现硬件异常的秒级感知。

2.2 软件故障:控制面的“软性”崩溃

软件故障比硬件故障更隐蔽,恢复手段通常是重启进程或修复配置,而非更换硬件。

  • kubelet 故障: 证书过期、API Server 连接中断、PLEG(Pod Lifecycle Event Generator)卡死。表现为节点状态频繁 NotReady,但 SSH 可登录。
  • CRI-O / containerd 故障: 容器运行时 hang 死、镜像拉取超时、sandbox 创建失败。表现为 Pod 无法启动,crictl ps 无响应。
  • 内核 panic: 内核 bug、内存泄漏、驱动异常。表现为节点完全失联,控制台显示 Kernel Panic - not syncing。
避坑指南: 内核 panic 的恢复必须依赖 watchdog 或 kdump 自动重启。不要依赖人工 SSH 恢复,因为 panic 后节点已无响应。

2.3 网络分区:集群的“脑裂”风险

网络分区是指节点间网络连通性中断,但节点自身进程仍在运行。这是 Kubernetes 集群中最难诊断的故障之一。

网络分区故障示意图 分区 A(正常) Node-1 (Leader) Node-2 (Follower) Node-3 (Follower) etcd 可读写 分区 B(孤立) Node-4 (Leader 选举) Node-5 (Follower) Node-6 (Follower) etcd 不可写 网络中断 分区 B 会尝试选举新 Leader,但 etcd 多数派丢失,集群进入只读状态

网络分区的关键特征:

  • etcd 多数派丢失: 如果分区导致 etcd 成员少于半数,集群将完全不可写。
  • Pod 状态分裂: 分区两侧的 kubelet 都认为自己是健康的,但 API Server 无法同时管理。
  • 恢复手段: 修复网络链路(交换机/路由/防火墙),或强制删除孤立节点。

2.4 云厂商 API 限流:控制面的“隐形瓶颈”

在云原生环境中,Kubernetes 控制面(尤其是 kube-controller-manager 和 cloud-controller-manager)频繁调用云厂商 API。当 API 调用频率超过配额时,会触发限流,导致节点状态更新延迟、LoadBalancer 创建失败、PV 挂载超时。

云厂商 限流指标 典型表现 优化策略
AWS EC2 API 调用次数 / 秒 节点注册延迟,DescribeInstances 超时 启用 --node-status-update-frequency 降低频率
GCP Compute Engine API 配额 实例组扩容失败,InsertInstance 返回 429 使用 rate-limiter 客户端限流
Azure ARM API 调用次数 / 分钟 LoadBalancer 规则更新失败 批量合并 API 请求
复盘关键: 云厂商 API 限流导致的故障,在节点日志中通常表现为 context deadline exceeded 或 rate: Limit exceeded。SRE 团队应在监控系统中单独建立“云 API 调用量”看板,与节点健康状态关联分析。

2.5 故障分类与调度策略的映射关系

不同的故障类型,需要不同的调度策略来应对。下表总结了各类故障对应的调度调优方向:

故障类型 调度策略调优方向 关键参数 / 机制
硬件故障 快速驱逐 + 污点传播 tolerationSeconds、node.kubernetes.io/unreachable
软件故障 Pod 反亲和 + 本地故障域隔离 podAntiAffinity、topologySpreadConstraints
网络分区 多可用区部署 + 仲裁机制 --leader-elect-retry-period、etcd 跨 AZ 部署
API 限流 控制面组件限流 + 客户端退避 --kube-api-qps、--kube-api-burst