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,大幅简化存储管理。

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

相关推荐
聆风吟º3 小时前
CANN开源项目深度实践:基于amct-toolkit实现自动化模型量化与精度保障策略
运维·开源·自动化·cann
较劲男子汉7 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
风流倜傥唐伯虎7 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力7 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene7 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
忧郁的橙子.7 小时前
02-本地部署Ollama、Python
linux·运维·服务器
醇氧7 小时前
【linux】查看发行版信息
linux·运维·服务器
[shenhonglei]8 小时前
灰度发布功能需求说明书
kubernetes
No8g攻城狮8 小时前
【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤
linux·运维·ubuntu
酷酷的崽7988 小时前
CANN 生态可维护性与可观测性:构建生产级边缘 AI 系统的运维体系
运维·人工智能