目录

K8S中PV和PVC之间的关系

K8S中PV和PVC之间的关系

Persistent Volume (PV)Persistent Volume Claim (PVC) 是 Kubernetes 中管理存储的核心抽象概念,二者的关系可以类比为 存储资源提供方存储资源消费方 。以下是详细解释:

核心关系

对象角色生命周期使用者
Persistent Volume (PV)存储资源的实体 (如 NFS、云磁盘、本地磁盘等)独立于 Pod 和 PVC,需手动或动态创建由集群管理员配置
Persistent Volume Claim (PVC)用户对存储资源的请求 (声明需要的存储特性)与 Pod 绑定,由用户创建和销毁开发者或应用运维人员

交互流程

  1. 管理员创建 PV

    • 定义存储资源的容量、访问模式(如 ReadWriteOnce )、存储类型等。

    • 示例 PV 配置(静态供应):

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: my-pv
      spec:
        capacity:
          storage: 10Gi
        accessModes:
          - ReadWriteOnce
        persistentVolumeReclaimPolicy: Retain  # 回收策略(Retain/Delete/Recycle)
        storageClassName: manual              # 关联的 StorageClass
        hostPath:
          path: /data                         # 使用本地存储(仅示例)
  2. 用户创建 PVC

    • 声明需要的存储容量、访问模式、存储类(StorageClass)。

    • 示例 PVC 配置:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: my-pvc
      spec:
        storageClassName: manual
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 5Gi
  3. Kubernetes 绑定 PV 和 PVC

    • 系统根据 PVC 的请求(容量、访问模式、StorageClass) 匹配可用 PV
    • 若匹配成功,PVC 进入 Bound 状态,与 PV 建立一对一绑定。
    • 若没有可用 PV,且启用了动态供应(通过 StorageClass),则会 自动创建新 PV
  4. Pod 挂载 PVC

    • 在 Pod 中通过 volumes 字段引用 PVC:

      apiVersion: v1
      kind: Pod
      metadata:
        name: my-pod
      spec:
        containers:
          - name: app
            image: nginx
            volumeMounts:
              - name: data
                mountPath: /var/www/html
        volumes:
          - name: data
            persistentVolumeClaim:
              claimName: my-pvc  # 使用已绑定的 PVC

关键特性对比

特性PVPVC
定义者集群管理员应用开发者
创建方式手动创建或动态供应(通过 StorageClass)用户手动创建
绑定关系一个 PV 只能绑定到一个 PVC一个 PVC 只能绑定到一个 PV
回收策略支持 RetainDeleteRecycle无,随 PV 的回收策略处理
动态供应依赖 StorageClass 和 Provisioner通过指定 StorageClass 触发动态创建 PV

生命周期与回收策略

  1. PV 的回收策略persistentVolumeReclaimPolicy

    • Retain (默认):删除 PVC 后,PV 保留数据,需手动清理。
    • Delete :删除 PVC 后,自动删除 PV 及底层存储(如云磁盘)。
    • Recycle (已废弃):删除数据并标记 PV 为可用(仅适用于部分存储类型)。
  2. PVC 删除后的行为

    • 若 PV 的回收策略为 Retain ,则 PV 进入 Released 状态,需管理员手动清理后重新绑定。
    • 若为 Delete ,则 PV 和底层存储资源会被自动删除。

动态供应(Dynamic Provisioning)

当使用 StorageClass 时,PVC 可以直接触发 PV 的自动创建,无需管理员预先配置 PV。

  • 示例 StorageClass(AWS EBS):

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: aws-gp2
    provisioner: kubernetes.io/aws-ebs  # 指定存储驱动
    parameters:
      type: gp2
    reclaimPolicy: Delete              # 动态创建的 PV 默认回收策略
  • 用户创建 PVC 时指定 StorageClass:

    spec:
      storageClassName: aws-gp2  # 动态创建符合要求的 PV
      accessModes: [ReadWriteOnce]
      resources:
        requests:
          storage: 20Gi

总结

  • PV 是实际的存储资源, PVC 是用户对存储需求的抽象。
  • PVC 通过匹配 PV 的规格 (容量、访问模式、StorageClass)来绑定存储资源。
  • 动态供应 通过 StorageClass 实现按需自动创建 PV,大幅简化存储管理。
  • 二者的分离使得 存储资源的提供方(管理员)和使用方(开发者)职责清晰 ,提升灵活性和可维护性。