Kubernetes 存储基础:PV、PVC、StorageClass 核心概念回顾

在深入 CSI 存储变更门禁与卷挂载参数调优之前,必须牢固掌握 Kubernetes 存储的三大核心抽象:PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass。这三者构成了 Kubernetes 中存储资源供给与消费的解耦模型,是理解后续所有调优与测试工作的基石。

1. 核心概念与职责划分

Kubernetes 将存储资源的提供与使用分离,PV 和 PVC 分别扮演了这两个角色,而 StorageClass 则负责动态供给的策略定义。

概念 角色 生命周期 关键属性
PV (PersistentVolume) 集群级别的存储资源,由管理员预先制备或通过 StorageClass 动态创建。 独立于 Pod 存在,状态包括 Available、Bound、Released、Failed。 存储容量、访问模式 (Access Modes)、回收策略 (Reclaim Policy)、存储类 (StorageClass)、挂载选项 (Mount Options)。
PVC (PersistentVolumeClaim) 用户对存储资源的请求,描述所需存储的大小、访问模式等。 与使用它的 Pod 绑定,Pod 删除后 PVC 默认保留。 请求的存储容量、访问模式、选择器 (Selector)、存储类名称。
StorageClass 存储的“模板”或“类”,定义了动态制备存储卷的驱动、参数和回收策略。 集群级资源,不直接绑定到 Pod。 制备器 (Provisioner)、参数 (Parameters)、回收策略、挂载选项、卷绑定模式 (VolumeBindingMode)。

2. 三者的协作流程:从请求到挂载

下图展示了用户通过 PVC 请求存储,系统如何通过 StorageClass 动态创建 PV,并最终绑定到 Pod 的完整流程。

PV / PVC / StorageClass 协作流程 用户 / Pod PVC (请求) StorageClass PV (资源) PVC 与 PV 绑定 (Bound) 1. 创建 PVC 2. 引用 SC 3. 动态制备 4. 绑定 5. Pod 挂载 PVC 说明:动态制备流程中,用户只需关心 PVC 和 StorageClass,PV 由系统自动创建并绑定。

3. 关键属性详解

3.1 访问模式 (Access Modes)

访问模式定义了卷如何被挂载到节点上。这是性能测试中需要重点关注的参数,因为它直接影响并发读写能力。

  • ReadWriteOnce (RWO):卷可以被单个节点以读写方式挂载。这是最常见的模式,适用于大多数有状态应用。
  • ReadOnlyMany (ROX):卷可以被多个节点以只读方式挂载。适用于分发静态数据。
  • ReadWriteMany (RWX):卷可以被多个节点以读写方式挂载。需要底层存储(如 NFS、CephFS)支持,性能通常低于 RWO。
  • ReadWriteOncePod (RWOP):卷可以被单个 Pod 以读写方式挂载。这是 Kubernetes 1.22+ 的 Alpha 特性,提供更严格的单 Pod 访问保证。

3.2 回收策略 (Reclaim Policy)

当 PVC 被删除后,PV 的后续处理方式由回收策略决定。

策略 行为 适用场景
Retain 保留 PV 及其底层存储数据,需要管理员手动回收。 需要持久化保留数据,防止误删除。
Delete 自动删除 PV 及其关联的底层存储资产。 临时或测试环境,动态制备的默认策略。
Recycle (已弃用)对卷执行基本清理(如 rm -rf /volume/*),然后使其再次可用。 不推荐使用,建议使用动态制备替代。

3.3 卷绑定模式 (VolumeBindingMode)

该参数控制动态制备的时机,对调度性能和存储延迟有直接影响。

  • Immediate:一旦创建 PVC,立即触发 PV 的制备和绑定,不考虑 Pod 调度约束。可能导致 Pod 被调度到无法访问该卷的节点。
  • WaitForFirstConsumer:延迟制备,直到第一个使用该 PVC 的 Pod 被调度到某个节点后,才在该节点所在的可用区创建 PV。这能确保卷与 Pod 在拓扑上对齐,减少跨可用区的网络延迟。
性能调优提示: 对于延迟敏感型应用,建议使用 WaitForFirstConsumer 绑定模式,并结合 allowedTopologies 将卷限制在特定可用区,避免跨 AZ 的网络开销。

4. StorageClass 参数与挂载选项

StorageClass 是调优的入口点。除了指定制备器(如 csi.huawei.com、ebs.csi.aws.com),还可以通过 parameters 和 mountOptions 传递驱动特定的配置。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd-csi
provisioner: csi.huawei.com
parameters:
  type: SSD
  fsType: ext4
  iopsPerGB: "10"
  # 其他 CSI 驱动特定参数
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
mountOptions:
  - noatime
  - nodiratime
  - nobarrier
  - data=ordered

上述示例中,mountOptions 中的 noatime 和 nobarrier 是常见的文件系统级性能优化参数,它们会直接传递给 CSI 驱动并在挂载时生效。

5. 概念关系总结

下图以分层视角总结了 PV、PVC、StorageClass 与底层存储及 Pod 的关系,帮助理解它们在 Kubernetes 存储栈中的位置。

Kubernetes 存储抽象分层架构 Pod (应用容器) PVC (存储请求) PV (存储资源) 物理存储 (SAN / NAS / 本地盘) StorageClass (模板 / 策略) - 制备器 - 参数 - 挂载选项 动态制备
关键理解: PVC 是用户与存储系统之间的“契约”。用户声明需求(大小、访问模式),系统通过 StorageClass 的模板找到合适的 PV(动态或静态),最终将存储资源挂载到 Pod 的文件系统中。任何挂载参数的变更,最终都会体现在 StorageClass 的 mountOptions 或 CSI 驱动的 parameters 中。