Storage Class
StorageClass 为管理员提供了描述和管理存储资源的标准化方法。本文将详细介绍 StorageClass 的概念、配置和使用方式。在阅读本文之前,建议先熟悉 卷 和 持久卷 的相关概念。
StorageClass 概述
StorageClass 为管理员提供了描述存储"类"的方法。不同的类可能对应不同的:
- 服务质量等级:如高性能 SSD、标准 HDD
- 备份策略:自动备份频率和保留策略
- 访问模式:读写性能特征
- 地理位置:数据中心或可用区分布
Kubernetes 本身并不定义这些类的具体含义,而是由集群管理员根据实际需求来定义。这个概念在其他存储系统中通常被称为"存储配置文件"或"存储策略"。
StorageClass 资源定义
StorageClass 是一个集群级别的资源对象,包含以下核心字段:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
replication-type: regional-pd
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debug
- noatime
volumeBindingMode: WaitForFirstConsumer
核心字段说明
- metadata.name:StorageClass 的名称,PVC 通过此名称引用
- provisioner:指定使用哪个存储分配器来动态创建 PV
- parameters:传递给分配器的参数,因分配器而异
- reclaimPolicy:PV 的回收策略,可选
Delete
或Retain
- allowVolumeExpansion:是否允许卷扩容
- mountOptions:挂载选项列表
- volumeBindingMode:卷绑定模式
存储分配器
存储分配器决定了如何创建和管理持久卷。Kubernetes 支持内置分配器和外部分配器。
内置分配器
以下是主要的内置分配器:
存储类型 | 分配器名称 | 云平台 |
---|---|---|
AWS EBS | ebs.csi.aws.com | Amazon Web Services |
GCE PD | pd.csi.storage.gke.io | Google Cloud Platform |
Azure Disk | disk.csi.azure.com | Microsoft Azure |
Azure File | file.csi.azure.com | Microsoft Azure |
vSphere | csi.vsphere.vmware.com | VMware vSphere |
CSI 分配器
现代 Kubernetes 推荐使用 CSI(Container Storage Interface)分配器:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-example
provisioner: example.csi.driver.io
parameters:
csi.storage.k8s.io/provisioner-secret-name: "csi-secret"
csi.storage.k8s.io/provisioner-secret-namespace: "default"
type: "fast"
volumeBindingMode: WaitForFirstConsumer
外部分配器
对于不支持内置分配器的存储系统,可以使用外部分配器:
- NFS 分配器:
nfs-client-provisioner
- Longhorn:
driver.longhorn.io
- OpenEBS:
openebs.io/provisioner-iscsi
配置参数详解
回收策略(reclaimPolicy)
- Delete(默认):删除 PVC 时自动删除对应的 PV 和底层存储
- Retain:保留 PV 和数据,需要手动清理
reclaimPolicy: Retain # 数据安全优先
卷绑定模式(volumeBindingMode)
- Immediate(默认):创建 PVC 时立即绑定 PV
- WaitForFirstConsumer:等待 Pod 调度后再绑定,适用于拓扑感知
volumeBindingMode: WaitForFirstConsumer
卷扩容
允许在线扩展持久卷大小:
allowVolumeExpansion: true
挂载选项
指定卷挂载时的选项:
mountOptions:
- noatime # 禁用访问时间更新
- nodiratime # 禁用目录访问时间更新
- rsize=1048576 # 读取缓冲区大小
- wsize=1048576 # 写入缓冲区大小
默认 StorageClass
集群可以设置一个默认的 StorageClass,用于没有指定 storageClassName
的 PVC:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
使用示例
创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
disk-encryption-key: "projects/PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
在 PVC 中使用
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: fast-storage
最佳实践
- 命名规范:使用描述性名称,如
ssd-retain
、hdd-delete
- 环境区分:为不同环境创建不同的 StorageClass
- 成本优化:根据应用需求选择合适的存储类型
- 监控告警:监控存储使用情况和成本
- 测试验证:在生产环境使用前充分测试
故障排查
常见问题及解决方法:
- 分配失败:检查分配器是否正确安装和配置
- 挂载失败:验证挂载选项是否被存储系统支持
- 权限问题:确认服务账户具有必要的存储权限
- 拓扑约束:检查节点标签和拓扑域配置