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 集群中最难诊断的故障之一。
网络分区的关键特征:
- 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 |