跳转至

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. 解决方案

无代码/配置缺陷可修(未复现)。采取的收敛措施:

  1. 保留规避:Grafana 继续钉在 k8s-node-03 (env-monitor-deploy/manifests/06-grafana-node-pin.yaml)。该文件为 node-02 根因定位而设, 解除条件见第 8 节预防建议第 1 条。
  2. 不改 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. 预防建议

按风险从高到低:

  1. 【高】补检测,而不是继续翻日志——当前「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 日志时间窗),比事后翻日志有效得多。
  2. 【中】重试优先换节点——同类现象再现时,先按「换节点即恢复」处理(本次已验证有效),不要在单节点上反复 force delete / 重启 kubelet 消耗时间。
  3. 【中】高危操作避免叠加——故障窗口内叠加了 helm 全栈重建 + 多次 force delete + 清理 sandbox + 重启 kubelet。今后遇到「集群侧大规模重建」时,不要同时手工强删 Pod,让控制器自己收敛,可减少此类临时状态。
  4. 【低】Grafana 钉节点的解除条件:第 1 条告警规则上线并稳定运行、且至少一个月内未在 node-02 复现同类现象后,可解除 06-grafana-node-pin.yaml 并移除配置引用。
  5. 【低】若将来其它节点出现同类现象:优先按「节点级临时状态」排查,本次的排除清单(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 同步,请勿在站点侧修改)