×

关于动态配置

StorageClass 资源对象描述和分类可以请求的存储,并提供了一种按需动态配置存储参数的方法。StorageClass 对象还可以用作管理机制,用于控制不同级别的存储和对存储的访问。集群管理员(cluster-admin)或存储管理员(storage-admin)定义和创建用户可以请求的StorageClass 对象,而无需了解底层存储卷源的任何详细信息。

OpenShift Dedicated 持久卷框架支持此功能,并允许管理员为集群配置持久存储。该框架还为用户提供了一种请求这些资源的方法,而无需了解底层基础设施。

OpenShift Dedicated 中可以使用许多类型的存储作为持久卷。虽然所有这些都可以由管理员静态配置,但某些类型的存储是使用内置的提供程序和插件 API 动态创建的。

可用的动态配置插件

OpenShift Dedicated 提供以下配置程序插件,这些插件具有用于动态配置的通用实现,它们使用集群配置的提供程序的 API 创建新的存储资源

存储类型 配置程序插件名称 备注

Amazon Elastic Block Store (Amazon EBS)

kubernetes.io/aws-ebs

在使用不同区域中的多个集群进行动态配置时,请使用以下标记标记每个节点:Key=kubernetes.io/cluster/<cluster_name>,Value=<cluster_id>,其中<cluster_name><cluster_id> 对于每个集群都是唯一的。

GCE Persistent Disk (gcePD)

kubernetes.io/gce-pd

在多区域配置中,建议每个 GCE 项目运行一个 OpenShift Dedicated 集群,以避免在当前集群中不存在节点的区域中创建 PV。

IBM Power® 虚拟服务器块

powervs.csi.ibm.com

安装后,IBM Power® 虚拟服务器块 CSI 驱动程序算子和 IBM Power® 虚拟服务器块 CSI 驱动程序会自动创建动态配置所需的存储类。

任何选择的配置程序插件还需要根据相关文档配置相关的云、主机或第三方提供程序。

定义存储类

StorageClass 对象当前是全局范围的对象,必须由cluster-adminstorage-admin 用户创建。

集群存储算子可能会根据使用的平台安装默认存储类。此存储类由算子拥有和控制。除了定义注解和标签外,它不能被删除或修改。如果需要不同的行为,则必须定义自定义存储类。

以下部分描述了StorageClass 对象的基本定义以及每个受支持插件类型的具体示例。

基本的 StorageClass 对象定义

以下资源显示了用于配置存储类的参数和默认值。此示例使用 AWS ElasticBlockStore (EBS) 对象定义。

示例StorageClass 定义
kind: StorageClass (1)
apiVersion: storage.k8s.io/v1 (2)
metadata:
  name: <storage-class-name> (3)
  annotations: (4)
    storageclass.kubernetes.io/is-default-class: 'true'
    ...
provisioner: kubernetes.io/aws-ebs (5)
parameters: (6)
  type: gp3
...
1 (必填) API 对象类型。
2 (必填) 当前的 apiVersion。
3 (必填) 存储类的名称。
4 (可选) 存储类的注解。
5 (必填) 与此存储类关联的配置程序类型。
6 (可选) 特定供应程序所需的參數,这将随插件而变化。

存储类注解

要将存储类设置为集群范围内的默认值,请将以下注解添加到您的存储类元数据中

storageclass.kubernetes.io/is-default-class: "true"

例如

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
...

这使得任何未指定特定存储类的持久卷声明 (PVC) 都可以自动通过默认存储类进行供应。但是,您的集群可以拥有多个存储类,但只有一个可以是默认存储类。

beta 注解storageclass.beta.kubernetes.io/is-default-class仍在运行;但是,它将在将来的版本中删除。

要设置存储类描述,请将以下注解添加到您的存储类元数据中

kubernetes.io/description: My Storage Class Description

例如

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    kubernetes.io/description: My Storage Class Description
...

AWS Elastic Block Store (EBS) 对象定义

aws-ebs-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: <storage-class-name> (1)
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1 (2)
  iopsPerGB: "10" (3)
  encrypted: "true" (4)
  kmsKeyId: keyvalue (5)
  fsType: ext4 (6)
1 (必填) 存储类的名称。持久卷声明使用此存储类来供应关联的持久卷。
2 (必填) 从io1gp3sc1st1中选择。默认为gp3。有关有效的 Amazon 资源名称 (ARN) 值,请参见AWS 文档
3 可选:仅适用于io1 卷。每 GiB 的 I/O 操作数。AWS 卷插件将此值乘以请求卷的大小来计算卷的 IOPS。值上限为 20,000 IOPS,这是 AWS 支持的最大值。有关详细信息,请参见AWS 文档
4 可选:表示是否加密 EBS 卷。有效值为truefalse
5 可选:加密卷时使用的密钥的完整 ARN。如果没有提供,但encypted设置为true,则 AWS 会生成一个密钥。有关有效的 ARN 值,请参见AWS 文档
6 可选:在动态供应的卷上创建的文件系统。此值将复制到动态供应的持久卷的fsType字段,并在第一次挂载卷时创建文件系统。默认值为ext4

GCE PersistentDisk (gcePD) 对象定义

gce-pd-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: <storage-class-name> (1)
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard (2)
  replication-type: none
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete
1 存储类的名称。持久卷声明使用此存储类来供应关联的持久卷。
2 选择pd-standardpd-ssd。默认为pd-standard

更改默认存储类

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

例如,如果您定义了两个存储类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