K8s 动态存储体系:StorageClass + CSI
核心概念 StorageClass 是存储模板层,CSI 是标准化存储接口层,两者实现 PV 按需供给和存储解耦。
1. 为什么需要 StorageClass + CSI(解决静态PV痛点)
1.1. 传统静态PV缺陷
静态模式需要运维提前手动创建大量PV,集群扩容、新增节点、业务扩盘时:
- 人工维护成本极高;
- 无法按需自动创建磁盘;
- 云厂商、本地盘、NAS存储格式不统一,切换底层存储需要大规模改PV;
- 不支持在线扩容、快照、克隆等高级存储能力。
1.2. 动态存储核心目标
- 按需供给:业务创建PVC自动生成PV,不用运维提前预制;
- 存储解耦标准化:CSI统一接口,一套K8s适配云盘、本地SSD、Ceph、NAS;
- 统一存储模板:StorageClass封装磁盘类型、性能、回收策略;
- 支持高级存储能力:磁盘扩容、快照备份、克隆、存储拓扑感知、裸块设备。
整体架构分层:
- CSI:底层标准驱动层,对接真实存储硬件/云API;
- StorageClass:存储模板层,定义供给规则;
- PVC:业务申请入口,指定StorageClass触发动态创建PV;
- PV:CSI自动生成,自动与PVC绑定。
2. CSI 容器存储接口(Container Storage Interface)
2.1. CSI 定位
CNI负责网络,CSI负责存储;是K8s官方统一存储标准,淘汰老旧内置in-tree存储驱动。
早年K8s内置云厂商驱动,升级K8s内核才能更新存储逻辑;CSI独立部署,驱动迭代无需改动集群版本。
2.2. CSI 标准两大组件(固定架构)
一套完整CSI分为 Controller 控制面 + Node 节点代理,分别以 Deployment、DaemonSet 部署。
2.2.1. (1)CSI Controller(全局控制组件,Deployment)
全局唯一调度层,不参与宿主机挂载操作,只对接存储后端API,管理卷生命周期:
核心能力:
- CreateVolume / DeleteVolume:创建、删除底层磁盘(云盘/本地盘/块设备);
- ExpandVolume:磁盘在线扩容;
- CreateSnapshot / DeleteSnapshot:快照创建删除;
- CloneVolume:基于快照克隆新磁盘;
- ListVolumes、拓扑感知调度:根据节点可用区创建对应区域磁盘;
- 绑定校验、权限管理。
2.2.2. (2)CSI Node(节点代理,DaemonSet,每个节点一个)
Pod调度到当前节点后,执行本地挂载/卸载操作,和宿主机内核交互:
核心能力:
- NodeStageVolume:格式化磁盘;
- NodePublishVolume:将卷挂载到Pod目录;
- NodeUnpublishVolume / NodeUnstageVolume:卸载磁盘;
- 获取节点拓扑标签(可用区、磁盘类型)上报给Controller;
- 裸块设备透传、文件系统检测。
2.3. CSI 配套CRD扩展资源(实现快照/克隆)
CSI部署后会自动创建3组自定义资源,实现高级存储能力:
volumesnapshotclasses.snapshot.storage.k8s.io:快照模板,类似StorageClass;volumesnapshots.snapshot.storage.k8s.io:快照对象,对PV做时间点备份;volumesnapshotcontents.snapshot.storage.k8s.io:底层真实快照存储载体。
2.4. CSI 完整工作链路(PVC触发动态创建磁盘)
- 用户创建PVC,指定
storageClassName; - K8s持久卷控制器检测PVC无绑定PV,转发创建请求给对应CSI Controller;
- CSI Controller读取StorageClass内参数,调用云厂商/分布式存储API,创建一块底层磁盘;
- CSI Controller自动生成对应PV对象,与PVC完成一对一绑定,PVC状态变为Bound;
- 调度器将Pod调度到某节点;
- 该节点CSI Node组件执行格式化、挂载操作;
- Pod内容器通过volumeMounts读写持久化存储;
- 删除PVC:Controller根据StorageClass回收策略,自动删除底层磁盘、清理PV。
3. StorageClass 存储类完整详解
3.1. StorageClass 作用
统一存储模板,把存储供给规则封装,业务PVC只需要引用名称即可,不用重复写磁盘类型、性能参数。
一个集群可以创建多个StorageClass区分不同存储介质:
sc-cloud-ssd:云厂商高性能SSD云盘;sc-local-nvme:本地NVMe高速盘;sc-nas-rwx:多节点共享NAS存储。
3.2. StorageClass 完整标准YAML示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-cloud-ssd
# 1. 核心:CSI驱动名称,和CSI Controller标识对应
provisioner: disk.csi.aliyun.com
# 2. 底层存储参数,不同厂商CSI参数不同
parameters:
type: cloud_ssd
performance_level: pl0
zone_id: cn-shanghai-a
# 3. 是否支持磁盘在线扩容
allowVolumeExpansion: true
# 4. PVC删除后底层磁盘回收策略
reclaimPolicy: Delete
# 5. 卷绑定模式(两大核心模式)
volumeBindingMode: WaitForFirstConsumer
# 6. 允许拓扑感知,多可用区调度
allowedTopologies:
- matchLabelExpressions:
- key: topology.disk.csi.aliyun.com/zoneid
values: ["cn-shanghai-a","cn-shanghai-b"]
3.3. StorageClass 核心字段逐条解析
3.3.1. ① provisioner(必选)
CSI驱动标识,不同存储厂商驱动名称不同:
- 阿里云盘:disk.csi.aliyun.com
- 腾讯云盘:cloud.tencent.com/qcloud-csi
- 本地LocalPV:local.storage.k8s.io
- Ceph RBD:rbd.csi.ceph.com
3.3.2. ② reclaimPolicy 回收策略
Delete(生产推荐):PVC删除 → 自动删除PV + 销毁底层云盘/存储;Retain:PVC删除,PV和底层磁盘保留,需人工清理。
3.3.3. ③ allowVolumeExpansion
true 开启在线磁盘扩容:仅修改PVC storage容量即可扩容磁盘,无需重建Pod、无需停机。
扩容流程:修改PVC容量 → CSI Controller调用存储API扩容底层磁盘 → CSI Node在线扩展文件系统。
3.3.4. ④ volumeBindingMode 两种绑定模式(高频考点)
模式1:Immediate(立即绑定,默认旧模式)
PVC创建瞬间,CSI立刻创建磁盘、生成PV。
缺陷:
- 多可用区场景:磁盘创建在随机AZ,Pod后续无法调度到该AZ则挂载失败;
- LocalPV本地盘场景:提前创建磁盘,但Pod未调度到对应节点,磁盘闲置浪费。
适用:单可用区云集群、无本地盘场景。
模式2:WaitForFirstConsumer(延迟绑定,企业标准)
等待第一个使用PVC的Pod被调度后,再创建磁盘。
优势:
- CSI Controller读取Pod调度到的节点拓扑(可用区、节点标签),在Pod所在AZ创建磁盘,不会出现跨AZ挂载失败;
- LocalPV场景:Pod调度到节点后才匹配本地磁盘,不会提前占用本地盘资源;
- 完美适配多AZ高可用集群、本地高性能存储。
3.3.5. ⑤ parameters
CSI厂商自定义参数,控制磁盘类型、性能、副本数、加密、可用区等。
3.3.6. ⑥ allowedTopologies
限制磁盘只能创建在指定可用区,配合调度器实现存储与节点同AZ部署。
3.4. 设置集群默认StorageClass
集群可以配置默认存储类,PVC不写storageClassName时自动绑定默认SC:
# 打标签设为默认
kubectl annotate storageclasses.storage.k8s.io sc-cloud-ssd storageclass.kubernetes.io/is-default-class="true"
4. 动态存储完整全流程(从创建PVC到挂载Pod)
- 集群提前部署CSI驱动(Controller+Node)、创建StorageClass;
- 业务创建PVC,指定
storageClassName: sc-cloud-ssd;
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: sc-cloud-ssd
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
- PVC状态初始为
Pending,K8s PV控制器转发创建请求给CSI Controller; - CSI Controller读取SC参数,调用云存储API创建20G SSD云盘;
- CSI自动生成PV资源,PV与PVC一对一绑定,PVC状态变为
Bound; - 创建Deployment/StatefulSet,挂载该PVC;
- 调度器将Pod调度到某节点;
- 节点上CSI Node组件执行磁盘格式化、挂载到Pod内
/var/lib/mysql; - 业务正常读写持久化数据;
- 业务下线删除PVC:SC配置
reclaimPolicy: Delete,CSI自动删除底层云盘,PV同步清理。
5. LocalPV 本地盘动态供给(SC+CSI典型落地场景)
本地SSD/NVMe高性能存储同样依靠StorageClass + LocalPV CSI实现动态供给:
- 节点预先挂载裸SSD磁盘,标记本地磁盘路径;
- 部署local-csi驱动,创建StorageClass,配置
volumeBindingMode: WaitForFirstConsumer; - 创建PVC引用本地SC;
- Pod调度到节点后,CSI自动匹配该节点空闲本地磁盘生成PV;
优势:无需运维提前手动批量创建静态LocalPV,自动按需分配本地高速盘给ES、Kafka、MySQL。
6. CSI高级能力配套使用(快照、克隆、扩容)
6.1. 磁盘在线扩容
- StorageClass开启
allowVolumeExpansion: true; - 直接修改PVC中
resources.requests.storage从20Gi改为50Gi; - CSI Controller调用存储API扩容底层磁盘;
- CSI Node在线扩展文件系统,业务Pod无需重启。
6.2. 存储快照备份
- 创建VolumeSnapshotClass(快照模板,关联CSI驱动);
- 基于已有PVC创建VolumeSnapshot,对当前PV做时间点快照;
- 快照独立生命周期,可长期留存用于故障回滚;
- 新PVC可基于快照还原完整数据。
6.3. 卷克隆 Clone
直接基于现有PV快照复制一块完整数据磁盘,快速复制生产环境用于测试环境,省去全量数据导入。
7. 静态PV VS 动态StorageClass+CSI 对比
| 维度 | 静态PV手动创建 | StorageClass+CSI动态供给 |
| 创建方式 | 运维提前手动编写YAML批量创建 | 业务创建PVC自动生成PV |
| 运维成本 | 极高,扩容集群需新增PV | 极低,统一SC模板,无需人工干预 |
| 存储切换 | 更换存储需批量修改所有PV | 仅新增一套StorageClass,业务PVC切换名称即可 |
| 扩容支持 | 不支持在线扩容 | 原生支持在线扩容 |
| 快照/克隆 | 不支持 | 原生支持快照、克隆、拓扑调度 |
| 适配本地盘 | 只能静态预制LocalPV | WaitForFirstConsumer动态匹配本地盘 |
| 适用规模 | 小规模测试集群 | 生产中大型集群标准方案 |
8. 生产常见故障排查
8.1. PVC一直Pending无法变为Bound
- StorageClass名称写错,不存在对应SC;
- CSI Controller异常,Pod CrashLoopBackOff;
- volumeBindingMode=WaitForFirstConsumer,但未创建使用PVC的Pod;
- 云厂商CSI鉴权失败,无创建云盘权限;
- 可用区不匹配,allowedTopologies限制无匹配节点。
排查:kubectl describe pvc xxx查看事件日志定位CSI报错。
8.2. 磁盘扩容失败
- StorageClass未开启
allowVolumeExpansion: true; - 底层存储不支持扩容(老旧NAS、本地裸盘无扩容能力);
- CSI驱动版本过低,不支持Expand接口。
8.3. Pod调度成功但挂载磁盘失败
- Immediate模式磁盘创建在其他可用区,节点不在对应AZ;
- CSI Node DaemonSet未正常运行;
- 节点磁盘权限不足、格式化失败。
8.4. 删除PVC后底层磁盘未自动释放
StorageClass reclaimPolicy 配置为Retain,改为Delete即可自动清理存储。
9. 面试核心总结框架
- CSI是统一存储标准,分为Controller(全局管理磁盘生命周期)、Node(节点挂载卸载)两大组件,替代老旧内置存储驱动;
- StorageClass是存储模板,封装CSI驱动、磁盘参数、扩容开关、回收策略、绑定模式;
- 两种绑定模式:Immediate立即创建磁盘;WaitForFirstConsumer延迟绑定(多AZ/LocalPV必备);
- 动态供给完整流程:PVC指定SC → CSI创建底层磁盘 → 自动生成PV绑定PVC → Pod调度后CSI Node挂载;
- 高级能力依赖CSI:在线扩容、快照备份、卷克隆、存储拓扑感知、裸块设备;
- 相比静态PV,动态体系实现存储按需自动化,降低运维成本,是企业K8s存储标准方案;
- LocalPV本地高速盘、云厂商SSD、共享NAS均通过不同StorageClass区分统一管理。
关联文档