StorageClass是Kubernetes中用于定义存储类别的资源对象,提供动态分配存储卷的能力。通过设置不同的参数,StorageClass能够根据业务需求自动供应和调整存储资源。在PVC中指定StorageClassName字段后,若在集群中未找到匹配的PV,Kubernetes将根据所引用的StorageClass调用对应的Provisioner动态创建符合要求的PV及底层存储资源,从而简化了手动创建和维护PV的流程。StorageClass中的参数作为默认配置项使用,当PVC中存在与之冲突的配置时,以PVC中的设置为准。
如果CCE中提供的表3 默认StorageClass无法满足业务需求,您可以自定义创建新的StorageClass,设置回收策略、绑定模式等参数,以方便后续使用。
控制台方式创建StorageClass
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏选择“存储”,在右侧选择“存储类”页签。单击右上角“创建存储类”,在弹出的窗口中填写存储类参数。
|
参数 |
描述 |
|
存储类类型 |
选择底层存储类型。 |
|
名称 |
输入存储类的名称,同一集群的存储类名称需唯一。 |
|
回收策略 |
用于指定删除PVC时底层存储的回收策略,详情请参见PV回收策略。
- Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
- Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,需要手动删除。
|
|
绑定模式 |
动态创建PV的时间,分为立即创建和延迟创建。
- Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。本地持久卷类型不支持设置为Immediate。
- WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。对象存储、文件存储、极速文件存储类型不支持设置为WaitForFirstConsumer。
|
- 单击“创建”。您可以在“存储类”页签下查看已经创建的存储类及相关信息。
kubectl命令行方式创建StorageClass
本节提供了多种类型的StorageClass模板,您可根据业务需求选择合适的模板,快速创建符合场景要求的StorageClass资源。
- 通过kubectl连接集群。
- 执行以下命令,创建StorageClass的YAML文件,文件名支持自定义。
vim evs-storageclass.yaml
文件内容如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-disk-evs
annotations:
storageclass.kubernetes.io/is-default-class: "false" # 非必选项,指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass
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: GPSSD2
everest.io/enterprise-project-id: xxx-xxx-xxx-xxx-xxx # 指定企业项目id,仅限于已开通企业项目的账号使用
everest.io/passthrough: 'true'
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
表1 参数说明
|
参数 |
说明 |
|
metadata.annotations.storageclass.kubernetes.io/is-default-class |
用于指定默认StorageClass,一个集群中建议只设置一个默认的StorageClass。如果存在多个默认StorageClass,CCE不会报错,但行为可能不确定。
- true:表示该StorageClass为默认StorageClass。创建PVC时,如果未显式指定StorageClassName,系统将自动使用默认StorageClass。
- false或不设置该参数:表示该StorageClass为非默认StorageClass。
|
|
provisioner |
表示存储资源提供商。CCE均由Everest插件提供,此处只能填写everest-csi-provisioner。 |
|
parameters |
用于定义存储类的具体配置参数,详情请参见表2。 |
|
reclaimPolicy |
用于指定删除PVC时底层存储的回收策略,详情请参见PV回收策略。该参数未指定时,默认为Delete。
- Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
- Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,其中PV状态被设置为已释放,继续手动删除PV不会删除底层存储资源,若希望该PV还能被PVC绑定,需去除PV上与原PVC绑定的相关信息。
|
|
allowVolumeExpansion |
表示由该存储类创建的PV是否支持动态扩容,即是否允许通过修改PVC的方式动态扩容其绑定的存储卷,默认为false。
该参数仅为开启动态扩容的开关,动态扩容能否生效取决于底层存储插件的支持情况。若底层存储插件不支持,即使该参数设置为true,仍无法实现扩容。目前仅云硬盘、SFS Turbo(无子目录或子目录有限额)支持动态扩容。 |
|
volumeBindingMode |
表示卷绑定模式,即动态创建PV的时间,分为立即创建(Immediate)和延迟创建(WaitForFirstConsumer)。
- Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。
- WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。
|
表2 parameters参数说明
|
参数 |
是否必选 |
描述 |
|
csi.storage.k8s.io/csi-driver-name |
是 |
表示驱动类型。使用云硬盘类型时,参数取值固定为“disk.csi.everest.io”。 |
|
csi.storage.k8s.io/fstype |
是 |
表示CSI驱动创建存储卷时所使用文件系统类型。使用云硬盘时,支持的参数值为“ext4”。 |
|
everest.io/disk-volume-type |
是 |
|
|
everest.io/enterprise-project-id |
否 |
用于指定底层存储资源的企业项目ID,仅限于已开通企业项目的企业客户账号使用。建议设置为集群所属的企业项目或default企业项目,以便资源统一管理。
获取方法:在企业项目管理控制台,单击要对接的企业项目名称,复制企业项目ID值即可。
说明:
该功能需要everest插件升级到1.2.33及以上版本。
|
|
everest.io/passthrough |
是 |
参数取值固定为“true”,表示云硬盘的设备类型为SCSI类型。不允许设置为其他值。 |
- 执行以下命令,创建上述StorageClass。
kubectl apply -f evs-storageclass.yaml
回显结果如下:
storageclass.storage.k8s.io/csi-disk-evs created
- 执行以下命令,可以查看csi-disk-evs的详细信息。
kubectl describe sc csi-disk-evs
回显结果如下:
Name: csi-disk-evs
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"allowVolumeExpansion":true,"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"csi-disk-evs"},......
- 通过kubectl连接集群。
- 执行以下命令,创建StorageClass的YAML文件,文件名支持自定义。
vim sfsturbo-storageclass.yaml
文件内容如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-sfsturbo-test1
annotations:
storageclass.kubernetes.io/is-default-class: "false" # 非必选项,指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: sfsturbo.csi.everest.io
csi.storage.k8s.io/fstype: nfs
everest.io/reclaim-policy: retain-volume-only
everest.io/share-access-to: xxx-xxx-xxx-xxx-xxx
everest.io/share-expand-type: bandwidth
everest.io/share-source: sfs-turbo
everest.io/share-volume-type: STANDARD
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
表3 参数说明
|
参数 |
说明 |
|
metadata.annotations.storageclass.kubernetes.io/is-default-class |
用于指定默认StorageClass,一个集群中建议只设置一个默认的StorageClass。如果存在多个默认StorageClass,CCE不会报错,但行为可能不确定。
- true:表示该StorageClass为默认StorageClass。创建PVC时,如果未显式指定StorageClassName,系统将自动使用默认StorageClass。
- false或不设置该参数:表示该StorageClass为非默认StorageClass。
|
|
provisioner |
表示存储资源提供商。CCE均由Everest插件提供,此处只能填写everest-csi-provisioner。 |
|
parameters |
用于定义存储类的具体配置参数,详情请参见表4。 |
|
reclaimPolicy |
用于指定删除PVC时底层存储的回收策略,详情请参见PV回收策略。该参数未指定时,默认为Delete。
- Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
- Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,其中PV状态被设置为已释放,继续手动删除PV不会删除底层存储资源,若希望该PV还能被PVC绑定,需去除PV上与原PVC绑定的相关信息。
|
|
allowVolumeExpansion |
表示由该存储类创建的PV是否支持动态扩容,即是否允许通过修改PVC的方式动态扩容其绑定的存储卷,默认为false。
该参数仅为开启动态扩容的开关,动态扩容能否生效取决于底层存储插件的支持情况。若底层存储插件不支持,即使该参数设置为true,仍无法实现扩容。目前仅云硬盘、SFS Turbo(无子目录或子目录有限额)支持动态扩容。 |
|
volumeBindingMode |
表示卷绑定模式,即动态创建PV的时间,分为立即创建(Immediate)和延迟创建(WaitForFirstConsumer)。极速文件存储仅支持Immediate模式。
- Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。
- WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。
|
表4 parameters参数说明
|
参数 |
是否必选 |
描述 |
|
csi.storage.k8s.io/csi-driver-name |
是 |
驱动类型,使用极速文件存储类型时,参数取值固定为“sfsturbo.csi.everest.io”。 |
|
csi.storage.k8s.io/fstype |
是 |
用于指定挂载存储卷时使用的文件系统类型。使用极速文件存储时,支持的参数值为“nfs”。 |
|
everest.io/share-access-to |
是 |
表示集群所在VPC ID。
获取方法:进入集群概览页,在“网络信息 > VPC”中,将鼠标悬浮于对应VPC上,复制VPC ID。 |
|
everest.io/share-expand-type |
否 |
表示扩展类型,默认值为“bandwidth”,表示增强型的文件系统。
该字段已弃用,配置不起作用。 |
|
everest.io/share-source |
是 |
参数取值固定为“sfs-turbo”。 |
|
everest.io/share-volume-type |
否 |
表示极速文件存储类型,默认值为“STANDARD”,表示标准型和标准型增强版。
该字段已弃用,配置不起作用。 |
|
everest.io/reclaim-policy |
否 |
删除PVC时是否保留子目录,该参数reclaimPolicy配合使用。仅当PV回收策略为"Delete"时生效,取值如下:
- retain-volume-only:表示删除PVC时,PV会被删除,但PV关联的子目录会被保留。
- delete:表示删除PVC,PV及其关联的子目录均会被删除。
说明:
删除子目录时,仅删除PVC参数中设置的子目录绝对路径,不会级联删除上层目录。
|
- 执行以下命令,创建上述StorageClass。
kubectl apply -f sfsturbo-storageclass.yaml
回显结果如下:
storageclass.storage.k8s.io/csi-sfsturbo-test1 created
- 执行以下命令,可以查看csi-sfsturbo-test1的详细信息。
kubectl describe sc csi-sfsturbo-test1
回显结果如下:
Name: csi-sfsturbo-test1
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"allowVolumeExpansion":false,"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"},...
- 通过kubectl连接集群。
- 执行以下命令,创建StorageClass的YAML文件,文件名支持自定义。
vim obs-storageclass.yaml
文件内容如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-obs-test1
annotations:
storageclass.kubernetes.io/is-default-class: "false" # 非必选项,指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io
csi.storage.k8s.io/fstype: s3fs
everest.io/obs-volume-type: STANDARD
everest.io/enterprise-project-id: xxx-xxx-xxx-xxx-xxx # 指定企业项目id,仅限于已开通企业项目的账号使用
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions: [] # 非必选项,仅部分存储类型支持,如果存储类型不支持,请删除该参数
表5 参数说明
|
参数 |
说明 |
|
metadata.annotations.storageclass.kubernetes.io/is-default-class |
用于指定默认StorageClass,一个集群中建议只设置一个默认的StorageClass。如果存在多个默认StorageClass,CCE不会报错,但行为可能不确定。
- true:表示该StorageClass为默认StorageClass。创建PVC时,如果未显式指定StorageClassName,系统将自动使用默认StorageClass。
- false或不设置该参数:表示该StorageClass为非默认StorageClass。
|
|
provisioner |
表示存储资源提供商。CCE均由Everest插件提供,此处只能填写everest-csi-provisioner。 |
|
parameters |
用于定义存储类的具体配置参数,详情请参见表6。 |
|
reclaimPolicy |
用于指定删除PVC时底层存储的回收策略,详情请参见PV回收策略。该参数未指定时,默认为Delete。
- Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
- Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,其中PV状态被设置为已释放,继续手动删除PV不会删除底层存储资源,若希望该PV还能被PVC绑定,需去除PV上与原PVC绑定的相关信息。
|
|
volumeBindingMode |
表示卷绑定模式,即动态创建PV的时间,分为立即创建(Immediate)和延迟创建(WaitForFirstConsumer)。对象存储仅支持Immediate模式。
- Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。
- WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。
|
|
mountOptions |
用于指定挂载卷时的参数,控制挂载行为(如只读、缓冲策略等)。对象存储支持设置挂载参数,具体请参见设置对象存储挂载参数。 |
表6 parameters参数说明
|
参数 |
是否必选 |
描述 |
|
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时,该字段不起作用。
|
|
everest.io/enterprise-project-id |
否 |
用于指定底层存储资源的企业项目ID,仅限于已开通企业项目的企业客户账号使用。建议设置为集群所属的企业项目或default企业项目,以便资源统一管理。
获取方法:在企业项目管理控制台,单击要对接的企业项目名称,复制企业项目ID值即可。
说明:
该功能需要everest插件升级到1.2.33及以上版本。
|
- 执行以下命令,创建上述StorageClass。
kubectl apply -f obs-storageclass.yaml
回显结果如下:
storageclass.storage.k8s.io/csi-obs-test1 created
- 执行以下命令,可以查看csi-obs-test1的详细信息。
kubectl describe sc csi-obs-test1
回显结果如下:
Name: csi-obs-test1
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"},......
- 通过kubectl连接集群。
- 执行以下命令,创建StorageClass的YAML文件,文件名支持自定义。
vim local-storageclass.yaml
文件内容如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-local-test
annotations:
storageclass.kubernetes.io/is-default-class: "false" # 非必选项,指定集群中默认的StorageClass,一个集群中只能有一个默认的StorageClass
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: local.csi.everest.io
csi.storage.k8s.io/fstype: ext4
volume-type: persistent
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
表7 参数说明
|
参数 |
说明 |
|
metadata.annotations.storageclass.kubernetes.io/is-default-class |
用于指定默认StorageClass,一个集群中建议只设置一个默认的StorageClass。如果存在多个默认StorageClass,CCE不会报错,但行为可能不确定。
- true:表示该StorageClass为默认StorageClass。创建PVC时,如果未显式指定StorageClassName,系统将自动使用默认StorageClass。
- false或不设置该参数:表示该StorageClass为非默认StorageClass。
|
|
provisioner |
表示存储资源提供商。CCE均由Everest插件提供,此处只能填写everest-csi-provisioner。 |
|
parameters |
用于定义存储类的具体配置参数,详情请参见表8。 |
|
reclaimPolicy |
用于指定删除PVC时底层存储的回收策略,详情请参见PV回收策略。该参数未指定时,默认为Delete。
- Delete:存储卷声明PVC删除时,会将关联的底层存储资源删除,并同步移除PV资源,请谨慎使用。
- Retain:存储卷声明PVC删除时,PV和关联的底层存储资源均会保留,其中PV状态被设置为已释放,继续手动删除PV不会删除底层存储资源,若希望该PV还能被PVC绑定,需去除PV上与原PVC绑定的相关信息。
|
|
volumeBindingMode |
表示卷绑定模式,即动态创建PV的时间,分为立即创建(Immediate)和延迟创建(WaitForFirstConsumer)。本地持久卷仅支持WaitForFirstConsumer模式。
- Immediate:PVC创建后,会立即创建底层存储资源及存储卷PV,并与PVC绑定。
- WaitForFirstConsumer:PVC创建后,不会立即与存储卷PV绑定,而是等需要挂载该PVC的Pod被调度后,再创建底层存储资源及存储卷PV,并与PVC绑定。
|
表8 parameters参数说明
|
参数 |
是否必选 |
描述 |
|
csi.storage.k8s.io/csi-driver-name |
是 |
表示驱动类型,使用本地持久卷类型时,参数取值固定为“local.csi.everest.io”。 |
|
csi.storage.k8s.io/fstype |
是 |
表示文件系统类型,仅支持设置为“ext4”。 |
|
volume-type |
是 |
表示卷类型,仅支持设置为“persistent”。 |
- 执行以下命令,创建上述StorageClass。
kubectl apply -f dss-storageclass.yaml
回显结果如下:
storageclass.storage.k8s.io/csi-local-test created
- 执行以下命令,可以查看csi-local-test的详细信息。
kubectl describe sc csi-local-test
回显结果如下:
Name: csi-local-test
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"},...
自定义存储类应用场景
以下列举了自定义StorageClass的常见应用场景,供您参考:
- 满足个性化需求,简化批量操作:通过自定义回收策略(reclaimPolicy)、卷绑定模式(volumeBindingMode)等参数,您可以灵活应对不同业务场景,避免在批量创建PVC时重复配置相关参数,从而简化操作流程、提升管理效率。
- 支持平滑迁移,降低修改成本:当用户从自建Kubernetes或其他云厂商的Kubernetes服务迁移至CCE时,可在CCE中创建一个名称与原环境一致的StorageClass。这样,应用YAML文件或Helm Chart中的storageClassName无需修改,有效避免手动变更大量配置带来的操作负担与出错风险。例如,若迁移前使用的存储类名称为disk-standard,则可复制CCE中的csi-disk存储类 YAML,将其名称改为disk-standard后重新创建,实现无缝衔接。
- 设置默认存储类:在创建StorageClass时,可以通过metadata.annotations.storageclass.kubernetes.io/is-default-class字段将其设置为默认存储类。设置后,用户在创建PVC时无需显式指定storageClassName,系统将自动选用该默认存储类,简化资源声明过程。
- 绑定企业项目,实现资源统一管理:在创建StorageClass时,可以通过parameters.everest.io/enterprise-project-id字段指定企业项目,实现底层存储资源与企业项目的绑定,便于后续的资源分类管理和成本核算。
相关文档
在使用新的StorageClass时,用户只需在PVC的“storageClassName”字段中指定对应的StorageClass。StorageClass中定义的参数将作为默认配置,若PVC中指定了与之冲突的参数,则以PVC中的设置为准。
您可以参考以下文档使用StorageClass,以简化手动创建和维护PV的流程: