20260930-k8s-node-02-Pod卡Init故障报告¶
1. 故障时间¶
| 项 | 内容 |
|---|---|
| 发生 | 2026-09-30 00:10 – 00:33(约 23 分钟) |
| 发现 | 2026-09-30 00:07,执行 env-monitor-deploy 变更时其自身校验报「抓取目标 0/14 up」,人工核查时发现 |
| 恢复 | 2026-09-30 00:33(Grafana 改钉 k8s-node-03 后立即正常) |
| 复现尝试 | 2026-09-30 01:25,未复现(11 秒即 Running) |
2. 现象¶
k8s-node-02 上引用新建 NFS PVC 的 Pod 长时间停在 Init:0/1 或 ContainerCreating:
- 卷已成功挂载(
MountVolume.MountDevice succeeded),但 kubelet 不推进到启动容器; kubectl exec报container not found;- 重启 kubelet、强制删除 Pod 重建、清理孤儿 sandbox 均无效;
- 换到
k8s-node-03后立即恢复。
3. 影响范围¶
- 业务:无影响。受影响的是监控栈在 node-02 上的 Pod(Grafana、kube-state-metrics 新副本)以及当时正在重建的 Prometheus。
- 数据:无损坏。(当时 Grafana 数据已完成备份与回填,与本次故障无因果关系)
- 持续性:未复发。同一节点上其余工作负载(node-exporter、csi-nfs-node、calico 等)全程正常。
4. 根因原理¶
未定位 —— 按证据不足处理,不下猜测性结论。
已排除的方向与依据见第 5 节。当前可确证的只有:这是 node-02 上的一次临时状态,不是持续性缺陷(复现实验 11 秒通过)。
最可能的时序因素(推测,需下次复现才能验证):故障窗口内该节点上叠加了三类高频操作——helm 全栈重建引发的密集卷挂载/卸载洪峰、我执行的多次 force delete Pod、以及清理孤儿 sandbox;kubelet 日志显示 00:09–00:10 有密集的 UnmountVolume/MountDevice 序列。这些叠加是否让 kubelet 的卷管理器或 Pod 工作队列短暂阻塞,尚未取得直接证据。
5. 证据摘要¶
5.1 复现实验(决定性,结论:未复现)¶
| 项 | 内容 |
|---|---|
| 主机 | k8s-node-02(192.168.31.14) |
| 时间 | 2026-09-30 01:25:06 起 |
| 做法 | 新建命名空间 + 5Gi PVC(StorageClass nfs-csi,与 Grafana 同款)+ 带 init 容器的 Pod,nodeSelector 钉 node-02,镜像用该节点已缓存的 busybox:1.38.0(排除拉镜像变量) |
| 结果 | PVC 11 秒 Bound;Pod 11 秒 1/1 Running(init 容器的 chown -R 亦正常完成) |
| 清理 | kubectl delete ns node02-probe(Namespace 级联删除,PV 按 Delete 策略回收 NFS 子目录) |
5.2 已排除方向¶
| 方向 | 证据(主机 + 时间窗 + 命令 + 过滤) |
|---|---|
| NFS 服务端 / 网络 | node-02,00:05–00:35,journalctl -k \| grep -iE 'nfs\|rpc\|mount\|stale' → 无输出;同期 node-02 上 8 个 NFS 挂载正常 |
| CSI 卷挂载失败 | node-02 kubelet 日志,00:08:50 → MountVolume.MountDevice succeeded for volume "pvc-703a922f-…",卷其实挂上了 |
| 镜像拉取失败 | node-02 kubelet 日志,00:05–00:40,grep -ciE 'ErrImagePull\|ImagePullBackOff\|failed to pull' → 0 |
| 磁盘 / inode 不足 | node-02,df -h /var/lib/containerd → 16% 用量;df -i → 1% |
| 内存不足 | node-02,free -g → 总 15G、已用 1G、可用 13G |
| containerd 崩溃 | node-02,systemctl show containerd -p NRestarts → 1,且 ActiveEnterTimestamp = 2026-09-29 18:44:24(早于故障窗口,故障期未重启);日志中 ContainerStatus/RemoveContainer failed 均为「删除已不存在的容器」的良性报错(与 StopContainer 成对出现,紧邻 NotFound) |
| 残留脏状态 | node-02,01:27 检查:mount \| grep 192.168.31.249 \| wc -l → 8(正常);旧 PVC pvc-5ca538f8 残留挂载 → 0;重复挂载同一路径 → 无 |
| 节点调度不可用 | 同窗口 kubelet 日志中 alertmanager(00:09:57)、prometheus(00:12:37)均报 Observed pod startup duration,在该节点上成功启动 |
5.3 关键时间锚点¶
Sep 30 00:08:50 kubelet[2064] MountVolume.MountDevice succeeded for volume "pvc-703a922f-…"
Sep 30 00:09:46 kubelet[2064] (密集 UnmountVolume / MountDevice 序列)
Sep 30 00:12:37 kubelet[2064] Observed pod startup duration pod="monitoring/prometheus-…"
Sep 30 00:18:06 systemd[1] Stopping/Stopped/Started kubelet(人为重启,NRestarts=0)
Sep 30 00:22:13 kubelet[31589] UnmountVolume.TearDown succeeded / UnmountDevice succeeded / Volume detached
Sep 30 00:33 改钉 k8s-node-03 → Grafana 3/3 Running
6. 解决方案¶
无代码/配置缺陷可修(未复现)。采取的收敛措施:
- 保留规避:Grafana 继续钉在
k8s-node-03(env-monitor-deploy/manifests/06-grafana-node-pin.yaml)。该文件为 node-02 根因定位而设, 解除条件见第 8 节预防建议第 1 条。 - 不改 node-02 任何配置——无证据支持改动,避免引入新变量。
7. 验证结果¶
| 项 | 命令 | 结果 |
|---|---|---|
| 复现实验 | 见 5.1 | 11 秒 Running,未复现 |
| 无脏状态残留 | mount \| grep -c pvc-5ca538f8(node-02) |
0 |
| 实验资源已清理 | kubectl get ns node02-probe |
已删除(级联清理 PVC/PV) |
| 监控栈当前状态 | env-monitor-deploy 的 verify |
退出码 0,14/14 抓取目标 up |
8. 预防建议¶
按风险从高到低:
- 【高】补检测,而不是继续翻日志——当前「Pod 卡在 Init/ContainerCreating 超过 N 分钟」没有任何告警,本次是靠人工在别的变更里偶然发现的。建议在
env-monitor-deploy的 P1 范围加一条规则:kube_pod_status_phase{phase="Pending"} == 1持续 10 分钟,或kube_pod_container_status_waiting_reason{reason=~"ContainerCreating|PodInitializing"} == 1持续 10 分钟。 下一次真发生时就能自动抓到现场(含 kubelet 日志时间窗),比事后翻日志有效得多。 - 【中】重试优先换节点——同类现象再现时,先按「换节点即恢复」处理(本次已验证有效),不要在单节点上反复 force delete / 重启 kubelet 消耗时间。
- 【中】高危操作避免叠加——故障窗口内叠加了 helm 全栈重建 + 多次 force delete + 清理 sandbox + 重启 kubelet。今后遇到「集群侧大规模重建」时,不要同时手工强删 Pod,让控制器自己收敛,可减少此类临时状态。
- 【低】Grafana 钉节点的解除条件:第 1 条告警规则上线并稳定运行、且至少一个月内未在 node-02 复现同类现象后,可解除
06-grafana-node-pin.yaml并移除配置引用。 - 【低】若将来其它节点出现同类现象:优先按「节点级临时状态」排查,本次的排除清单(5.2 表)可直接复用,能省去逐项试错。
附录:本次未做的事¶
- 未修改 node-02 的任何系统配置(无证据支持)
- 未触碰 Grafana 数据与现有工作负载
- 未因「未能定位」而假设一个根因——按规范记录为待确认项
来源:
/home/rain/Documents/k8s_ins/node02-init-stuck-20260930/20260930-k8s-node-02-Pod卡Init故障报告.md| 最后更新:2026-09-30 01:25(由build/sync.py同步,请勿在站点侧修改)