Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 是 Kubernetes 中管理存储的核心抽象概念,二者的关系可以类比为 存储资源提供方 和 存储资源消费方。以下是详细解释:
核心关系
对象 | 角色 | 生命周期 | 使用者 |
---|---|---|---|
Persistent Volume (PV) | 存储资源的实体(如 NFS、云磁盘、本地磁盘等) | 独立于 Pod 和 PVC,需手动或动态创建 | 由集群管理员配置 |
Persistent Volume Claim (PVC) | 用户对存储资源的请求(声明需要的存储特性) | 与 Pod 绑定,由用户创建和销毁 | 开发者或应用运维人员 |
交互流程
管理员创建 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 # 使用本地存储(仅示例)
用户创建 PVC
声明需要的存储容量、访问模式、存储类(StorageClass)。
示例 PVC 配置:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
Kubernetes 绑定 PV 和 PVC
系统根据 PVC 的请求(容量、访问模式、StorageClass)匹配可用 PV。
若匹配成功,PVC 进入
Bound
状态,与 PV 建立一对一绑定。若没有可用 PV,且启用了动态供应(通过 StorageClass),则会自动创建新 PV。
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 |
回收策略 | 支持 Retain 、Delete 、Recycle |
无,随 PV 的回收策略处理 |
动态供应 | 依赖 StorageClass 和 Provisioner | 通过指定 StorageClass 触发动态创建 PV |
生命周期与回收策略
PV 的回收策略(
persistentVolumeReclaimPolicy
)Retain(默认):删除 PVC 后,PV 保留数据,需手动清理。
Delete:删除 PVC 后,自动删除 PV 及底层存储(如云磁盘)。
Recycle(已废弃):删除数据并标记 PV 为可用(仅适用于部分存储类型)。
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,大幅简化存储管理。
二者的分离使得存储资源的提供方(管理员)和使用方(开发者)职责清晰,提升灵活性和可维护性。