PersistentVolume
学习目标
理解 PersistentVolume (PV) 的作用和生命周期
掌握 PV 的 YAML 定义和关键字段
了解 PV 的访问模式和回收策略
核心概念
PV 是什么
PersistentVolume (持久卷):
┌─────────────────────────────────────┐
│ 集群级别的存储资源 │
│ │
│ - 由管理员预先创建 │
│ - 独立于 Pod 生命周期 │
│ - 类似于集群中的"存储磁盘" │
└─────────────────────────────────────┘
类比:
PV 就像一块硬盘,可以挂载给任何 Pod 使用
PV vs Volume
方面 Volume PersistentVolume 生命周期 跟随 Pod 独立管理 创建方式 Pod 定义中 单独创建 可见性 Pod 内部 集群全局 复用性 不可 可跨 Pod 复用
PV YAML 结构
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /data/pv
复制 + 追加到编辑器
访问模式
模式 缩写 说明 适用场景 ReadWriteOnce RWO 单节点读写 块存储、数据库 ReadOnlyMany ROX 多节点只读 共享配置 ReadWriteMany RWX 多节点读写 NFS、分布式文件系统 ReadWriteOncePod RWOP 单 Pod 读写 K8s 1.22+
访问模式关系:
RWO(ReadWriteOnce):
Node A ──读写──→ PV
Node B ──✗──→ PV
ROX(ReadOnlyMany):
Node A ──只读──→ PV
Node B ──只读──→ PV
RWX(ReadWriteMany):
Node A ──读写──→ PV
Node B ──读写──→ PV
Node C ──读写──→ PV
回收策略
策略 说明 行为 Retain 保留 PVC 删除后 PV 保留,需手动处理 Delete 删除 PVC 删除后 PV 和后端存储一起删除 Recycle 回收 已废弃,不推荐使用
回收策略流程:
Retain:
PVC 删除 → PV 状态变为 Released → 等待管理员处理
Delete:
PVC 删除 → PV 和底层存储自动删除
手动回收 Released PV:
kubectl delete pv my-pv # 删除 PV
# 或
kubectl patch pv my-pv -p '{"spec":{"claimRef": null}}' # 重新可用
PV 状态
状态 说明 Available 可用,未绑定到 PVC Bound 已绑定到 PVC Released PVC 已删除,但 PV 未回收 Failed 自动回收失败
PV 状态流转:
Available ──绑定──→ Bound ──PVC删除──→ Released ──回收──→ Available/Deleted
│
▼
Failed
常用存储后端
spec:
hostPath:
path: /data/pv
type: DirectoryOrCreate
spec:
nfs:
server: 192.168 .1 .100
path: /exports/data
spec:
rbd:
monitors:
- 10.0 .0 .1 :6789
pool: k8s
image: my-image
user: admin
secretRef:
name: ceph-secret
spec:
awsElasticBlockStore:
volumeID: vol-xxxx
fsType: ext4
spec:
gcePersistentDisk:
pdName: my-disk
fsType: ext4
复制 + 追加到编辑器
实践练习
练习 1:创建 PV
创建一个使用 hostPath 的 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /tmp/pv-demo
复制 + 追加到编辑器
kubectl apply -f pv-demo.yaml
kubectl get pv pv-demo
复制 + 追加到编辑器
练习 2:查看 PV 详情
kubectl get pv
kubectl describe pv pv-demo
kubectl get pv pv-demo -o yaml
复制 + 追加到编辑器
练习 3:理解回收策略
kubectl get pv -w
kubectl delete pvc my-pvc
kubectl get pv
复制 + 追加到编辑器
常见误解
1. PV 不是自动创建的
PV 通常由管理员手动创建,或通过 StorageClass 动态供给
开发者一般通过 PVC 来申请存储,而不是直接创建 PV
2. 访问模式是声明性的
访问模式是 PV 对自身能力的声明,不会强制限制访问
实际的访问控制由底层存储系统实现
小结
要点 说明 PV 集群级别的持久存储资源 访问模式 RWO / ROX / RWX / RWOP 回收策略 Retain(保留)/ Delete(删除) 状态 Available → Bound → Released 管理 通常由管理员或 StorageClass 创建