Skip to content

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.100

PersistentVolumeClaim

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: ssd

StorageClass

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

本站内容由 褚成志 整理编写,仅供学习参考