62·存储进阶

PersistentVolume

kubernetesstoragepvpersistent-volume

PersistentVolume

学习目标

  1. 理解 PersistentVolume (PV) 的作用和生命周期
  2. 掌握 PV 的 YAML 定义和关键字段
  3. 了解 PV 的访问模式和回收策略

核心概念

PV 是什么

PersistentVolume (持久卷):
┌─────────────────────────────────────┐
│  集群级别的存储资源                  │
│                                      │
│  - 由管理员预先创建                  │
│  - 独立于 Pod 生命周期               │
│  - 类似于集群中的"存储磁盘"          │
└─────────────────────────────────────┘

类比:
PV 就像一块硬盘,可以挂载给任何 Pod 使用

PV vs Volume

方面VolumePersistentVolume
生命周期跟随 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

访问模式

模式缩写说明适用场景
ReadWriteOnceRWO单节点读写块存储、数据库
ReadOnlyManyROX多节点只读共享配置
ReadWriteManyRWX多节点读写NFS、分布式文件系统
ReadWriteOncePodRWOP单 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
ReleasedPVC 已删除,但 PV 未回收
Failed自动回收失败
PV 状态流转:

Available ──绑定──→ Bound ──PVC删除──→ Released ──回收──→ Available/Deleted
                                                              │
                                                              ▼
                                                           Failed

常用存储后端

# 本地路径
spec:
  hostPath:
    path: /data/pv
    type: DirectoryOrCreate

# NFS
spec:
  nfs:
    server: 192.168.1.100
    path: /exports/data

# Ceph RBD
spec:
  rbd:
    monitors:
      - 10.0.0.1:6789
    pool: k8s
    image: my-image
    user: admin
    secretRef:
      name: ceph-secret

# AWS EBS
spec:
  awsElasticBlockStore:
    volumeID: vol-xxxx
    fsType: ext4

# GCE PD
spec:
  gcePersistentDisk:
    pdName: my-disk
    fsType: ext4

实践练习

练习 1:创建 PV

创建一个使用 hostPath 的 PV:

# pv-demo.yaml
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 详情

# 查看 PV 列表
kubectl get pv

# 查看 PV 详细信息
kubectl describe pv pv-demo

# 查看 PV 的 YAML(含状态)
kubectl get pv pv-demo -o yaml

练习 3:理解回收策略

# 创建 PV 并观察状态变化
kubectl get pv -w

# 删除绑定的 PVC 后观察 PV 状态
kubectl delete pvc my-pvc
kubectl get pv  # 状态变为 Released

常见误解

1. PV 不是自动创建的

PV 通常由管理员手动创建,或通过 StorageClass 动态供给
开发者一般通过 PVC 来申请存储,而不是直接创建 PV

2. 访问模式是声明性的

访问模式是 PV 对自身能力的声明,不会强制限制访问
实际的访问控制由底层存储系统实现

小结

要点说明
PV集群级别的持久存储资源
访问模式RWO / ROX / RWX / RWOP
回收策略Retain(保留)/ Delete(删除)
状态Available → Bound → Released
管理通常由管理员或 StorageClass 创建

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「PersistentVolumeClaim」 以巩固所学知识。