Kubernetes

K8s 动态存储体系:StorageClass + CSI

·16 分钟阅读·6270 字
📋 目录

K8s 动态存储体系:StorageClass + CSI

核心概念 StorageClass 是存储模板层,CSI 是标准化存储接口层,两者实现 PV 按需供给和存储解耦。

1. 为什么需要 StorageClass + CSI(解决静态PV痛点)

1.1. 传统静态PV缺陷

静态模式需要运维提前手动创建大量PV,集群扩容、新增节点、业务扩盘时:

  • 人工维护成本极高;
  • 无法按需自动创建磁盘;
  • 云厂商、本地盘、NAS存储格式不统一,切换底层存储需要大规模改PV;
  • 不支持在线扩容、快照、克隆等高级存储能力。

1.2. 动态存储核心目标

  1. 按需供给:业务创建PVC自动生成PV,不用运维提前预制;
  2. 存储解耦标准化:CSI统一接口,一套K8s适配云盘、本地SSD、Ceph、NAS;
  3. 统一存储模板:StorageClass封装磁盘类型、性能、回收策略;
  4. 支持高级存储能力:磁盘扩容、快照备份、克隆、存储拓扑感知、裸块设备。

整体架构分层:

  1. CSI:底层标准驱动层,对接真实存储硬件/云API;
  2. StorageClass:存储模板层,定义供给规则;
  3. PVC:业务申请入口,指定StorageClass触发动态创建PV;
  4. 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,管理卷生命周期:
核心能力:

  1. CreateVolume / DeleteVolume:创建、删除底层磁盘(云盘/本地盘/块设备);
  2. ExpandVolume:磁盘在线扩容;
  3. CreateSnapshot / DeleteSnapshot:快照创建删除;
  4. CloneVolume:基于快照克隆新磁盘;
  5. ListVolumes、拓扑感知调度:根据节点可用区创建对应区域磁盘;
  6. 绑定校验、权限管理。

2.2.2. (2)CSI Node(节点代理,DaemonSet,每个节点一个)

Pod调度到当前节点后,执行本地挂载/卸载操作,和宿主机内核交互:
核心能力:

  1. NodeStageVolume:格式化磁盘;
  2. NodePublishVolume:将卷挂载到Pod目录;
  3. NodeUnpublishVolume / NodeUnstageVolume:卸载磁盘;
  4. 获取节点拓扑标签(可用区、磁盘类型)上报给Controller;
  5. 裸块设备透传、文件系统检测。

2.3. CSI 配套CRD扩展资源(实现快照/克隆)

CSI部署后会自动创建3组自定义资源,实现高级存储能力:

  1. volumesnapshotclasses.snapshot.storage.k8s.io:快照模板,类似StorageClass;
  2. volumesnapshots.snapshot.storage.k8s.io:快照对象,对PV做时间点备份;
  3. volumesnapshotcontents.snapshot.storage.k8s.io:底层真实快照存储载体。

2.4. CSI 完整工作链路(PVC触发动态创建磁盘)

  1. 用户创建PVC,指定storageClassName
  2. K8s持久卷控制器检测PVC无绑定PV,转发创建请求给对应CSI Controller;
  3. CSI Controller读取StorageClass内参数,调用云厂商/分布式存储API,创建一块底层磁盘;
  4. CSI Controller自动生成对应PV对象,与PVC完成一对一绑定,PVC状态变为Bound;
  5. 调度器将Pod调度到某节点;
  6. 该节点CSI Node组件执行格式化、挂载操作;
  7. Pod内容器通过volumeMounts读写持久化存储;
  8. 删除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被调度后,再创建磁盘
优势:

  1. CSI Controller读取Pod调度到的节点拓扑(可用区、节点标签),在Pod所在AZ创建磁盘,不会出现跨AZ挂载失败;
  2. LocalPV场景:Pod调度到节点后才匹配本地磁盘,不会提前占用本地盘资源;
  3. 完美适配多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)

  1. 集群提前部署CSI驱动(Controller+Node)、创建StorageClass;
  2. 业务创建PVC,指定storageClassName: sc-cloud-ssd
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  storageClassName: sc-cloud-ssd
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 20Gi
  1. PVC状态初始为Pending,K8s PV控制器转发创建请求给CSI Controller;
  2. CSI Controller读取SC参数,调用云存储API创建20G SSD云盘;
  3. CSI自动生成PV资源,PV与PVC一对一绑定,PVC状态变为Bound
  4. 创建Deployment/StatefulSet,挂载该PVC;
  5. 调度器将Pod调度到某节点;
  6. 节点上CSI Node组件执行磁盘格式化、挂载到Pod内/var/lib/mysql
  7. 业务正常读写持久化数据;
  8. 业务下线删除PVC:SC配置reclaimPolicy: Delete,CSI自动删除底层云盘,PV同步清理。

5. LocalPV 本地盘动态供给(SC+CSI典型落地场景)

本地SSD/NVMe高性能存储同样依靠StorageClass + LocalPV CSI实现动态供给:

  1. 节点预先挂载裸SSD磁盘,标记本地磁盘路径;
  2. 部署local-csi驱动,创建StorageClass,配置volumeBindingMode: WaitForFirstConsumer
  3. 创建PVC引用本地SC;
  4. Pod调度到节点后,CSI自动匹配该节点空闲本地磁盘生成PV;
    优势:无需运维提前手动批量创建静态LocalPV,自动按需分配本地高速盘给ES、Kafka、MySQL。

6. CSI高级能力配套使用(快照、克隆、扩容)

6.1. 磁盘在线扩容

  1. StorageClass开启allowVolumeExpansion: true
  2. 直接修改PVC中resources.requests.storage从20Gi改为50Gi;
  3. CSI Controller调用存储API扩容底层磁盘;
  4. CSI Node在线扩展文件系统,业务Pod无需重启。

6.2. 存储快照备份

  1. 创建VolumeSnapshotClass(快照模板,关联CSI驱动);
  2. 基于已有PVC创建VolumeSnapshot,对当前PV做时间点快照;
  3. 快照独立生命周期,可长期留存用于故障回滚;
  4. 新PVC可基于快照还原完整数据。

6.3. 卷克隆 Clone

直接基于现有PV快照复制一块完整数据磁盘,快速复制生产环境用于测试环境,省去全量数据导入。

7. 静态PV VS 动态StorageClass+CSI 对比

维度静态PV手动创建StorageClass+CSI动态供给
创建方式运维提前手动编写YAML批量创建业务创建PVC自动生成PV
运维成本极高,扩容集群需新增PV极低,统一SC模板,无需人工干预
存储切换更换存储需批量修改所有PV仅新增一套StorageClass,业务PVC切换名称即可
扩容支持不支持在线扩容原生支持在线扩容
快照/克隆不支持原生支持快照、克隆、拓扑调度
适配本地盘只能静态预制LocalPVWaitForFirstConsumer动态匹配本地盘
适用规模小规模测试集群生产中大型集群标准方案

8. 生产常见故障排查

8.1. PVC一直Pending无法变为Bound

  1. StorageClass名称写错,不存在对应SC;
  2. CSI Controller异常,Pod CrashLoopBackOff;
  3. volumeBindingMode=WaitForFirstConsumer,但未创建使用PVC的Pod;
  4. 云厂商CSI鉴权失败,无创建云盘权限;
  5. 可用区不匹配,allowedTopologies限制无匹配节点。
    排查:kubectl describe pvc xxx 查看事件日志定位CSI报错。

8.2. 磁盘扩容失败

  1. StorageClass未开启allowVolumeExpansion: true
  2. 底层存储不支持扩容(老旧NAS、本地裸盘无扩容能力);
  3. CSI驱动版本过低,不支持Expand接口。

8.3. Pod调度成功但挂载磁盘失败

  1. Immediate模式磁盘创建在其他可用区,节点不在对应AZ;
  2. CSI Node DaemonSet未正常运行;
  3. 节点磁盘权限不足、格式化失败。

8.4. 删除PVC后底层磁盘未自动释放

StorageClass reclaimPolicy 配置为Retain,改为Delete即可自动清理存储。

9. 面试核心总结框架

  1. CSI是统一存储标准,分为Controller(全局管理磁盘生命周期)、Node(节点挂载卸载)两大组件,替代老旧内置存储驱动;
  2. StorageClass是存储模板,封装CSI驱动、磁盘参数、扩容开关、回收策略、绑定模式;
  3. 两种绑定模式:Immediate立即创建磁盘;WaitForFirstConsumer延迟绑定(多AZ/LocalPV必备);
  4. 动态供给完整流程:PVC指定SC → CSI创建底层磁盘 → 自动生成PV绑定PVC → Pod调度后CSI Node挂载;
  5. 高级能力依赖CSI:在线扩容、快照备份、卷克隆、存储拓扑感知、裸块设备;
  6. 相比静态PV,动态体系实现存储按需自动化,降低运维成本,是企业K8s存储标准方案;
  7. LocalPV本地高速盘、云厂商SSD、共享NAS均通过不同StorageClass区分统一管理。

关联文档