PV 与 PVC 是什么
PV(PersistentVolume)是集群级的存储资源抽象,代表一块已经存在的存储,如云盘、NAS、本地 SSD;PVC(PersistentVolumeClaim)是命名空间里的一张申请单,声明要多大容量、什么访问模式、哪类存储。Pod 只引用 PVC,由绑定过程把 PVC 与某个 PV 对上,从而把存储供给与业务使用解耦。
基本信息
| 作用范围 | PV 集群级,PVC 命名空间级,绑定后一对一独占 |
|---|---|
| 绑定三要素 | 容量足够、accessModes 兼容、storageClassName 一致 |
| 动态供给 | StorageClass 配有 provisioner 时按 PVC 自动建盘,无需手写 PV |
| 回收策略 | reclaimPolicy 为 Delete 或 Retain,决定删 PVC 后底层存储的去留 |
| 查看 | kubectl get pv / get pvc / describe pvc 看 Events |
访问模式速查
| 模式 | 含义 | 典型后端 |
|---|---|---|
| ReadWriteOnce | 单节点可读写挂载 | 云盘等块存储 |
| ReadOnlyMany | 多节点同时只读 | 共享镜像与静态数据 |
| ReadWriteMany | 多节点同时读写 | NAS、NFS 文件存储 |
| ReadWriteOncePod | 只允许一个 Pod 读写 | 需要强一致单写的场景 |
PVC 与 Pod 引用
PVC 与 Pod 引用
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
namespace: dev
spec:
accessModes: ["ReadWriteOnce"] # 单节点读写,云盘常用
storageClassName: fast-ssd # 名字必须与 StorageClass 完全一致
resources:
requests:
storage: 20Gi # 超过 PV 容量则绑不上
---
volumes: # Pod spec 中的引用片段
- name: data
persistentVolumeClaim:
claimName: app-data # 指向同命名空间的 PVC典型使用场景
- 数据库数据目录持久化:Pod 反复重建,数据留在卷上不丢
- StatefulSet 每个副本各绑一块盘,靠 volumeClaimTemplates 自动生成 PVC
- 多副本只读共享:模型文件、静态资源放 RWX 的 NAS 卷
- 中间件与日志落盘,避免容器可写层无限膨胀后撑爆节点
- 大容量冷数据挂在低成本存储类上,与高性能盘分开管理
PVC 长期 Pending 按三步查:storageClassName 是否存在、容量与访问模式是否有 PV 能满足、volumeBindingMode 为 WaitForFirstConsumer 时是否还没有 Pod 触发绑定。最后一种情况下的 Pending 属于正常等待。
动态供给场景不需要手写 PV;只有本地盘、已有 NFS 或必须保留数据时才手工建 PV,并用 storageClassName 与容量精确划定范围,避免把生产盘绑给测试 PVC。
Delete 回收策略下删除 PVC 会连带删除底层云盘,数据不可恢复;生产环境建议 PV 用 Retain,删 PVC 之前先做快照。