一、基本概念
- PV(PersistentVolume):由管理员预先配置或由存储类动态创建的存储资源,是集群中的一块实际存储。
- PVC(PersistentVolumeClaim):用户对存储的请求,声明所需的容量、访问模式等。
二、关联条件
PVC 与 PV 的绑定需满足以下条件:
- 容量(storage)
- PV 的容量必须大于等于 PVC 请求的容量。
- 访问模式(Access Modes)
- 常见模式:
ReadWriteOnce(单节点读写)ReadOnlyMany(多节点只读)ReadWriteMany(多节点读写)
- PV 必须支持 PVC 请求的访问模式。
- 常见模式:
- 存储类(StorageClass)
- 如果 PVC 指定了
storageClassName,只会绑定同名的 PV。 - 未指定时,绑定无存储类或默认存储类的 PV。
- 如果 PVC 指定了
三、回收策略(Reclaim Policy)
PV 的回收策略决定了 PVC 释放后 PV 的处理方式:
Retain(保留):PV 和数据不会被删除,需手动处理。Recycle(回收):已废弃,原本会简单清空数据后重新可用。Delete(删除):PV 及其后端存储资源会被自动删除(如云盘)。
删除的处理方式只支持云服务商提供的存储类型,如 AWS EBS、GCE Persistent Disk 等。
四、PV/PVC 状态
PV 状态
Available:未绑定 PVC,可用Bound:已绑定 PVCReleased:PVC 已删除,但资源未被回收Failed:自动回收失败
PVC 状态
Pending:未绑定 PVBound:已绑定 PVLost:绑定的 PV 不可用
五、PVC 保护(PVC Protection)
Kubernetes 提供 PVC 保护机制,防止正在被 Pod 使用的 PVC 被误删:
- 当 PVC 被 Pod 挂载时,删除操作会被阻止,直到 PVC 不再被任何 Pod 使用。
- 通过 PVC 的
finalizer字段实现。
六、移除PV的绑定状态
当需要移除 PV 的绑定状态时,可以通过以下步骤:
- 修改 PVC 的
spec.claimRef字段为空。
bash
kubectl edit pvc <pvc-name>- 删除 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 状态,避免资源泄漏