5.2. 管理默认存储类
5.2.1. 概述
管理默认存储类可让您完成几个不同的目标:
- 禁用动态置备来强制静态置备。
- 当您有其他首选存储类时,防止存储操作器重新创建初始默认存储类。
- 重命名或更改默认存储类
要实现这些目标,您可以更改 ClusterCSIDriver
对象中的 spec.storageClassState
字段的设置。此字段可能的设置有:
- Managed: (默认)Container Storage Interface (CSI) Operator 会主动管理其默认存储类,集群管理员对默认存储类进行的大多数手动更改会被删除,如果您试图手动默认存储类,则它们会被持续重新创建。
- Unmanaged :您可以修改默认存储类。CSI Operator 不会主动管理存储类,因此它不会协调它自动创建的默认存储类。
- Removed: CSI operator 删除默认存储类。
5.2.2. 使用 Web 控制台管理默认存储类
先决条件
- 访问 OpenShift Dedicated Web 控制台。
- 使用 cluster-admin 权限访问集群。
流程
使用 Web 控制台管理默认存储类:
- 登录到 web 控制台。
- 点 Administration > CustomResourceDefinitions。
-
在 CustomResourceDefinitions 页面中,键入
clustercsidriver
来查找ClusterCSIDriver
对象。 - 点 ClusterCSIDriver,然后点 Instances 选项卡。
- 点所需实例的名称,然后点 YAML 选项卡。
添加
spec.storageClassState
字段,值为Managed
、Unmanaged
或Removed
。示例
... spec: driverConfig: driverType: '' logLevel: Normal managementState: Managed observedConfig: null operatorLogLevel: Normal storageClassState: Unmanaged 1 ...
- 1
spec.storageClassState
字段设置为 "Unmanaged"
- 点击 Save。
5.2.3. 使用 CLI 管理默认存储类
先决条件
- 使用 cluster-admin 权限访问集群。
流程
要使用 CLI 管理存储类,请运行以下命令:
oc patch clustercsidriver $DRIVERNAME --type=merge -p "{\"spec\":{\"storageClassState\":\"${STATE}\"}}" 1
- 1
- 其中
${STATE}
为 "Removed" 或 "Managed" 或 "Unmanaged"。其中
$DRIVERNAME
是置备程序名称。您可以通过运行命令oc get sc
来查找置备程序名称。
5.2.4. 缺少或多个默认存储类
5.2.4.1. 多个默认存储类
如果您将非默认存储类标记为默认存储类,且没有取消设置现有的默认存储类,或者在默认存储类已存在时创建默认存储类,则可能会出现多个默认存储类。当存在多个默认存储类时,任何请求默认存储类 (pvc.spec.storageClassName
=nil) 的持久性卷声明 (PVC) 都会获得最近创建的默认存储类,无论该存储类的默认存储类是什么,管理员都会在警报仪表板中收到警报,该类有多个默认存储类,MultipleDefaultStorageClasses
。
5.2.4.2. 缺少默认存储类
PVC 可能会尝试使用不存在的默认存储类:
- 管理员删除默认存储类或将其标记为非默认,然后用户会创建一个请求默认存储类的 PVC。
- 在安装过程中,安装程序会创建一个请求默认存储类的 PVC,该类尚未创建。
在前面的场景中,PVC 会无限期处于 pending 状态。要解决这种情况,请创建一个默认存储类,或声明其中一个现有存储类作为默认值。创建或声明默认存储类后,PVC 就会获取新的默认存储类。如果可能,PVC 最终会绑定到静态或动态置备的 PV,并移出待处理状态。
5.2.5. 更改默认存储类
使用以下步骤更改默认存储类。
例如,您有两个定义的存储类 gp3
和 standard
,您想要将默认存储类从 gp3
改为 standard
。
先决条件
- 使用 cluster-admin 权限访问集群。
流程
更改默认存储类:
列出存储类:
$ oc get storageclass
输出示例
NAME TYPE gp3 (default) kubernetes.io/aws-ebs 1 standard kubernetes.io/aws-ebs
- 1
(default)
表示默认存储类。
将所需的存储类设为默认存储类。
对于所需的存储类,运行以下命令将
storageclass.kubernetes.io/is-default-class
注解设置为true
:$ oc patch storageclass standard -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
注意您可以短时间内有多个默认存储类。但是,您应该确保最终只有一个默认存储类。
当存在多个默认存储类时,任何请求默认存储类 (
pvc.spec.storageClassName
=nil) 的持久性卷声明 (PVC) 都会获得最近创建的默认存储类,无论该存储类的默认存储类是什么,管理员都会在警报仪表板中收到警报,该类有多个默认存储类,MultipleDefaultStorageClasses
。从旧的默认存储类中删除默认存储类设置。
对于旧的默认存储类,运行以下命令将
storageclass.kubernetes.io/is-default-class
注解的值改为false
:$ oc patch storageclass gp3 -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "false"}}}'
确认更改:
$ oc get storageclass
输出示例
NAME TYPE gp3 kubernetes.io/aws-ebs standard (default) kubernetes.io/aws-ebs