StorageClass 与动态供给
本教程共 65 篇 · 第 36 篇 · 更新于 2026-08-14 · 约 9 分钟阅读
本节目标:理解 StorageClass 是”存储的菜单”,知道它怎么让 PVC 自动变出 PV,掌握 provisioner、回收策略、绑定模式这几个关键字段,以及默认 StorageClass 怎么用。
上一章的静态制备,要管理员提前准备好一堆 PV 等着。真实集群里这太麻烦。StorageClass(存储类)就是来解决这事的:它定义”一类存储长什么样”,然后按需自动造出 PV。
可以把它想成云盘的”套餐”:有高速 SSD 套餐、有廉价 HDD 套餐。用户选套餐,系统按套餐现场开盘。
36-1 StorageClass 是什么
每个 StorageClass 描述一类存储,里面最关键的是 provisioner(制备器),它决定用哪个卷插件去造 PV。还有 parameters、reclaimPolicy、volumeBindingMode 等字段。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
名字很重要。用户创建 PVC 时靠 storageClassName 指名要哪类。管理员建好类,用户就能自助申请。
Note从 v1.27 起,AWS EBS、Azure Disk 这类树内驱动已被移除,统一走 CSI 驱动(如
ebs.csi.aws.com)。现在写 StorageClass,provisioner 基本都是外部 CSI 驱动,不再是kubernetes.io/...内置名(本地卷等少数例外)。
36-2 动态供给怎么发生
用户写 PVC 时指定存储类:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
storageClassName: fast
如果集群里没有匹配的静态 PV,且 fast 这个类配置了 provisioner,系统就自动造一个 PV 绑给这个 PVC。整个过程用户无感知,这就是动态供给。
反过来,如果 PVC 的 storageClassName 写成 "",则明确禁用动态供给,只能找现成 PV 绑。
36-3 回收策略与绑定模式
动态造出的 PV 会继承 StorageClass 的 reclaimPolicy,默认是 Delete。也就是说删 PVC,盘也跟着没。要保数据,把类设成 Retain。
volumeBindingMode 控制”什么时候造盘、什么时候绑”:
Immediate(默认):PVC 一创建就立刻造 PV 并绑定。WaitForFirstConsumer:等到真正有 Pod 用这个 PVC 时才造盘。拓扑受限的存储(比如本地盘、特定可用区)必须用这个,否则可能造到错误的节点,Pod 反而调度不上去。
volumeBindingMode: WaitForFirstConsumer
Warning用了
WaitForFirstConsumer,就别在 Pod 里用nodeName硬指节点,否则会绕过调度器,PVC 卡在pending。要指定节点,用节点选择器或亲和性。
36-4 默认 StorageClass
集群可以设一个默认 StorageClass。PVC 不写 storageClassName 时,就自动用默认的。默认类靠注解 storageclass.kubernetes.io/is-default-class: "true" 标记。
kubectl get storageclass
输出里带 (default) 的就是默认类。
Tip建议全集群只留一个默认类,避免歧义。多个类都标了默认,系统会选最近创建的那一个,容易让人困惑。
本地卷(local)本身不支持动态制备,但仍要建 StorageClass 并设置 WaitForFirstConsumer,目的是把卷绑定推迟到 Pod 真正调度到对应节点之后。
36-5 其他常用字段
allowVolumeExpansion: true:允许后续通过改 PVC 扩容卷(只能扩不能缩)。CSI 卷从 v1.24 起支持。mountOptions:传给存储的挂载参数,插件不支持会制备失败。parameters:各 provisioner 私有的参数,比如 NFS 的server、path。单个类最多 512 个参数。
StorageClass 把”存储即模板”这件事做扎实了。配合下一章的最佳实践,你的配置和存储就能既灵活又安全。