×

概述

管理默认存储类允许您实现几个不同的目标

  • 通过禁用动态配置来强制执行静态配置。

  • 当您有其他首选存储类时,防止存储操作员重新创建初始默认存储类。

  • 重命名或更改默认存储类

要实现这些目标,您需要更改`ClusterCSIDriver`对象中`spec.storageClassState`字段的设置。此字段的可能设置为

  • 已管理:(默认)容器存储接口 (CSI) 运算符主动管理其默认存储类,因此集群管理员对默认存储类进行的大多数手动更改都会被移除,并且如果您尝试手动删除默认存储类,则会持续重新创建默认存储类。

  • 未管理:您可以修改默认存储类。CSI 运算符不会主动管理存储类,因此它不会协调其自动创建的默认存储类。

  • 已移除:CSI 运算符会删除默认存储类。

以下容器存储接口 (CSI) 驱动程序运算符支持管理默认存储类

使用 Web 控制台管理默认存储类

先决条件
  • 访问 OpenShift Container Platform Web 控制台。

  • 以集群管理员权限访问集群。

步骤

要使用 Web 控制台管理默认存储类,请执行以下操作:

  1. 登录 Web 控制台。

  2. 单击管理 > 自定义资源定义

  3. 自定义资源定义页面上,输入clustercsidriver 以查找ClusterCSIDriver 对象。

  4. 单击ClusterCSIDriver,然后单击实例选项卡。

  5. 单击所需实例的名称,然后单击YAML 选项卡。

  6. 添加值为ManagedUnmanagedRemovedspec.storageClassState 字段。

    示例
    ...
    spec:
      driverConfig:
        driverType: ''
      logLevel: Normal
      managementState: Managed
      observedConfig: null
      operatorLogLevel: Normal
      storageClassState: Unmanaged (1)
    ...
    1 spec.storageClassState 字段设置为“Unmanaged”
  7. 单击保存

使用 CLI 管理默认存储类

先决条件
  • 以集群管理员权限访问集群。

步骤

要使用 CLI 管理存储类,请运行以下命令:

oc patch clustercsidriver $DRIVERNAME --type=merge -p "{\"spec\":{\"storageClassState\":\"${STATE}\"}}" (1)
1 其中${STATE} 为“Removed”、“Managed”或“Unmanaged”。

其中$DRIVERNAME 为供应程序名称。您可以通过运行命令oc get sc 来查找供应程序名称。

缺失或多个默认存储类

多个默认存储类

如果您将非默认存储类标记为默认存储类且未取消设置现有的默认存储类,或者在已存在默认存储类时创建默认存储类,则可能会出现多个默认存储类。如果存在多个默认存储类,任何请求默认存储类的持久卷声明 (PVC)(pvc.spec.storageClassName=nil)都将获取最近创建的默认存储类,而不管该存储类的默认状态如何,管理员会在警报仪表板上收到存在多个默认存储类的警报,MultipleDefaultStorageClasses

缺失的默认存储类

在以下两种情况下,PVC 可能会尝试使用不存在的默认存储类:

  • 管理员删除默认存储类或将其标记为非默认存储类,然后用户创建请求默认存储类的 PVC。

  • 在安装期间,安装程序创建请求默认存储类的 PVC,但该存储类尚未创建。

在上述情况下,PVC 将无限期地保持挂起状态。要解决此问题,请创建一个默认存储类或将现有存储类之一声明为默认存储类。一旦创建或声明默认存储类,PVC 就会获取新的默认存储类。如果可能,PVC 最终将按常规方式绑定到静态或动态预配的 PV,并从挂起状态移出。

更改默认存储类

使用以下步骤更改默认存储类。

例如,如果您定义了两个存储类gp3standard,并且您想将默认存储类从gp3 更改为standard

先决条件
  • 以集群管理员权限访问集群。

步骤

要更改默认存储类,请执行以下操作:

  1. 列出存储类

    $ oc get storageclass
    示例输出
    NAME                 TYPE
    gp3 (default)        kubernetes.io/aws-ebs (1)
    standard             kubernetes.io/aws-ebs
    1 (default) 表示默认存储类。
  2. 将所需的存储类设置为默认存储类。

    对于所需的存储类,通过运行以下命令将storageclass.kubernetes.io/is-default-class 注解设置为true

    $ oc patch storageclass standard -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'

    您可能在短时间内拥有多个默认存储类。但是,您应确保最终只存在一个默认存储类。

    如果存在多个默认存储类,任何请求默认存储类的持久卷声明 (PVC)(pvc.spec.storageClassName=nil)都将获取最近创建的默认存储类,而不管该存储类的默认状态如何,管理员会在警报仪表板上收到存在多个默认存储类的警报,MultipleDefaultStorageClasses

  3. 从旧的默认存储类中删除默认存储类设置。

    对于旧的默认存储类,通过运行以下命令将storageclass.kubernetes.io/is-default-class 注解的值更改为false

    $ oc patch storageclass gp3 -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "false"}}}'
  4. 验证更改

    $ oc get storageclass
    示例输出
    NAME                 TYPE
    gp3                  kubernetes.io/aws-ebs
    standard (default)   kubernetes.io/aws-ebs