底层存储物理断电导致pv挂载挂起、pod卡在containercreating,本质是编排层与存储层故障感知脱节形成的“静默死锁”:attachdetach-controller无限等待无响应设备,既不超时也不报错。

当底层存储物理断电导致 Kubernetes 中 PV 挂载挂起、Pod 卡在 ContainerCreating 状态,且长时间不超时、不报错、也不自动恢复——这本质上是编排层与存储层的故障感知脱节引发的“静默死锁”。它不是常规 Pending 或 FailedAttach,而是 attachdetach-controller 仍在等待一个永远无法响应的设备。以下是直击要害的排查路径:
看 Pod 事件里有没有“卡住的 Attach”
这是第一眼判断依据。运行:
kubectl describe pod <pod-name> -n <namespace></namespace></pod-name>
重点盯 Events 最后几条:
- 若出现 Warning FailedAttachVolume ... Multi-Attach error → 是多节点争抢挂载,和断电无关;
- 若出现 Normal AttachVolume.Attach pending for volume 且持续数分钟无后续(既没 Success,也没 Fail)→ 极可能底层存储失联,attachdetach-controller 正在无限重试;
- 若事件完全停滞,连 Attach 都没触发 → 要检查 kubelet 是否已感知节点异常(见下一条)。
查 kubelet 日志确认是否“等不到设备响应”
断电后,Ceph RBD、iSCSI、NFS 等后端通常表现为设备节点消失或 IO hang。kubelet 在尝试 mount/attach 时会卡在系统调用层面。登录对应 Node,执行:
journalctl -u kubelet -n 200 --no-pager | grep -i -E "(rbd|iscsi|nfs|attach|mount|timeout)"
典型线索:
- "rbd: map failed: exit status 110"(ETIMEDOUT);
- "iscsiadm: can't connect to iSCSI daemon";
- "nfs: server X.X.X.X not responding, still trying";
- 或大量重复日志如 "Waiting for volume ... to be attached",但无 timeout 提示。
这说明 kubelet 已陷入阻塞,而默认 timeout 值(如 rbd 的 `rbd map` 默认无超时)远长于业务容忍窗口。
验 PV 状态是否“假 Bound”
PV 显示 Bound 并不等于底层设备可用。断电后 PV 状态不会自动变,需人工验证其实际可访问性:
- 查 PV 的 `spec.persistentVolumeReclaimPolicy`:如果是 `Retain`,断电后 PV 仍 Bound,但数据不可达;
- 运行
kubectl get pv <pv-name> -o yaml</pv-name>,看status.phase是否为 Bound,再重点看status.message和status.reason(部分 CSI 驱动会更新); - 对 Ceph RBD 类 PV,手动在 Node 上执行:
rbd status <pool>/<image></image></pool>或lsblk | grep rbd—— 若 image 不在 map 列表,或返回 “No such file or directory”,即证实设备丢失。
解死锁:强制清理挂载残留并触发重试
不能等自动恢复。必须打破僵局:
-
先停 kubelet:
systemctl stop kubelet(防止新操作干扰); -
卸载残留挂载点(如有):
umount -f /var/lib/kubelet/pods/*/volumes/*/*; -
清除 rbd/iscsi 设备映射:
rbd unmap /dev/rbd* && iscsiadm -m node -u; -
删掉 attachdetach-controller 的缓存状态(关键):
编辑 etcd 中对应 volume 的 attach 对象(路径类似/registry/volumes/attachments/<node-name>.<pv-name></pv-name></node-name>),或更稳妥地:重启kube-controller-manager(它负责 attachdetach-controller); - 启动 kubelet,观察 PVC 是否触发重新 attach —— 此时若存储仍未恢复,会快速报出 FailedAttachVolume,便于告警收敛。
注意:该操作需在确认存储已恢复供电并能被节点网络可达之后进行,否则只是重复失败。











