×

关于动态配置

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

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

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

可用的动态配置插件

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

存储类型 提供程序插件名称 备注

Amazon 弹性块存储 (Amazon EBS)

kubernetes.io/aws-ebs

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

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

定义存储类

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 (可选) 特定提供程序所需的 parameters,这将因插件而异。

存储类注释

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

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 弹性块存储 (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。如果没有提供,但 encrypted 设置为 true,则 AWS 将生成一个密钥。有关有效的 ARN 值,请参阅AWS 文档
6 可选:在动态配置的卷上创建的文件系统。此值将复制到动态配置的持久卷的 fsType 字段,并在第一次挂载卷时创建文件系统。默认值为 ext4

更改默认存储类

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

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