存储类 #
一、StorageClass概述 #
StorageClass是Kubernetes中定义存储类型的资源,支持动态存储供给。
1.1 StorageClass功能 #
text
StorageClass功能
│
├── 定义存储类型
│ ├── 存储性能等级
│ └── 存储后端类型
│
├── 动态供给
│ └── 自动创建PV
│
├── 存储参数
│ └── 后端存储配置
│
└── 回收策略
└── 默认回收策略
1.2 动态供给流程 #
text
动态供给流程
│
├── 1. 创建PVC,指定StorageClass
│
├── 2. Provisioner检测PVC
│
├── 3. 自动创建底层存储
│
├── 4. 自动创建PV
│
└── 5. 绑定PVC和PV
二、创建StorageClass #
2.1 基本示例 #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
2.2 字段说明 #
| 字段 | 说明 |
|---|---|
| provisioner | 存储供给器 |
| parameters | 存储参数 |
| reclaimPolicy | 回收策略 |
| allowVolumeExpansion | 允许扩容 |
| volumeBindingMode | 绑定模式 |
2.3 默认StorageClass #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
三、常用Provisioner #
3.1 云平台Provisioner #
yaml
# AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aws-ebs
provisioner: ebs.csi.aws.com
parameters:
type: gp3
fsType: ext4
---
# GCE PD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gce-pd
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-standard
---
# Azure Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-disk
provisioner: disk.csi.azure.com
parameters:
storageaccounttype: Standard_LRS
3.2 NFS Provisioner #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
provisioner: nfs-client
parameters:
archiveOnDelete: "true"
3.3 Local Provisioner #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
3.4 Ceph RBD #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ceph-cluster
pool: rbd
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: ceph-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
四、绑定模式 #
4.1 Immediate模式 #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate
text
Immediate模式
│
├── PVC创建后立即绑定
│
└── 不考虑Pod调度位置
4.2 WaitForFirstConsumer模式 #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer
text
WaitForFirstConsumer模式
│
├── 等待Pod使用PVC
│
└── 在Pod所在节点创建存储
五、卷扩容 #
5.1 启用扩容 #
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true
5.2 扩容操作 #
bash
# 编辑PVC扩容
kubectl edit pvc <pvc-name>
# 修改storage字段
spec:
resources:
requests:
storage: 20Gi
# 查看扩容状态
kubectl describe pvc <pvc-name>
六、使用StorageClass #
6.1 创建PVC #
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 10Gi
6.2 在Pod中使用 #
yaml
apiVersion: v1
kind: Pod
metadata:
name: dynamic-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: dynamic-pvc
七、完整示例 #
7.1 NFS动态存储 #
yaml
# NFS Provisioner Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-client
- name: NFS_SERVER
value: 192.168.1.100
- name: NFS_PATH
value: /data/nfs
volumes:
- name: nfs-root
nfs:
server: 192.168.1.100
path: /data/nfs
---
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: nfs-client
parameters:
archiveOnDelete: "true"
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi
八、StorageClass管理 #
8.1 查看StorageClass #
bash
# 查看StorageClass列表
kubectl get storageclass
kubectl get sc
# 输出示例
NAME PROVISIONER AGE
standard kubernetes.io/aws-ebs 10d
nfs-storage nfs-client 5d
# 查看详情
kubectl describe sc <sc-name>
8.2 设置默认StorageClass #
bash
# 设置默认
kubectl annotate storageclass <sc-name> storageclass.kubernetes.io/is-default-class=true
# 取消默认
kubectl annotate storageclass <sc-name> storageclass.kubernetes.io/is-default-class-
8.3 删除StorageClass #
bash
# 删除StorageClass
kubectl delete sc <sc-name>
# 注意:删除SC不会影响已创建的PV
九、故障排查 #
9.1 常见问题 #
bash
# 查看PVC状态
kubectl describe pvc <pvc-name>
# 查看Provisioner日志
kubectl logs -l app=nfs-client-provisioner
# 查看事件
kubectl get events --field-selector involvedObject.name=<pvc-name>
9.2 问题诊断 #
| 问题 | 原因 | 解决方案 |
|---|---|---|
| PVC一直Pending | Provisioner异常 | 检查Provisioner状态 |
| 供给失败 | 参数错误 | 检查StorageClass参数 |
| 权限问题 | Secret配置错误 | 检查Secret配置 |
十、最佳实践 #
10.1 命名规范 #
text
命名建议
│
├── 按性能等级命名
│ ├── fast-ssd
│ ├── standard-hdd
│ └── archive
│
└── 按用途命名
├── database
├── web-content
└── logs
10.2 多存储类配置 #
yaml
# 高性能SSD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iopsPerGB: "10"
---
# 标准存储
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-hdd
provisioner: kubernetes.io/aws-ebs
parameters:
type: sc1
十一、总结 #
11.1 核心要点 #
| 要点 | 说明 |
|---|---|
| Provisioner | 存储供给器 |
| 动态供给 | 自动创建PV |
| 绑定模式 | Immediate/WaitForFirstConsumer |
| 卷扩容 | allowVolumeExpansion |
11.2 下一步 #
掌握了StorageClass后,让我们学习 动态存储供给,深入了解动态存储的实现机制。
最后更新:2026-03-28