首页 / Kubernetes (k8s) 入门教程 / StorageClass 与动态供给

Kubernetes (k8s) 入门教程

StorageClass 与动态供给

本教程共 65 篇 · 第 36 篇 · 更新于 2026-08-14 · 约 9 分钟阅读

KubernetesStorageClass动态供给provisionerPVPVC

本节目标:理解 StorageClass 是”存储的菜单”,知道它怎么让 PVC 自动变出 PV,掌握 provisioner、回收策略、绑定模式这几个关键字段,以及默认 StorageClass 怎么用。

上一章的静态制备,要管理员提前准备好一堆 PV 等着。真实集群里这太麻烦。StorageClass(存储类)就是来解决这事的:它定义”一类存储长什么样”,然后按需自动造出 PV。

可以把它想成云盘的”套餐”:有高速 SSD 套餐、有廉价 HDD 套餐。用户选套餐,系统按套餐现场开盘。

36-1 StorageClass 是什么

每个 StorageClass 描述一类存储,里面最关键的是 provisioner(制备器),它决定用哪个卷插件去造 PV。还有 parametersreclaimPolicyvolumeBindingMode 等字段。

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 的 serverpath。单个类最多 512 个参数。

StorageClass 把”存储即模板”这件事做扎实了。配合下一章的最佳实践,你的配置和存储就能既灵活又安全。