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 的完整流程。
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 存储栈中的位置。
关键理解: PVC 是用户与存储系统之间的“契约”。用户声明需求(大小、访问模式),系统通过 StorageClass 的模板找到合适的 PV(动态或静态),最终将存储资源挂载到 Pod 的文件系统中。任何挂载参数的变更,最终都会体现在 StorageClass 的
mountOptions 或 CSI 驱动的 parameters 中。