2. 核心概念:PersistentVolume (PV) 与 PersistentVolumeClaim (PVC) 的定义与生命周期
在 Kubernetes 持久化存储体系中,PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是两个最核心的抽象资源。它们将存储的“供给”与“消费”彻底解耦,使得应用开发者无需关心底层存储的具体实现,而集群管理员可以统一管理存储资源池。
2.1 PersistentVolume (PV) —— 存储资源
PV 是集群中的一块存储资源,由管理员预先配置(静态供给)或通过存储类动态创建。它独立于任何 Pod 存在,具有自己的生命周期。
| 属性 | 说明 | 典型值 |
|---|---|---|
| capacity | 存储容量 | 10Gi, 100Gi, 1Ti |
| accessModes | 访问模式 | ReadWriteOnce, ReadOnlyMany, ReadWriteMany |
| persistentVolumeReclaimPolicy | 回收策略 | Retain, Delete, Recycle |
| storageClassName | 关联的存储类名称 | standard, fast, csi-hostpath-sc |
| mountOptions | 挂载选项 | ro, hard, nfsvers=4.1 |
关键理解: PV 是存储后端的“代言人”。一个 PV 可以对应一个 NFS 共享、一个 Ceph RBD 块设备、一个云厂商的 EBS 卷,或者一个本地磁盘路径。PV 的 spec 中封装了后端存储的连接参数。
2.2 PersistentVolumeClaim (PVC) —— 存储请求
PVC 是用户对存储资源的请求。用户通过 PVC 指定所需的容量、访问模式,以及可选的存储类选择器。Kubernetes 控制平面负责将 PVC 与满足条件的 PV 进行绑定。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-app-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
最佳实践: 在 PVC 中始终指定
storageClassName。如果省略,集群将使用默认存储类(如果已设置),这可能导致非预期的存储后端绑定。
2.3 PV 与 PVC 的生命周期
PV 和 PVC 的生命周期包含四个阶段:供给 → 绑定 → 使用 → 回收。下图展示了这一完整流程以及各阶段的状态转换。
2.4 生命周期各阶段详解
- 供给 (Provisioning)
- 静态供给: 管理员预先创建 PV,指定容量、访问模式、存储类型和后端连接信息。
- 动态供给: 通过 StorageClass 自动创建 PV。当 PVC 提交时,集群根据 StorageClass 的 provisioner 调用后端存储 API 创建卷。
- 绑定 (Binding)
- 控制平面查找与 PVC 请求匹配的 PV(容量 ≥ 请求、访问模式兼容、StorageClass 一致)。
- 绑定是一对一的:一个 PV 在同一时间只能绑定一个 PVC。
- 如果找不到匹配的 PV 且 StorageClass 支持动态供给,则触发动态创建。
- 使用 (Using)
- Pod 通过
volumes.persistentVolumeClaim引用 PVC 来挂载存储。 - 多个 Pod 可以同时引用同一个 PVC(取决于访问模式限制)。
- Pod 运行期间,PV 的数据持续存在,不受 Pod 重启影响。
- Pod 通过
- 回收 (Reclaiming)
- 当 PVC 被删除后,PV 进入 Released 状态。
- 根据 PV 的
persistentVolumeReclaimPolicy执行回收操作。
2.5 回收策略对比
| 策略 | 行为 | 适用场景 | 数据安全 |
|---|---|---|---|
| Retain | 保留 PV 和后端存储,管理员手动决定如何处理数据 | 需要数据备份、审计、迁移的场景 | 最高,数据不会自动丢失 |
| Delete | 自动删除 PV 对象及其关联的后端存储资源 | 临时数据、开发测试环境、自动扩缩容场景 | 低,数据随 PV 删除而丢失 |
| Recycle | 对卷执行 rm -rf /volume/* 后重新可用(已弃用) |
不推荐使用,建议用动态供给替代 | 中,数据被清除但卷保留 |
注意: 在“后端发布拓扑”场景中,Retain 策略通常是首选。因为当 Pod 因发布更新而迁移时,PVC 可能被重建,但 PV 需要保留旧数据以确保新 Pod 能继续访问。如果使用 Delete 策略,数据将随 PVC 删除而永久丢失,导致有状态服务中断。
2.6 PV 访问模式 (Access Modes)
访问模式决定了 PV 可以被多少个节点以何种方式挂载。这是选择存储后端时必须考虑的关键约束。
| 访问模式 | 缩写 | 说明 | 典型后端 |
|---|---|---|---|
| ReadWriteOnce | RWO | 单个节点以读写方式挂载 | hostPath, AWS EBS, GCE PD, Ceph RBD |
| ReadOnlyMany | ROX | 多个节点以只读方式挂载 | NFS, CephFS, GlusterFS |
| ReadWriteMany | RWX | 多个节点以读写方式挂载 | NFS, CephFS, Azure File, Longhorn |
后端发布拓扑提示: 如果你的应用需要多个副本同时写入同一份数据(例如 Active/Active 架构),必须选择支持 ReadWriteMany (RWX) 的存储后端。如果应用是主备模式(Active/Passive),则 ReadWriteOnce (RWO) 通常足够且性能更优。
2.7 PV 与 PVC 的绑定匹配规则
Kubernetes 在将 PVC 绑定到 PV 时,遵循以下匹配逻辑:
- 容量匹配: PV 的
capacity.storage必须 ≥ PVC 请求的resources.requests.storage。 - 访问模式匹配: PV 必须支持 PVC 请求的所有访问模式。
- StorageClass 匹配:
- 如果 PVC 指定了
storageClassName,则只绑定同名的 PV。 - 如果 PVC 未指定,则只绑定
storageClassName为空的 PV。 - 如果 PVC 指定
storageClassName: "",则只绑定未设置 StorageClass 的 PV。
- 如果 PVC 指定了
- 选择器匹配: 如果 PVC 定义了
selector(基于 label),则 PV 必须满足所有标签要求。
# 示例:通过选择器精确匹配 PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ssd-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
selector:
matchLabels:
storage-tier: ssd
zone: us-east-1a
核心总结: PV 是存储资源,PVC 是资源请求。PVC 绑定 PV 后,Pod 通过 PVC 使用存储。当 PVC 被删除时,PV 根据回收策略决定数据命运。在后端发布拓扑中,理解这一生命周期是设计有状态应用高可用和数据持久化的基础。