K8s CSI 驱动排障:驱动注册、Attach/Detach 异常、Multi-Attach 多挂载
2026-08-11 09:37:39
# 存储
CSI(Container Storage Interface) 是 K8s 对接外部存储的标准接口。理解它的组件分工,才能在”卷挂不上、卸不下、被多挂”时快速定位是哪一端的问题。
一、CSI 的组件拓扑
一个 CSI 驱动通常由两类 Pod 组成(部署在 kube-system):
- Controller 插件(StatefulSet/Deployment,通常 1 副本):
external-provisioner:处理动态供给(CreateVolume);external-attacher:处理卷的 Attach/Detach(调ControllerPublishVolume);external-resizer:处理扩容;external-snapshotter:处理快照。
- Node 插件(DaemonSet,每节点一个):
node-plugin:真正在节点上把卷挂载进 Pod 的目录(NodeStageVolume/NodePublishVolume)。
二、常见排障场景
1. 卷无法 Attach / Detach(Multi-Attach error)
1 | Multi-Attach error for volume "xxx" - Volume is already used by pod(s) ... |
ReadWriteOnce(RWO)卷同一时刻只能挂在一个节点。常见于:旧 Pod 没完全停掉(还占着卷),新 Pod 调度到另一节点就会报这个错。
- 确认旧 Pod 已彻底删除;
- 极端情况:底层卷的 attach 状态残留,需在云控制台/存储端手动 detach,或重启
external-attacher重做状态同步。
2. 卷挂载超时(Node 插件问题)
Node 插件没起来或 kubelet 没注册该 CSI 驱动,会导致 MountVolume.SetUp failed。
1 | # kubelet 是否识别到驱动 |
3. 驱动注册失败 / Socket 缺失
CSI 驱动通过 kubelet 的插件目录下的 socket 文件 注册。若该文件缺失,kubelet 认为驱动不可用,所有依赖它的 PVC 都会失败。检查:
- CSIDriver 对象是否存在:
kubectl get csidriver; - node 插件是否把 socket 挂到了正确的
plugin目录。
4. 扩容/快照”没反应”
确认对应的 sidecar(external-resizer / external-snapshotter)Pod 是否运行,且 StorageClass 开启了相应能力(allowVolumeExpansion / volumeSnapshotClassName)。
三、排障总览表
| 现象 | 优先查的组件 |
|---|---|
| PVC Pending(供给失败) | external-provisioner 日志 |
| 调度失败 Multi-Attach | 旧 Pod 是否残留 / external-attacher |
| 挂载超时 FailedMount | node-plugin / kubelet 插件 socket |
| 扩容不生效 | external-resizer / StorageClass 开关 |
小结
CSI 排障关键是分端:供给看 provisioner,挂载看 node-plugin 与 kubelet 插件注册,Attach/Detach 看 attacher。RWO 卷的 Multi-Attach 错误几乎都源于旧 Pod 未彻底退出。