PV / PVC / StorageClass 深度解析
三者关系
StorageClass(存储类,定义如何动态创建存储)
│ 动态制备
▼
PersistentVolume(集群级存储资源,管理员创建或动态创建)
│ 绑定(1:1)
▼
PersistentVolumeClaim(命名空间级存储申请,开发者创建)
│ 挂载
▼
Pod(使用存储)PersistentVolume
yaml
# 静态 PV(管理员手动创建)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-001
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storage
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /exports/data
server: 192.168.1.100PersistentVolumeClaim
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
namespace: production
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast-ssd # 指定 StorageClass(动态制备)
resources:
requests:
storage: 20Gi
# 选择器(静态绑定时使用)
selector:
matchLabels:
type: ssdStorageClass
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 设为默认
provisioner: ebs.csi.aws.com # CSI 驱动
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true # 允许扩容
volumeBindingMode: WaitForFirstConsumer # 延迟绑定(等 Pod 调度后再创建)
mountOptions:
- debug在 Pod 中使用 PVC
yaml
spec:
containers:
- name: app
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
readOnly: false动态制备流程
1. 开发者创建 PVC(指定 StorageClass)
2. StorageClass 的 Provisioner 收到通知
3. Provisioner 调用存储后端 API 创建存储
4. Provisioner 创建 PV 并与 PVC 绑定
5. kubelet 挂载 PV 到 Pod卷扩容
bash
# 前提:StorageClass 设置了 allowVolumeExpansion: true
# 修改 PVC 大小
kubectl patch pvc my-pvc -p '{"spec":{"resources":{"requests":{"storage":"50Gi"}}}}'
# 查看扩容状态
kubectl describe pvc my-pvc | grep -A5 Conditions卷快照
yaml
# 创建快照
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: my-pvc
---
# 从快照恢复
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restored-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast-ssd
resources:
requests:
storage: 20Gi
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io常用操作
bash
# 查看 PV/PVC 状态
kubectl get pv
kubectl get pvc -n production
kubectl describe pvc my-pvc
# PV 状态说明
# Available:可用,未绑定
# Bound:已绑定到 PVC
# Released:PVC 已删除,等待回收
# Failed:回收失败
# 手动绑定 PV 和 PVC(静态绑定)
# 在 PV 中指定 claimRef
kubectl patch pv pv-001 -p '{"spec":{"claimRef":{"name":"my-pvc","namespace":"default"}}}'
# 查看存储类
kubectl get storageclass