3. Kubernetes PVC 基础:PersistentVolumeClaim 定义、StorageClass 动态供给、PV 与 PVC 绑定生命周期
在 Kubernetes 存储体系中,PersistentVolumeClaim (PVC) 是用户与存储资源之间的核心抽象层。它解耦了“应用需要什么样的存储”与“底层存储如何提供”这两个关注点。本章将深入剖析 PVC 的定义规范、StorageClass 动态供给机制,以及 PV 与 PVC 绑定的完整生命周期,为后续多集群 etcd 压测沙盘中的 PVC 一致性复核奠定基础。
3.1 PersistentVolumeClaim 定义与结构
PVC 是命名空间级别的资源,用于声明对存储的需求。一个典型的 PVC 定义包含访问模式、资源请求、存储类选择等关键字段。
核心字段说明:
- accessModes:定义卷的访问模式,决定 Pod 如何挂载该卷。
- resources.requests.storage:声明所需的最小存储容量。
- storageClassName:指定要使用的 StorageClass 名称,用于动态供给或匹配已有 PV。
- selector:通过标签选择器匹配特定 PV,用于静态绑定场景。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: etcd-data-pvc
namespace: etcd-cluster
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: fast-ssd
volumeMode: Filesystem
| 字段 | 可选值 | 说明 |
|---|---|---|
| accessModes | ReadWriteOnce / ReadOnlyMany / ReadWriteMany | 单节点读写、多节点只读、多节点读写 |
| volumeMode | Filesystem / Block | 文件系统模式或原始块设备模式 |
| storageClassName | 字符串或空 | 指定 StorageClass 名称;空字符串表示禁用动态供给 |
| selector | matchLabels / matchExpressions | 用于静态绑定特定 PV |
3.2 StorageClass 动态供给机制
StorageClass 是集群管理员定义的存储“模板”,它描述了如何动态创建 PersistentVolume。当 PVC 指定了 storageClassName 时,Kubernetes 控制平面会自动调用对应的 Provisioner 创建 PV 并绑定到 PVC。
最佳实践:在 etcd 压测沙盘中,建议为每个集群配置独立的 StorageClass,并设置
reclaimPolicy: Retain,确保压测结束后数据卷不会被自动删除,便于后续一致性复核。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
fsType: ext4
iopsPerGB: "10"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
| StorageClass 参数 | 作用 | 压测沙盘推荐值 |
|---|---|---|
| provisioner | 指定存储后端驱动 | 根据云厂商或本地存储选择 |
| reclaimPolicy | PV 释放后的处理策略 | Retain(保留数据) |
| allowVolumeExpansion | 是否允许在线扩容 | true(便于压测后调整) |
| volumeBindingMode | 绑定时机控制 | WaitForFirstConsumer(延迟绑定) |
3.3 PV 与 PVC 绑定生命周期
PV 与 PVC 的绑定遵循严格的状态机,从创建到回收经历多个阶段。理解这些状态对于排查 etcd 压测沙盘中的存储问题至关重要。
常见陷阱:在压测沙盘中,如果 PVC 长时间处于 Pending 状态,通常是因为 StorageClass 的 Provisioner 不可用、底层存储配额不足,或者 volumeBindingMode 为 WaitForFirstConsumer 但 Pod 尚未调度。此时应检查 Provisioner Pod 日志和存储后端状态。
3.3.1 绑定状态机
| PVC 状态 | PV 状态 | 说明 | 压测沙盘常见场景 |
|---|---|---|---|
| Pending | — | PVC 已创建,等待匹配 PV | 动态供给未完成或 StorageClass 配置错误 |
| Pending | Available | 存在可用 PV,但未满足绑定条件 | 访问模式或容量不匹配 |
| Bound | Bound | PVC 与 PV 成功绑定 | 正常压测运行状态 |
| Lost | Released | PV 被用户手动删除或后端卷丢失 | etcd 数据卷意外删除后的恢复场景 |
| — | Failed | PV 自动供给失败 | 存储配额不足或 Provisioner 异常 |
3.3.2 绑定条件与规则
Kubernetes 控制平面通过以下条件匹配 PV 与 PVC:
- 访问模式匹配:PV 的 accessModes 必须包含 PVC 声明的所有模式。
- 容量满足:PV 的容量必须大于等于 PVC 请求的容量。
- StorageClass 一致:PVC 的 storageClassName 必须与 PV 的 storageClassName 相同(动态供给场景下自动匹配)。
- 标签选择器:如果 PVC 定义了 selector,PV 的标签必须完全匹配。
- 卷模式一致:Filesystem 或 Block 模式必须相同。
3.4 压测沙盘中的 PVC 一致性关注点
在多集群 etcd 压测沙盘中,PVC 的一致性复核需要特别关注以下方面:
一致性复核清单:
- StorageClass 一致性:所有集群中相同用途的 etcd 数据卷应使用相同的 StorageClass 配置,避免性能差异导致压测结果偏差。
- 绑定状态一致性:压测前后所有 PVC 应处于 Bound 状态,且绑定到预期的 PV。
- 容量一致性:实际分配的 PV 容量应与 PVC 请求容量一致,避免因存储后端自动扩展导致容量偏差。
- 回收策略一致性:所有 etcd 数据卷的 reclaimPolicy 应统一为 Retain,防止压测清理时误删数据。
- 卷模式一致性:etcd 通常使用 Filesystem 模式,确保所有集群配置一致。