64·存储进阶

StorageClass

kubernetesstoragestorage-classprovisioner

StorageClass

学习目标

  1. 理解 StorageClass 的作用和组成
  2. 掌握 StorageClass 的定义方法
  3. 了解不同 Provisioner 的使用场景

核心概念

StorageClass 是什么

StorageClass (存储类):
┌─────────────────────────────────────┐
│  定义存储的"类型"和供给方式          │
│                                      │
│  - 类似于存储的"套餐"                │
│  - 定义 Provisioner(谁来创建存储)  │
│  - 定义参数(存储的具体配置)        │
│  - 支持动态供给                      │
└─────────────────────────────────────┘

类比:
StorageClass = 存储套餐
- SSD 套餐:高性能、贵
- HDD 套餐:大容量、便宜
- 用户只需选择套餐,不用管底层实现

StorageClass 组成

┌─────────────────────────────────────┐
│           StorageClass              │
│                                      │
│  ┌───────────────────────────────┐  │
│  │ provisioner                   │  │
│  │ 谁来创建存储?                │  │
│  │ kubernetes.io/aws-ebs         │  │
│  └───────────────────────────────┘  │
│                                      │
│  ┌───────────────────────────────┐  │
│  │ parameters                    │  │
│  │ 存储的具体参数                │  │
│  │ type: gp3                     │  │
│  │ fsType: ext4                  │  │
│  └───────────────────────────────┘  │
│                                      │
│  ┌───────────────────────────────┐  │
│  │ reclaimPolicy                 │  │
│  │ 删除 PVC 后如何处理 PV?      │  │
│  │ Delete / Retain               │  │
│  └───────────────────────────────┘  │
│                                      │
│  ┌───────────────────────────────┐  │
│  │ volumeBindingMode             │  │
│  │ 何时绑定 PV?                 │  │
│  │ Immediate / WaitForFirstConsumer │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

StorageClass YAML

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs  # Provisioner
parameters:                          # 存储参数
  type: gp3
  fsType: ext4
reclaimPolicy: Delete                # 回收策略
volumeBindingMode: WaitForFirstConsumer  # 绑定模式
allowVolumeExpansion: true           # 允许扩容

Provisioner 类型

Provisioner说明场景
kubernetes.io/no-provisioner无自动供给本地存储、NFS
kubernetes.io/aws-ebsAWS EBSAWS 环境
kubernetes.io/gce-pdGCE PDGCP 环境
kubernetes.io/azure-diskAzure DiskAzure 环境
rook.io/blockCeph RBD自建 Ceph
nfs-subdir-external-provisionerNFSNFS 动态供给

绑定模式

Immediate(立即绑定):
  PVC 创建 → 立即创建 PV 并绑定
  问题:Pod 可能被调度到无法访问 PV 的节点

WaitForFirstConsumer(等待消费者):
  PVC 创建 → 等待 Pod 使用时再创建 PV
  优势:PV 创建在 Pod 所在的节点/区域
Immediate 模式:
  PVC ──创建──→ PV ──绑定──→ PVC
                 │
                 ▼
         Pod 调度到任意节点
         可能无法访问 PV ❌

WaitForFirstConsumer 模式:
  PVC ──创建──→ 等待
                 │
                 ▼
         Pod 调度到某节点
                 │
                 ▼
         PV 创建在该节点 ✓
                 │
                 ▼
         PVC 绑定 PV

默认 StorageClass

# 查看默认 StorageClass
kubectl get storageclass

# 标记为默认
kubectl patch storageclass my-sc -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
默认 StorageClass 的作用:
- PVC 不指定 storageClassName 时使用默认的
- 一个集群只能有一个默认 StorageClass

允许扩容

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: expandable
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true    # 允许扩容
# 扩容 PVC
kubectl patch pvc my-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

实践练习

练习 1:创建本地 StorageClass

# storage-class-local.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
kubectl apply -f storage-class-local.yaml
kubectl get sc

练习 2:查看 StorageClass 详情

# 列出所有 StorageClass
kubectl get sc

# 查看详情
kubectl describe sc local-storage

# 查看 YAML
kubectl get sc local-storage -o yaml

练习 3:使用 StorageClass

# pvc-with-sc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-with-sc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage  # 指定 StorageClass
  resources:
    requests:
      storage: 5Gi
kubectl apply -f pvc-with-sc.yaml
kubectl get pvc pvc-with-sc

常见误解

1. StorageClass 不等于 PV

StorageClass 是"模板",定义如何创建 PV
PV 是实际的存储资源
PVC 引用 StorageClass 时,系统自动创建 PV(动态供给)

2. 不是所有 Provisioner 都支持所有功能

- allowVolumeExpansion:需要 Provisioner 支持
- volumeBindingMode:取决于 Provisioner
- 参数:不同 Provisioner 参数不同

小结

要点说明
StorageClass存储的类型定义
Provisioner谁来创建存储资源
参数存储的具体配置
绑定模式Immediate / WaitForFirstConsumer
动态供给PVC 指定 StorageClass 时自动创建 PV

练习编辑器

bash
Loading...

继续学习

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