4. 故障现象描述:Pod 处于 Pending 状态,kubectl describe 显示 FailedScheduling
在证书轮换操作后的数分钟内,运维人员发现某关键业务 Pod 无法正常启动,始终停留在 Pending 状态。通过 kubectl get pods 可以快速确认 Pod 的当前状态,但需要进一步使用 kubectl describe pod 来获取详细的调度失败原因。
4.1 故障现象确认步骤
以下是在实际环境中复现该故障的标准操作流程:
- 查看 Pod 状态:执行
kubectl get pods -n <namespace>,观察到目标 Pod 的STATUS列为Pending,且持续数分钟未发生变化。 - 获取调度事件:执行
kubectl describe pod <pod-name> -n <namespace>,在输出的Events部分定位到关键信息。 - 识别错误码:在 Events 中看到
FailedScheduling事件,并附带具体的错误原因描述。
4.2 典型输出示例
以下是从实际故障环境中截取的 kubectl describe pod 输出片段,其中包含了诊断所需的核心信息:
Name: web-app-7d8f9c4b6c-x2y3z
Namespace: production
...
Status: Pending
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 2m default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/control-plane: }, that the pod didn't tolerate, 2 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod.
关键诊断线索: 在
FailedScheduling 事件的消息中,明确指出了 “2 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }”。这表明调度器认为两个工作节点处于磁盘压力状态,但实际物理磁盘并未达到阈值。这种“假性磁盘压力”通常与节点上的 kubelet 证书过期或轮换后未正确更新有关。
4.3 故障现象与证书轮换的关联分析
证书轮换导致 Pod 调度失败的现象并非直接由证书本身引起,而是通过影响节点上的 kubelet 组件 与 API Server 之间的通信链路,进而触发了一系列连锁反应。下表梳理了从证书轮换到 Pod Pending 的完整逻辑链条:
| 阶段 | 组件 | 现象 | 根本原因 |
|---|---|---|---|
| 1 | kubelet | 证书轮换后,kubelet 未自动重载新证书 | kubelet 证书轮换机制配置不当或证书文件权限错误 |
| 2 | kubelet ↔ API Server | kubelet 心跳上报失败,节点状态异常 | kubelet 使用过期证书与 API Server 进行 TLS 握手失败 |
| 3 | Node Controller | 节点被标记为 DiskPressure 或 NodeNotReady |
Node Controller 在等待 kubelet 心跳超时后,根据节点条件自动设置污点 |
| 4 | Scheduler | Pod 调度失败,产生 FailedScheduling 事件 |
调度器检查节点污点,发现 Pod 未定义对应的容忍度,因此跳过该节点 |
4.4 故障现象的可视化流程
下图以流程图的形式展示了从证书轮换到 Pod 进入 Pending 状态的完整链路,帮助理解各个组件之间的依赖关系:
4.5 故障现象总结
本故障的核心现象可以归纳为以下三点:
- 表象:Pod 处于
Pending状态,调度器无法找到可用节点。 - 直接原因:节点被添加了
node.kubernetes.io/disk-pressure污点,且 Pod 未设置对应的容忍度。 - 深层诱因:证书轮换后 kubelet 未能成功更新证书,导致与 API Server 的心跳中断,Node Controller 根据节点条件自动添加了污点。
运维提示: 在排查 Pod Pending 问题时,不要只关注调度器日志。结合
kubectl describe node 查看节点状态和污点信息,以及检查 kubelet 日志中的证书相关错误,可以更快地定位到证书轮换这一根本原因。