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 的回收策略,可选 DeleteRetain
  • allowVolumeExpansion:是否允许卷扩容
  • mountOptions:挂载选项列表
  • volumeBindingMode:卷绑定模式

存储分配器

存储分配器决定了如何创建和管理持久卷。Kubernetes 支持内置分配器和外部分配器。

内置分配器

以下是主要的内置分配器:

存储类型分配器名称云平台
AWS EBSebs.csi.aws.comAmazon Web Services
GCE PDpd.csi.storage.gke.ioGoogle Cloud Platform
Azure Diskdisk.csi.azure.comMicrosoft Azure
Azure Filefile.csi.azure.comMicrosoft Azure
vSpherecsi.vsphere.vmware.comVMware 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
  • Longhorndriver.longhorn.io
  • OpenEBSopenebs.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

最佳实践

  1. 命名规范:使用描述性名称,如 ssd-retainhdd-delete
  2. 环境区分:为不同环境创建不同的 StorageClass
  3. 成本优化:根据应用需求选择合适的存储类型
  4. 监控告警:监控存储使用情况和成本
  5. 测试验证:在生产环境使用前充分测试

故障排查

常见问题及解决方法:

  • 分配失败:检查分配器是否正确安装和配置
  • 挂载失败:验证挂载选项是否被存储系统支持
  • 权限问题:确认服务账户具有必要的存储权限
  • 拓扑约束:检查节点标签和拓扑域配置

参考资料

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区