avatar🌌
TangentTangent Blog

技术博客 | Go & Kubernetes & Linux

技术博客 | Go & Kubernetes & Linux

PV(PersistentVolume)与 PVC(PersistentVolumeClaim)详解

一、基本概念 ​

  • PV(PersistentVolume):由管理员预先配置或由存储类动态创建的存储资源,是集群中的一块实际存储。
  • PVC(PersistentVolumeClaim):用户对存储的请求,声明所需的容量、访问模式等。

二、关联条件 ​

PVC 与 PV 的绑定需满足以下条件:

  1. 容量(storage)
    • PV 的容量必须大于等于 PVC 请求的容量。
  2. 访问模式(Access Modes)
    • 常见模式:
      • ReadWriteOnce(单节点读写)
      • ReadOnlyMany(多节点只读)
      • ReadWriteMany(多节点读写)
    • PV 必须支持 PVC 请求的访问模式。
  3. 存储类(StorageClass)
    • 如果 PVC 指定了 storageClassName,只会绑定同名的 PV。
    • 未指定时,绑定无存储类或默认存储类的 PV。

三、回收策略(Reclaim Policy) ​

PV 的回收策略决定了 PVC 释放后 PV 的处理方式:

  • Retain(保留):PV 和数据不会被删除,需手动处理。
  • Recycle(回收):已废弃,原本会简单清空数据后重新可用。
  • Delete(删除):PV 及其后端存储资源会被自动删除(如云盘)。

删除的处理方式只支持云服务商提供的存储类型,如 AWS EBS、GCE Persistent Disk 等。

四、PV/PVC 状态 ​

PV 状态 ​

  • Available:未绑定 PVC,可用
  • Bound:已绑定 PVC
  • Released:PVC 已删除,但资源未被回收
  • Failed:自动回收失败

PVC 状态 ​

  • Pending:未绑定 PV
  • Bound:已绑定 PV
  • Lost:绑定的 PV 不可用

五、PVC 保护(PVC Protection) ​

Kubernetes 提供 PVC 保护机制,防止正在被 Pod 使用的 PVC 被误删:

  • 当 PVC 被 Pod 挂载时,删除操作会被阻止,直到 PVC 不再被任何 Pod 使用。
  • 通过 PVC 的 finalizer 字段实现。

六、移除PV的绑定状态 ​

当需要移除 PV 的绑定状态时,可以通过以下步骤:

  1. 修改 PVC 的 spec.claimRef 字段为空。
bash
kubectl edit pvc <pvc-name>
  1. 删除 PV后重建。
bash
kubectl delete pv <pv-name>
kubectl apply -f <pv-definition-file>

七、示例 YAML ​

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  hostPath:
    path: /mnt/data
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 500Mi

八、常见问题与建议 ​

  • 建议为生产环境使用动态存储类(StorageClass)
  • 注意 PV/PVC 的生命周期和数据安全
  • 定期检查 PV 状态,避免资源泄漏

参考 ​

Kubernetes StorageClass 详解与实验教程
Kubernetes Secret 详解
由 Valaxy v1.2.2 驱动|主题-Yunv1.2.2