Qingular

PersistentVolume(PV)

·CKAk8s练习

CKA 考试 Domain 4 — PV 核心概念、存储类型、访问模式、回收策略、生命周期

← 返回 CKA 练习目录 PersistentVolume(PV)是集群中由管理员预置或通过 StorageClass 动态供给的一块存储。PV 是独立于 Pod 生命周期的集群资源,Pod 通过 PersistentVolumeClaim(PVC)来使用 PV。


1. PV 支持的存储类型

Kubernetes 支持多种后端存储系统,常见的有:

存储类型说明
hostPath节点本地磁盘(仅用于单节点测试)
NFS网络文件系统
iSCSIiSCSI 块存储
AWS EBSAWS 弹性块存储
GCE PDGoogle Compute Engine 持久化磁盘
Azure Disk / Azure FileAzure 磁盘 / 文件存储
Ceph RBD / CephFSCeph 块存储 / 文件系统
Portworx VolumesPortworx 存储
Local本地挂载的磁盘(手动管理)
CSI容器存储接口(通用扩展)

考试注意:CKA 考试中常出现 hostPathNFSCSI 三种类型。


2. 访问模式(Access Modes)

模式缩写说明
ReadWriteOnceRWO单节点读写
ReadOnlyManyROX多节点只读
ReadWriteManyRWX多节点读写
ReadWriteOncePodRWOP单 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
ReleasedPVC 已删除,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 仅用于单节点测试,多节点需使用 NFSCSI
  • 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 可以查看更多字段信息

官方文档