文档首页/ 云容器引擎 CCE/ 用户指南/ 存储/ 存储类(StorageClass)
更新时间:2024-09-29 GMT+08:00

存储类(StorageClass)

存储类介绍

在Kubernetes中,StorageClass是一种资源对象,描述了集群中的存储类型“分类”,用于定义存储卷的配置模板。每个StorageClass对象都定义了一种存储方式,包括动态卷供应的配置参数,如卷的类型、访问模式、卷的生命周期策略等,在创建PVC/PV均需要指定StorageClass。

当您在创建一个PVC时,您只需要指定StorageClassName,Kubernetes即可根据这个StorageClass自动创建PV及底层存储,大大减少了手动创建并维护PV的工作量。

除了使用CCE提供的默认存储类外,您也可以根据需求自定义存储类,可参考自定义存储类应用场景

通过YAML创建StorageClass

目前CCE默认提供csi-disk、csi-nas、csi-obs等StorageClass,在声明PVC时使用对应StorageClassName,就可以自动创建对应类型PV,并自动创建底层的存储资源。

执行如下kubectl命令即可查询CCE提供的默认StorageClass。您可以使用CCE提供的CSI插件自定义创建StorageClass。

# kubectl get sc
NAME                PROVISIONER                     AGE
csi-disk            everest-csi-provisioner         17d          # 云硬盘
csi-disk-topology   everest-csi-provisioner         17d          # 延迟创建的云硬盘
csi-nas             everest-csi-provisioner         17d          # 文件存储 1.0
csi-obs             everest-csi-provisioner         17d          # 对象存储
csi-sfsturbo        everest-csi-provisioner         17d          # 极速文件存储
csi-local           everest-csi-provisioner         17d          # 本地持久卷
csi-local-topology  everest-csi-provisioner         17d          # 延迟创建的本地持久卷
每个StorageClass都包含了动态制备PersistentVolume时会使用到的默认参数。如以下云硬盘存储类的示例:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: csi-disk
provisioner: everest-csi-provisioner
parameters:
  csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
  csi.storage.k8s.io/fstype: ext4
  everest.io/disk-volume-type: SAS
  everest.io/passthrough: 'true'
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
表1 关键参数说明

参数

描述

provisioner

存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。

parameters

存储参数,不同类型的存储支持的参数不同。详情请参见表2

reclaimPolicy

用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass 对象被创建时没有指定reclaimPolicy,它将默认为Delete。

  • Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
  • Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,其中PV状态被设置为已释放,继续手动删除PV不会删除底层存储资源,若希望该PV还能被PVC绑定,需去除PV上与原PVC绑定的相关信息。

allowVolumeExpansion

定义由此存储类创建的PV是否支持动态扩容,默认为false。是否能动态扩容是由底层存储插件来实现的,这里只是一个开关。

volumeBindingMode

表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。

  • Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。
  • WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。

mountOptions

该字段需要底层存储支持,如果不支持挂载选项,却指定了挂载选项,会导致创建PV操作失败。

表2 parameters参数说明

存储类型

参数

是否必选

描述

云硬盘

csi.storage.k8s.io/csi-driver-name

驱动类型,使用云硬盘类型时,参数取值固定为“disk.csi.everest.io”

csi.storage.k8s.io/fstype

使用云硬盘时,支持的参数值为“ext4”

everest.io/disk-volume-type

云硬盘类型,全大写。
  • SAS:高I/O
  • SSD:超高I/O
  • GPSSD:通用型SSD
  • ESSD:极速型SSD
  • GPSSD2:通用型SSD v2,Everest版本为2.4.4及以上支持使用,使用时需同时指定everest.io/disk-iops和everest.io/disk-throughput注解。

everest.io/passthrough

参数取值固定为“true”,表示云硬盘的设备类型为SCSI类型。不允许设置为其他值。

文件存储

csi.storage.k8s.io/csi-driver-name

驱动类型,使用文件存储类型时,参数取值固定为“nas.csi.everest.io”

csi.storage.k8s.io/fstype

使用文件存储时,支持的参数值为“nfs”

everest.io/share-access-level

参数取值固定为“rw”,表示文件存储可读写。

everest.io/share-access-to

集群所在VPC ID。

everest.io/share-is-public

参数取值固定为“false”,表示文件共享为私人可见。

使用SFS 3.0时无需填写。

everest.io/sfs-version

仅使用SFS 3.0时需要填写,固定值为“sfs3.0”

极速文件存储

csi.storage.k8s.io/csi-driver-name

驱动类型,使用极速文件存储类型时,参数取值固定为“sfsturbo.csi.everest.io”

csi.storage.k8s.io/fstype

使用极速文件存储时,支持的参数值为“nfs”

everest.io/share-access-to

集群所在VPC ID。

everest.io/share-expand-type

扩展类型,默认值为“bandwidth”,表示增强型的文件系统。该字段不起作用。

everest.io/share-source

参数取值固定为“sfs-turbo”

everest.io/share-volume-type

极速文件存储类型,默认值为“STANDARD”,表示标准型和标准型增强版。该字段不起作用。

对象存储

csi.storage.k8s.io/csi-driver-name

驱动类型,使用对象存储类型时,参数取值固定为“obs.csi.everest.io”

csi.storage.k8s.io/fstype

实例类型,支持的参数值为“s3fs”“obsfs”

  • obsfs:并行文件系统。
  • s3fs:对象桶。

everest.io/obs-volume-type

对象存储类型。

  • fsType设置为s3fs时,支持STANDARD(标准桶)、WARM(低频访问桶)。
  • fsType设置为obsfs时,该字段不起作用。

自定义存储类应用场景

在CCE中使用存储时,最常见的方法是创建PVC时通过指定StorageClassName定义要创建存储的类型,如下所示,使用PVC申请一个SAS(高I/O)类型云硬盘/块存储。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-evs-example
  namespace: default
  annotations:
    everest.io/disk-volume-type: SAS
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: csi-disk

可以看到在CCE中如果需要指定云硬盘的类型,是通过everest.io/disk-volume-type字段指定,这里SAS是云硬盘的类型。

以上是较为基础的StorageClass使用方法,在实际应用中,也可以使用StorageClass进行更为简便的操作:

应用场景

解决方案

操作步骤

在使用annotations指定存储配置时,配置较为繁琐。例如此处使用everest.io/disk-volume-type字段指定云硬盘的类型。

在StorageClass的parameters字段中定义PVC的annotations,编写YAML时只需要指定StorageClassName。

例如,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,

场景一:指定StorageClass中的磁盘类型

当用户从自建Kubernetes或其他Kubernetes服务迁移到CCE,原先的应用YAML中使用的StorageClass与CCE中使用的不同,导致使用存储时需要修改大量YAML文件或Helm Chart包,非常繁琐且容易出错。

在CCE集群中创建与原有应用YAML中相同名称的StorageClass,迁移后无需再修改应用YAML中的StorageClassName。

例如,迁移前使用的云硬盘存储类为disk-standard,在迁移CCE集群后,可以复制CCE集群中csi-disk存储类的YAML,将其名称修改为disk-standard后重新创建。

在YAML中必须指定StorageClassName才能使用存储,不指定StorageClass时无法正常创建。

在集群中设置默认的StorageClass,则YAML中无需指定StorageClassName也能创建存储。

场景二:指定默认StorageClass

创建的存储资源需要指定企业项目,在每个PVC中配置annotation较为繁琐。

在StorageClass中添加企业项目,创建PVC时无需指定企业项目,存储资源将默认创建在StorageClass中指定的企业项目下。

场景三:指定StorageClass的企业项目

场景一:指定StorageClass中的磁盘类型

本文以自定义云硬盘类型的StorageClass为例,将SAS、SSD类型云硬盘分别定义一个StorageClass,比如定义一个名为csi-disk-sas的StorageClass,这个StorageClass创建SAS类型的存储,则前后使用的差异如下图所示,编写PVC的YAML时只需要指定StorageClassName。

  • 自定义高I/O类型StorageClass,使用YAML描述如下,这里取名为csi-disk-sas,指定云硬盘类型为SAS,即高I/O
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-disk-sas                          # 高IO StorageClass名字,用户可自定义
    parameters:
      csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
      csi.storage.k8s.io/fstype: ext4
      everest.io/disk-volume-type: SAS            # 云硬盘高I/O类型,用户不可自定义
      everest.io/passthrough: "true"
    provisioner: everest-csi-provisioner
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true                    # true表示允许扩容
  • 超高I/O类型StorageClass,这里取名为csi-disk-ssd,指定云硬盘类型为SSD,即超高I/O
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-disk-ssd                       # 超高I/O StorageClass名字,用户可自定义
    parameters:
      csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
      csi.storage.k8s.io/fstype: ext4
      everest.io/disk-volume-type: SSD         # 云硬盘超高I/O类型,用户不可自定义
      everest.io/passthrough: "true"
    provisioner: everest-csi-provisioner
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true

reclaimPolicy:底层云存储的回收策略,支持Delete、Retain回收策略。

  • Delete:删除PVC,PV资源与云硬盘均被删除。
  • Retain:删除PVC,PV资源与底层存储资源均不会被删除,需要手动删除回收。PVC删除后PV资源状态为“已释放(Released)”,不能直接再次被PVC绑定使用。

如果数据安全性要求较高,建议使用Retain以免误删数据。

定义完之后,使用kubectl create命令创建。

# kubectl create -f sas.yaml
storageclass.storage.k8s.io/csi-disk-sas created
# kubectl create -f ssd.yaml
storageclass.storage.k8s.io/csi-disk-ssd created

再次查询StorageClass,回显如下:

# kubectl get sc
NAME                PROVISIONER                     AGE
csi-disk            everest-csi-provisioner         17d
csi-disk-sas        everest-csi-provisioner         2m28s
csi-disk-ssd        everest-csi-provisioner         16s
csi-disk-topology   everest-csi-provisioner         17d
csi-nas             everest-csi-provisioner         17d
csi-obs             everest-csi-provisioner         17d
csi-sfsturbo        everest-csi-provisioner         17d

场景二:指定默认StorageClass

您还可以指定某个StorageClass作为默认StorageClass,这样在创建PVC时不指定StorageClassName就会使用默认StorageClass创建。

例如将csi-disk-ssd指定为默认StorageClass,则可以按如下方式设置。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-disk-ssd
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"   # 指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass
parameters:
  csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
  csi.storage.k8s.io/fstype: ext4
  everest.io/disk-volume-type: SSD
  everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

使用kubectl create命令创建,然后再查询StorageClass,显示如下。

# kubectl create -f ssd.yaml
storageclass.storage.k8s.io/csi-disk-ssd created
# kubectl get sc
NAME                     PROVISIONER                     AGE
csi-disk                 everest-csi-provisioner         17d
csi-disk-sas             everest-csi-provisioner         114m
csi-disk-ssd (default)   everest-csi-provisioner         9s
csi-disk-topology        everest-csi-provisioner         17d
csi-nas                  everest-csi-provisioner         17d
csi-obs                  everest-csi-provisioner         17d
csi-sfsturbo             everest-csi-provisioner         17d

场景三:指定StorageClass的企业项目

CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下,企业项目可选为集群所属的企业项目或default企业项目

若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目,CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。

如果您希望通过StorageClass创建的存储资源能与集群在同一个企业项目,则可以自定义StorageClass,并指定企业项目ID,如下所示。

该功能需要everest插件升级到1.2.33及以上版本。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: csi-disk-epid      # 自定义名称
provisioner: everest-csi-provisioner
parameters:
  csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
  csi.storage.k8s.io/fstype: ext4
  everest.io/disk-volume-type: SAS
  everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183  # 指定企业项目id
  everest.io/passthrough: 'true'
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate