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 的生命周期包含四个阶段:供给 → 绑定 → 使用 → 回收。下图展示了这一完整流程以及各阶段的状态转换。

PV / PVC 生命周期与状态转换 供给 (Provisioning) 静态 / 动态创建 PV 绑定 (Binding) PVC 匹配并绑定 PV 使用 (Using) Pod 挂载 PVC 读写数据 回收 (Reclaim) 根据策略处理 PV 匹配成功 绑定完成 PVC 删除 / Pod 终止 状态: Available 状态: Bound 状态: Released Retain (保留) 手动清理后复用 Delete (删除) 自动删除后端存储 Recycle (回收) 已弃用,不推荐

2.4 生命周期各阶段详解

  1. 供给 (Provisioning)
    • 静态供给: 管理员预先创建 PV,指定容量、访问模式、存储类型和后端连接信息。
    • 动态供给: 通过 StorageClass 自动创建 PV。当 PVC 提交时,集群根据 StorageClass 的 provisioner 调用后端存储 API 创建卷。
  2. 绑定 (Binding)
    • 控制平面查找与 PVC 请求匹配的 PV(容量 ≥ 请求、访问模式兼容、StorageClass 一致)。
    • 绑定是一对一的:一个 PV 在同一时间只能绑定一个 PVC。
    • 如果找不到匹配的 PV 且 StorageClass 支持动态供给,则触发动态创建。
  3. 使用 (Using)
    • Pod 通过 volumes.persistentVolumeClaim 引用 PVC 来挂载存储。
    • 多个 Pod 可以同时引用同一个 PVC(取决于访问模式限制)。
    • Pod 运行期间,PV 的数据持续存在,不受 Pod 重启影响。
  4. 回收 (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 定义了 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 根据回收策略决定数据命运。在后端发布拓扑中,理解这一生命周期是设计有状态应用高可用和数据持久化的基础。