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

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

相关推荐
杨江7 分钟前
seafile docker安装说明
运维
好好沉淀14 分钟前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng23 分钟前
Linux 输出重定向
linux·运维
路由侠内网穿透.25 分钟前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独28 分钟前
ns-3仿真之应用层(三)
运维·服务器·ns3
VekiSon43 分钟前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
skywalk81632 小时前
尝试在openi启智社区的dcu环境安装ollama最新版0.15.2(失败)
linux·运维·服务器·ollama
MMME~2 小时前
Ansible模块速查指南:高效定位与实战技巧
大数据·运维·数据库
zhengfei6112 小时前
AutoPentestX – Linux 自动化渗透测试和漏洞报告工具
linux·运维·自动化
我材不敲代码2 小时前
在Linux系统上安装MySQL
linux·运维·服务器