StorageClass
学习目标
- 理解 StorageClass 的作用和组成
- 掌握 StorageClass 的定义方法
- 了解不同 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-ebs | AWS EBS | AWS 环境 |
| kubernetes.io/gce-pd | GCE PD | GCP 环境 |
| kubernetes.io/azure-disk | Azure Disk | Azure 环境 |
| rook.io/block | Ceph RBD | 自建 Ceph |
| nfs-subdir-external-provisioner | NFS | NFS 动态供给 |
绑定模式
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...