3. 存储类(StorageClass)基础:核心属性与作用
在 Kubernetes 持久化存储体系中,StorageClass 是连接集群管理员与开发者的关键抽象层。它定义了动态制备 PersistentVolume 的“模板”,使得用户无需手动创建 PV,只需声明 PVC 即可自动获得匹配的后端存储。本节将深入剖析 StorageClass 的四个核心组成部分:provisioner、parameters、reclaimPolicy 以及 StorageClass 的整体作用。
3.1 StorageClass 的作用:从静态到动态的跃迁
在没有 StorageClass 的时代,管理员必须预先手动创建好 PV,然后等待 PVC 去绑定。这种方式被称为静态制备,存在明显的缺陷:
- 资源浪费:预分配的 PV 容量往往大于实际需求,造成存储空间闲置。
- 管理复杂:PV 数量随应用增长而线性膨胀,运维成本高。
- 响应缓慢:新应用上线需要等待管理员手动创建 PV,无法实现自服务。
StorageClass 的出现彻底改变了这一局面,它实现了动态制备。当用户创建 PVC 时,Kubernetes 会根据 PVC 指定的 StorageClass 自动调用后端存储驱动(provisioner),按需创建 PV 并绑定到 PVC。整个过程无需管理员介入,实现了存储资源的按需供给。
3.2 provisioner:存储后端的“驱动程序”
provisioner 是 StorageClass 中唯一必须指定的字段。它决定了由哪个存储后端来实际创建 PV。每个 provisioner 对应一个 CSI(Container Storage Interface)驱动或 in-tree 存储插件。当 PVC 请求存储时,Kubernetes 会调用该 provisioner 对应的 API 来动态创建底层存储卷。
| provisioner 名称 | 对应后端存储 | 典型使用场景 |
|---|---|---|
kubernetes.io/aws-ebs |
AWS EBS | AWS 云原生应用 |
kubernetes.io/gce-pd |
GCE Persistent Disk | GCP 云原生应用 |
disk.csi.azure.com |
Azure Disk | Azure 云原生应用 |
csi.vsphere.vmware.com |
vSphere | VMware 虚拟化环境 |
nfs.csi.k8s.io |
NFS 服务器 | 传统 NAS 共享存储 |
rook-ceph.rbd.csi.ceph.com |
Ceph RBD | 自建分布式存储 |
3.3 parameters:存储后端的“调优旋钮”
parameters 是一个键值对集合,用于向 provisioner 传递存储后端的特定配置参数。不同的 provisioner 支持的 parameters 各不相同,它们决定了最终创建的 PV 的底层存储特性,如性能、复制策略、文件系统类型等。
以下是一个 AWS EBS 的 StorageClass 示例,展示了常用的 parameters:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ebs
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3 # 卷类型:gp3(通用型SSD)、io2(高IOPS型)
fsType: ext4 # 文件系统类型
iopsPerGB: "10" # 每GB的IOPS数(仅io2类型支持)
encrypted: "true" # 是否加密
kmsKeyId: arn:aws:kms:... # KMS加密密钥ID
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
下表列出了一些常见 provisioner 的关键 parameters:
| provisioner | 常用 parameters | 说明 |
|---|---|---|
kubernetes.io/aws-ebs |
type, fsType, iopsPerGB, encrypted |
控制 EBS 卷的性能等级和加密 |
disk.csi.azure.com |
skuname, cachingmode, kind |
控制 Azure 磁盘的 SKU、缓存策略和类型(Managed/Shared) |
nfs.csi.k8s.io |
server, share, mountPermissions |
指定 NFS 服务器地址、导出路径和挂载权限 |
rook-ceph.rbd.csi.ceph.com |
clusterID, pool, csi.storage.k8s.io/fstype |
指定 Ceph 集群 ID、存储池和文件系统类型 |
Failed to provision volume with StorageClass "xxx" 的错误事件。
3.4 reclaimPolicy:PV 释放后的“生命周期策略”
reclaimPolicy 定义了当 PVC 被删除后,对应的 PV 及其底层存储资源应该如何处理。它直接影响数据的安全性和存储资源的回收效率。StorageClass 支持两种策略:
- Delete(默认):当 PVC 被删除时,自动删除对应的 PV 以及后端存储卷上的所有数据。这是最常用的策略,适用于临时数据或可以随时重建的无状态应用。
- Retain:当 PVC 被删除时,PV 会进入
Released状态,后端存储卷上的数据被保留。管理员需要手动清理或回收该 PV 后才能再次使用。此策略适用于需要保留数据快照或进行数据迁移的场景。
以下是一个使用 Retain 策略的 StorageClass 示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: retain-nfs
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.1.100
share: /export/data
reclaimPolicy: Retain # 数据保留,需手动清理
- 对于生产数据库、日志归档等需要长期保留的数据,使用
Retain策略,并配合定期备份机制。 - 对于 CI/CD 构建缓存、临时计算数据等可丢弃的数据,使用
Delete策略以节省存储成本。 - 注意:
reclaimPolicy也可以在 PV 级别单独设置,但 StorageClass 中的设置是默认值,PV 创建后可以独立修改。
3.5 其他重要字段:volumeBindingMode 与 allowVolumeExpansion
除了上述三个核心字段外,StorageClass 还包含两个对生产环境至关重要的属性:
- volumeBindingMode:控制 PV 绑定和动态制备的时机。
Immediate(默认):PVC 创建后立即尝试制备和绑定 PV,不考虑 Pod 调度。可能导致 PV 与 Pod 不在同一可用区。WaitForFirstConsumer:延迟到第一个使用该 PVC 的 Pod 被调度时,才进行 PV 的制备和绑定。确保 PV 与 Pod 在同一个可用区,是多可用区集群的推荐配置。
- allowVolumeExpansion:布尔值,是否允许后续通过编辑 PVC 的
spec.resources.requests.storage来在线扩容 PV。设置为true时,需要后端存储支持在线扩容(如 AWS EBS、Azure Disk、Ceph RBD 等)。
volumeBindingMode 设置为 WaitForFirstConsumer,以避免 Pod 调度到 A 区但 PV 却创建在 B 区的尴尬局面。同时,如果后端存储支持,开启 allowVolumeExpansion: true 可以为未来的存储扩容提供极大的灵活性。
3.6 完整 StorageClass 示例与总结
以下是一个面向生产环境的完整 StorageClass 定义,综合了本节所学的所有核心属性:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: production-ssd
provisioner: disk.csi.azure.com
parameters:
skuname: Premium_LRS # Azure 高级 SSD
cachingmode: ReadOnly # 缓存模式
kind: Managed # 托管磁盘
reclaimPolicy: Retain # 保留数据
volumeBindingMode: WaitForFirstConsumer # 延迟绑定
allowVolumeExpansion: true # 允许在线扩容
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=1000
- gid=1000
通过本节的学习,我们掌握了 StorageClass 的四大核心要素:
| 字段 | 作用 | 是否必填 |
|---|---|---|
provisioner |
指定存储后端驱动,决定 PV 由谁创建 | 是 |
parameters |
传递后端存储的特定配置参数 | 否(取决于 provisioner) |
reclaimPolicy |
定义 PVC 删除后 PV 和数据的处理方式 | 否(默认 Delete) |
volumeBindingMode |
控制 PV 制备和绑定的时机 | 否(默认 Immediate) |
allowVolumeExpansion |
是否允许在线扩容 PV | 否(默认 false) |