对象定位
PV 是集群中一块实际存储的抽象(容量、访问模式、回收策略、后端驱动),PVC 是使用者提出的申请(要多大、什么访问模式、用哪个存储类)。适用平台是 Kubernetes。绑定就是控制器按条件把两者配成一对:绑定完成后 Pod 只通过 PVC 名字引用卷,不需要知道底层是云盘、NFS 还是本地盘。动态制备时 PV 由 StorageClass 指定的驱动自动创建,静态时由管理员提前建好等待匹配。
基本信息
| 适用平台 | Kubernetes,PV 为集群级对象,PVC 为命名空间级对象 |
|---|---|
| 绑定关系 | 一对一绑定,绑定后 PVC 的 spec.volumeName 指向具体 PV |
| 回收策略 | PV 的 persistentVolumeReclaimPolicy 可取 Delete、Retain 等 |
| 扩容前提 | StorageClass 开启 allowVolumeExpansion 且底层驱动支持 |
典型使用场景
- 数据库持久化:为 MySQL、PostgreSQL 挂载独立卷,避免 Pod 重建丢数据
- 多环境同构部署:不同云上集群各自定义同名 StorageClass,清单保持一致
- 容量盘点:核对 PVC 申请量与实际使用,识别长期空占的卷
- 迁移与回收:删除前确认回收策略,避免 Delete 策略连带删除底层数据
- 故障恢复:Pod 漂移后重新挂载同一 PVC,验证数据是否完整
PVC 引用
PVC 引用
spec:
containers:
- name: db
image: registry.example.com/db:8.0
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-data查看绑定
查看绑定
kubectl get pvc -n prod # STATUS 应为 Bound
kubectl get pv # 集群级视图,看 Claim 列指向哪个 PVC
kubectl get pvc mysql-data -o jsonpath='{.spec.volumeName}' # PVC 绑到哪个 PV
kubectl describe pvc mysql-data | grep -A5 Events # 绑定失败的原因
kubectl get pv <pv-name> -o jsonpath='{.spec.persistentVolumeReclaimPolicy}'绑定匹配条件
| 条件 | 说明 | 常见坑 |
|---|---|---|
| 容量 | PV 容量不小于 PVC 申请量 | 静态 PV 容量偏小会一直 Pending |
| accessModes | PV 支持的模式需覆盖 PVC 要求 | RWO 与 RWX 不通用,由驱动能力决定 |
| storageClassName | 两边需一致(PVC 留空走默认类) | 类名拼错或旧类已删导致不绑定 |
| selector | PVC 指定标签筛选时按标签匹配 PV | 标签写错时匹配不到候选卷 |
静态供应时 PV 与 PVC 的容量、访问模式、存储类需要逐项兼容;只要一项不满足,PVC 就会停在 Pending 并给出事件。
回收策略决定删除行为:Delete 会连带删除后端存储,Retain 会保留数据但卷转成 Released 状态且不会自动复用,需要手工处理。