CSI 与存储接入
CSI(容器存储接口)是 Kubernetes 的存储插件标准:厂商按接口实现驱动,Kubernetes 通过它完成卷的创建、挂载、扩容与快照,驱动代码不必再进主仓库。集群里通常有两部分组件:负责卷生命周期(创建、删除、扩容)的控制器组件,以及每个节点一个、负责把卷挂到节点并挂进容器的节点组件。StorageClass 里的 provisioner 字段写的就是驱动名,卷出问题时先看它指向谁。
基本信息
| 适用平台 | Kubernetes 1.13 起 CSI 稳定;旧 in-tree 插件逐步迁移到 CSI |
|---|---|
| 相关对象 | CSIDriver、CSINode、StorageClass、VolumeAttachment |
| 查看命令 | kubectl get csidrivers / csinodes / storageclass |
| 组件形态 | 控制器(Deployment 或 StatefulSet)+ 节点组件(DaemonSet) |
| 排障入口 | 驱动日志、PVC 事件、VolumeAttachment 状态 |
典型使用场景
- 集群接入新存储(云盘、Ceph、NFS、SAN)时确认驱动是否已就绪
- PVC 长期 Pending 时判断是驱动缺失、供应失败还是容量不足
- 挂载失败类故障时按事件指向区分控制器问题还是节点组件问题
- 升级集群前核对驱动与 Kubernetes 版本的兼容矩阵
- 扩容或快照能力不生效时确认驱动是否声明了对应能力
识别集群里的驱动
识别集群里的驱动
kubectl get csidrivers
kubectl get storageclass -o custom-columns=NAME:.metadata.name,PROVISIONER:.provisioner,BIND:.volumeBindingMode
kubectl get csinodes # 每节点上报的驱动与卷上限
kubectl get volumeattachment | head # 挂载中的卷与所在节点看驱动日志
看驱动日志
kubectl -n kube-system get pods | grep -i -E 'csi|provisioner'
kubectl -n kube-system logs <csi-controller-pod> --tail=50 # 控制器:创建/删除/扩容报错
kubectl -n kube-system logs <csi-node-pod> --tail=50 # 节点组件:挂载/卸载报错组件与排障入口
| 组件 | 职责 | 排障入口 |
|---|---|---|
| CSIDriver 对象 | 声明驱动能力与特性开关 | kubectl get csidriver <名称> -o yaml |
| 控制器组件 | 创建、删除、扩容卷 | 控制器 Pod 日志与 PVC 事件 |
| 节点组件 | 挂载卸载、上报节点卷上限 | 对应节点上的节点组件 Pod 日志 |
| StorageClass | 绑定驱动名与存储参数 | PVC 的 storageClassName 与 provisioner 是否对得上 |
挂载类故障既可能出在节点组件,也可能出在控制器组件:先看 Pod 事件里提到的组件名,再决定查哪一侧日志,比两头乱翻快得多。
节点组件与驱动的升级通常滚动进行,升级期间该节点上的新建卷可能短暂无法挂载,重要变更尽量避开业务高峰与批量发布窗口。