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

关键特性对比

特性 PV PVC
定义者 集群管理员 应用开发者
创建方式 手动创建或动态供应(通过 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,大幅简化存储管理。

  • 二者的分离使得存储资源的提供方(管理员)和使用方(开发者)职责清晰,提升灵活性和可维护性。

相关推荐
运维开发故事2 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生4 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Java之美5 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维