PersistentVolume(PV)
CKA 考试 Domain 4 — PV 核心概念、存储类型、访问模式、回收策略、生命周期
← 返回 CKA 练习目录 PersistentVolume(PV)是集群中由管理员预置或通过 StorageClass 动态供给的一块存储。PV 是独立于 Pod 生命周期的集群资源,Pod 通过 PersistentVolumeClaim(PVC)来使用 PV。
1. PV 支持的存储类型
Kubernetes 支持多种后端存储系统,常见的有:
| 存储类型 | 说明 |
|---|---|
hostPath | 节点本地磁盘(仅用于单节点测试) |
NFS | 网络文件系统 |
iSCSI | iSCSI 块存储 |
AWS EBS | AWS 弹性块存储 |
GCE PD | Google Compute Engine 持久化磁盘 |
Azure Disk / Azure File | Azure 磁盘 / 文件存储 |
Ceph RBD / CephFS | Ceph 块存储 / 文件系统 |
Portworx Volumes | Portworx 存储 |
Local | 本地挂载的磁盘(手动管理) |
CSI | 容器存储接口(通用扩展) |
考试注意:CKA 考试中常出现
hostPath、NFS、CSI三种类型。
2. 访问模式(Access Modes)
| 模式 | 缩写 | 说明 |
|---|---|---|
ReadWriteOnce | RWO | 单节点读写 |
ReadOnlyMany | ROX | 多节点只读 |
ReadWriteMany | RWX | 多节点读写 |
ReadWriteOncePod | RWOP | 单 Pod 读写(v1.22+) |
一个 PV 可以支持多种访问模式,但在绑定时只能使用其中一种。
accessModes:
- ReadWriteOnce
3. 回收策略(Reclaim Policy)
当 PVC 被删除后,PV 的回收策略决定存储资源的去向:
| 策略 | 行为 |
|---|---|
Retain | 保留 PV 和底层数据,需管理员手动回收 |
Recycle | 执行 rm -rf /volume/* 后再次可用(已弃用) |
Delete | 自动删除 PV 和关联的存储资源(动态供给时常用) |
persistentVolumeReclaimPolicy: Retain
4. 卷模式(Volume Mode)
| 模式 | 说明 |
|---|---|
Filesystem | 默认模式,挂载为文件系统 |
Block | 原始块设备(如数据库专用存储) |
volumeMode: Filesystem
5. PV 生命周期
Available ──► Bound ──► Released ──► Failed
| 阶段 | 说明 |
|---|---|
Available | 可用,尚未绑定到 PVC |
Bound | 已绑定到某个 PVC |
Released | PVC 已删除,PV 尚未回收 |
Failed | 自动回收失败 |
6. hostPath PV 示例
仅用于单节点测试环境,不适用于生产。
apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/pv
type: DirectoryOrCreate
7. NFS PV 示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.1.100
path: /exports/data
8. 实用命令
# 查看所有 PV
kubectl get pv
# 查看 PV 详情
kubectl describe pv <pv-name>
# 按存储容量排序
kubectl get pv --sort-by=.spec.capacity.storage
# 查看 PV 的 YAML
kubectl get pv <pv-name> -o yaml
# 删除 PV
kubectl delete pv <pv-name>
9. 考试要点
- PV 是集群资源,不隶属于任何命名空间
hostPath仅用于单节点测试,多节点需使用NFS、CSI等- PV 的
capacity不可动态修改(需要删除重建) persistentVolumeReclaimPolicy决定 PVC 删除后的行为- 检查 PV 状态:
kubectl get pv查看 PHASE 列
🧪 完整操作实例:创建 hostPath PV 并观察生命周期状态
场景描述
创建一个 hostPath 类型的 PV,观察其从 Available → Bound → Released 的完整生命周期,验证访问模式和回收策略。
前置条件
- 一个节点的 Kubernetes 集群(单节点即可)
- 节点上存在
/data/pv目录(PV 会自动创建)
操作步骤
Step 1: 创建 hostPath PV 定义文件
cat <<EOF > /tmp/hostpath-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/pv
type: DirectoryOrCreate
EOF
Step 2: 创建 PV 并查看初始状态
kubectl apply -f /tmp/hostpath-pv.yaml
kubectl get pv
# NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
# hostpath-pv 1Gi RWO Retain Available manual 5s
此时 STATUS 为 Available,表示 PV 已就绪等待 PVC 绑定。
Step 3: 创建 PVC 绑定 PV
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hostpath-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF
Step 4: 验证 PV 状态变为 Bound
kubectl get pv
# NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
# hostpath-pv 1Gi RWO Retain Bound default/hostpath-pvc manual 30s
kubectl get pvc
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# hostpath-pvc Bound hostpath-pv 1Gi RWO manual 10s
STATUS 变为 Bound,且 CLAIM 列显示绑定到 default/hostpath-pvc。
Step 5: 删除 PVC 观察 Released 状态
kubectl delete pvc hostpath-pvc
kubectl get pv
# NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
# hostpath-pv 1Gi RWO Retain Released default/hostpath-pvc manual 60s
STATUS 变为 Released,但由于回收策略是 Retain,PV 不会被自动清理,底层数据保留。
Step 6: 手动回收 Released 状态的 PV
# 重新利用此 PV 需要手动删除并重建
kubectl delete pv hostpath-pv
# 清理宿主机数据(可选)
# rm -rf /data/pv
验证结果
# 验证 Access Mode
kubectl get pv hostpath-pv -o jsonpath='{.spec.accessModes}'
# ["ReadWriteOnce"]
# 验证 Reclaim Policy
kubectl get pv hostpath-pv -o jsonpath='{.spec.persistentVolumeReclaimPolicy}'
# Retain
# 验证 Storage 容量
kubectl get pv hostpath-pv -o jsonpath='{.spec.capacity.storage}'
# 1Gi
考试提示
- PV 创建后状态为
Available,绑定后变为Bound,PVC 删除后变为Released Retain策略不会自动删除 PV,需要管理员手动清理- hostPath 仅适用于单节点测试环境,考试中常作为快速验证手段
- 使用
kubectl get pv -o wide可以查看更多字段信息