×

概述

Red Hat OpenShift Service on AWS能够使用AWS Elastic File Service (EFS)的容器存储接口(CSI)驱动程序预配持久卷(PV)。

建议在使用CSI操作符和驱动程序时,熟悉持久存储配置CSI卷

安装AWS EFS CSI驱动程序操作符后,Red Hat OpenShift Service on AWS默认在openshift-cluster-csi-drivers命名空间中安装AWS EFS CSI操作符和AWS EFS CSI驱动程序。这允许AWS EFS CSI驱动程序操作符创建挂载到AWS EFS资源的CSI预配的PV。

  • AWS EFS CSI驱动程序操作符安装后,默认情况下不会创建用于创建持久卷声明(PVC)的存储类。但是,您可以手动创建AWS EFS StorageClass。AWS EFS CSI驱动程序操作符支持动态卷预配,允许根据需要创建存储卷。这样就无需集群管理员预先预配存储。

  • AWS EFS CSI驱动程序使您可以创建和挂载AWS EFS PV。

AWS EFS仅支持区域卷,不支持区域性卷。

关于CSI

存储供应商传统上将存储驱动程序作为Kubernetes的一部分提供。随着容器存储接口(CSI)的实现,第三方提供商可以使用标准接口交付存储插件,而无需更改核心Kubernetes代码。

CSI操作符为Red Hat OpenShift Service on AWS用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是不可能的。

设置AWS EFS CSI驱动程序操作符

  1. 如果您将AWS EFS与AWS安全令牌服务(STS)一起使用,请获取STS的角色Amazon资源名称(ARN)。这是安装AWS EFS CSI驱动程序操作符所必需的。

  2. 安装AWS EFS CSI驱动程序操作符。

  3. 安装AWS EFS CSI驱动程序。

获取安全令牌服务的角色Amazon资源名称

此过程说明如何获取角色Amazon资源名称(ARN),以使用AWS安全令牌服务(STS)将AWS EFS CSI驱动程序操作符与Red Hat OpenShift Service on AWS配置。

在安装AWS EFS CSI驱动程序操作符之前执行此过程(请参见安装AWS EFS CSI驱动程序操作符过程)。

先决条件
  • 以具有cluster-admin角色的用户身份访问集群。

  • AWS账户凭证

步骤
  1. 创建一个包含以下内容的IAM策略JSON文件

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "elasticfilesystem:DescribeAccessPoints",
            "elasticfilesystem:DescribeFileSystems",
            "elasticfilesystem:DescribeMountTargets",
            "ec2:DescribeAvailabilityZones",
            "elasticfilesystem:TagResource"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "elasticfilesystem:CreateAccessPoint"
          ],
          "Resource": "*",
          "Condition": {
            "StringLike": {
              "aws:RequestTag/efs.csi.aws.com/cluster": "true"
            }
          }
        },
        {
          "Effect": "Allow",
          "Action": "elasticfilesystem:DeleteAccessPoint",
          "Resource": "*",
          "Condition": {
            "StringEquals": {
              "aws:ResourceTag/efs.csi.aws.com/cluster": "true"
            }
          }
        }
      ]
    }
  2. 创建一个包含以下内容的IAM信任JSON文件

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::<your_aws_account_ID>:oidc-provider/<openshift_oidc_provider>"  (1)
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "<openshift_oidc_provider>:sub": [  (2)
                "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-operator",
                "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-controller-sa"
              ]
            }
          }
        }
      ]
    }
    1 指定您的AWS账户ID和OpenShift OIDC提供程序端点。

    运行以下命令获取您的AWS账户ID

    $ aws sts get-caller-identity --query Account --output text

    运行以下命令获取OpenShift OIDC端点

    $ rosa describe cluster \
      -c $(oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}') \
      -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4
    2 再次指定OpenShift OIDC端点。
  3. 创建IAM角色

    ROLE_ARN=$(aws iam create-role \
      --role-name "<your_cluster_name>-aws-efs-csi-operator" \
      --assume-role-policy-document file://<your_trust_file_name>.json \
      --query "Role.Arn" --output text); echo $ROLE_ARN

    复制角色ARN。安装AWS EFS CSI驱动程序操作符时需要它。

  4. 创建IAM策略

    POLICY_ARN=$(aws iam create-policy \
      --policy-name "<your_cluster_name>-aws-efs-csi" \
      --policy-document file://<your_policy_file_name>.json \
      --query 'Policy.Arn' --output text); echo $POLICY_ARN
  5. 将IAM策略附加到IAM角色

    $ aws iam attach-role-policy \
      --role-name "<your_cluster_name>-aws-efs-csi-operator" \
      --policy-arn $POLICY_ARN

安装AWS EFS CSI驱动程序操作符

AWS EFS CSI驱动程序操作符(一个Red Hat操作符)在Red Hat OpenShift Service on AWS中未默认安装。请使用以下步骤在您的集群中安装和配置AWS EFS CSI驱动程序操作符。

先决条件
  • 访问Red Hat OpenShift Service on AWS Web控制台。

步骤

要从Web控制台安装AWS EFS CSI驱动程序操作符

  1. 登录到Web控制台。

  2. 安装AWS EFS CSI操作符

    1. 单击**操作符** → **OperatorHub**。

    2. 在筛选框中键入**AWS EFS CSI**,找到AWS EFS CSI操作符。

    3. 单击**AWS EFS CSI驱动程序操作符**按钮。

    确保选择**AWS EFS CSI驱动程序操作符**而不是**AWS EFS操作符**。**AWS EFS操作符**是一个社区操作符,不受Red Hat支持。

    1. 在**AWS EFS CSI驱动程序操作符**页面上,单击**安装**。

    2. 在**安装操作符**页面上,确保

      • 如果您将AWS EFS与AWS安全令牌服务(STS)一起使用,请在**角色ARN**字段中输入从获取安全令牌服务的角色Amazon资源名称过程的最后一步复制的ARN角色。

      • 已选择**集群上的所有命名空间(默认)**。

      • **已安装命名空间**设置为**openshift-cluster-csi-drivers**。

    3. 单击**安装**。

      安装完成后,AWS EFS CSI操作符将列在Web控制台的**已安装操作符**部分中。

安装AWS EFS CSI驱动程序

安装AWS EFS CSI驱动程序操作符(一个Red Hat操作符)后,您将安装AWS EFS CSI驱动程序

先决条件
  • 访问Red Hat OpenShift Service on AWS Web控制台。

步骤
  1. 单击**管理** → **CustomResourceDefinitions** → **ClusterCSIDriver**。

  2. 在**实例**选项卡上,单击**创建ClusterCSIDriver**。

  3. 使用以下YAML文件

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: efs.csi.aws.com
    spec:
      managementState: Managed
  4. 单击**创建**。

  5. 等待以下条件变为“True”状态

    • AWSEFSDriverNodeServiceControllerAvailable

    • AWSEFSDriverControllerServiceControllerAvailable

创建AWS EFS存储类

存储类用于区分和描绘存储级别和用法。通过定义存储类,用户可以获得动态预配的持久卷。

AWS EFS CSI驱动程序操作符(一个Red Hat操作符)安装后,默认情况下不会创建存储类。但是,您可以手动创建AWS EFS存储类。

使用控制台创建AWS EFS存储类

步骤
  1. 在AWS上的Red Hat OpenShift服务控制台中,点击存储存储类

  2. 存储类页面上,点击创建存储类

  3. 存储类页面上,执行以下步骤:

    1. 输入一个名称来引用存储类。

    2. 可选:输入描述。

    3. 选择回收策略。

    4. 供应程序下拉列表中选择efs.csi.aws.com

    5. 可选:为所选供应程序设置配置参数。

  4. 单击**创建**。

使用CLI创建AWS EFS存储类

步骤
  • 创建一个StorageClass对象。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: efs-sc
    provisioner: efs.csi.aws.com
    parameters:
      provisioningMode: efs-ap (1)
      fileSystemId: fs-a5324911 (2)
      directoryPerms: "700" (3)
      gidRangeStart: "1000" (4)
      gidRangeEnd: "2000" (4)
      basePath: "/dynamic_provisioning" (5)
    1 provisioningMode必须为efs-ap才能启用动态配置。
    2 fileSystemId必须是手动创建的EFS卷的ID。
    3 directoryPerms是卷根目录的默认权限。在此示例中,只有所有者才能访问该卷。
    4 gidRangeStartgidRangeEnd设置用于设置AWS访问点GID的POSIX组ID (GID) 范围。如果未指定,则默认范围为50000-7000000。每个配置的卷以及AWS访问点都将从此范围内分配一个唯一的GID。
    5 basePath是EFS卷上用于创建动态配置卷的目录。在本例中,PV在EFS卷上配置为“/dynamic_provisioning/<随机uuid>”。只有子目录挂载到使用PV的Pod。

    集群管理员可以创建多个StorageClass对象,每个对象使用不同的EFS卷。

在AWS中创建和配置对EFS卷的访问

此过程说明如何在AWS中创建和配置EFS卷,以便您可以在AWS上的Red Hat OpenShift服务中使用它们。

先决条件
  • AWS账户凭证

步骤

要在AWS中创建和配置对EFS卷的访问:

  1. 在AWS控制台中,打开https://console.aws.amazon.com/efs

  2. 点击创建文件系统

    • 输入文件系统的名称。

    • 对于虚拟私有云 (VPC),选择您的Red Hat OpenShift服务在AWS上的虚拟私有云 (VPC)。

    • 接受所有其他选择的默认设置。

  3. 等待卷和挂载目标完全创建完成。

    1. 转到https://console.aws.amazon.com/efs#/file-systems

    2. 点击您的卷,然后在网络选项卡上等待所有挂载目标可用(约1-2分钟)。

  4. 网络选项卡上,复制安全组ID(您在下一步中需要此ID)。

  5. 转到https://console.aws.amazon.com/ec2/v2/home#SecurityGroups,找到EFS卷使用的安全组。

  6. 入站规则选项卡上,点击编辑入站规则,然后添加一个具有以下设置的新规则,以允许AWS上的Red Hat OpenShift服务节点访问EFS卷:

    • 类型:NFS

    • 协议:TCP

    • 端口范围: 2049

    • 来源:自定义/您的节点的IP地址范围(例如:“10.0.0.0/16”)

      此步骤允许AWS上的Red Hat OpenShift服务使用集群中的NFS端口。

  7. 保存规则。

Amazon Elastic File Storage的动态配置

AWS EFS CSI驱动程序支持与其他CSI驱动程序不同的动态配置形式。它将新的PV配置为预先存在的EFS卷的子目录。PV彼此独立。但是,它们共享相同的EFS卷。删除卷时,从中配置的所有PV也会被删除。EFS CSI驱动程序为每个这样的子目录创建一个AWS访问点。由于AWS AccessPoint的限制,您只能从单个StorageClass/EFS卷动态配置1000个PV。

请注意,EFS不强制执行PVC.spec.resources

在下面的示例中,您请求5 GiB的空间。但是,创建的PV是无限的,可以存储任何数量的数据(例如PB)。损坏的应用程序,甚至恶意应用程序,当它在卷上存储过多数据时,都可能导致巨大的开销。

强烈建议使用AWS中的EFS卷大小监控。

先决条件
  • 您已创建Amazon Elastic File Storage (Amazon EFS) 卷。

  • 您已创建AWS EFS存储类。

步骤

要启用动态配置:

  • 照常创建PVC(或StatefulSet或模板),引用前面创建的StorageClass

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test
    spec:
      storageClassName: efs-sc
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi

如果您在设置动态配置时遇到问题,请参阅AWS EFS故障排除

使用Amazon Elastic File Storage创建静态PV

可以使用Amazon Elastic File Storage (Amazon EFS) 卷作为单个PV,无需任何动态配置。整个卷都挂载到Pod。

先决条件
  • 您已创建Amazon EFS卷。

步骤
  • 使用以下YAML文件创建PV:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: efs-pv
    spec:
      capacity: (1)
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: efs.csi.aws.com
        volumeHandle: fs-ae66151a (2)
        volumeAttributes:
          encryptInTransit: "false" (3)
    1 spec.capacity没有任何意义,并且被CSI驱动程序忽略。它仅在绑定到PVC时使用。应用程序可以将任何数量的数据存储到卷中。
    2 volumeHandle必须与您在AWS中创建的EFS卷的ID相同。如果您提供自己的访问点,则volumeHandle应为::<访问点ID>。例如:fs-6e633ada::fsap-081a1d293f0004630
    3 如果需要,您可以禁用传输中的加密。默认情况下启用加密。

如果您在设置静态PV时遇到问题,请参阅AWS EFS故障排除

Amazon Elastic File Storage安全

以下信息对于Amazon Elastic File Storage (Amazon EFS) 安全非常重要。

使用访问点时(例如,使用前面描述的动态配置),Amazon会自动将文件上的GID替换为访问点的GID。此外,EFS在评估文件系统权限时会考虑访问点的用户ID、组ID和辅助组ID。EFS会忽略NFS客户端的ID。有关访问点的更多信息,请参阅https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html

因此,EFS卷会静默忽略FSGroup;AWS上的Red Hat OpenShift服务无法将卷上文件的GID替换为FSGroup。任何可以访问已挂载EFS访问点的Pod都可以访问其上的任何文件。

无关的是,传输加密默认启用。更多信息,请参见 https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html

AWS EFS 存储 CSI 使用指标

使用指标概述

Amazon Web Services (AWS) 弹性文件系统 (EFS) 存储容器存储接口 (CSI) 使用指标允许您监控动态或静态配置的 EFS 卷使用了多少空间。

此功能默认禁用,因为启用指标可能会导致性能下降。

AWS EFS 使用指标功能通过递归遍历卷中的文件来收集 AWS EFS CSI 驱动程序中的卷指标。由于此操作可能会降低性能,因此管理员必须显式启用此功能。

使用 Web 控制台启用使用指标

要使用 Web 控制台启用 Amazon Web Services (AWS) 弹性文件系统 (EFS) 存储容器存储接口 (CSI) 使用指标

  1. 单击**管理** > **CustomResourceDefinitions**。

  2. 在**CustomResourceDefinitions**页面上,在**名称**下拉框旁边,键入clustercsidriver

  3. 单击**CRD ClusterCSIDriver**。

  4. 单击**YAML**选项卡。

  5. spec.aws.efsVolumeMetrics.state下,将值设置为RecursiveWalk

    RecursiveWalk表示 AWS EFS CSI 驱动程序中的卷指标收集是通过递归遍历卷中的文件来执行的。

    示例 ClusterCSIDriver efs.csi.aws.com YAML 文件
    spec:
        driverConfig:
            driverType: AWS
            aws:
                efsVolumeMetrics:
                  state: RecursiveWalk
                  recursiveWalk:
                    refreshPeriodMinutes: 100
                    fsRateLimit: 10
  6. 可选:要定义递归遍历的操作方式,您还可以设置以下字段

    • refreshPeriodMinutes:以分钟为单位指定卷指标的刷新频率。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 240 分钟。有效范围是 1 到 43200 分钟。

    • fsRateLimit:定义每个文件系统中用于处理卷指标的 goroutines 的速率限制。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 5 个 goroutines。有效范围是 1 到 100 个 goroutines。

  7. 单击**保存**。

要**禁用** AWS EFS CSI 使用指标,请使用上述步骤,但对于spec.aws.efsVolumeMetrics.state,请将值从RecursiveWalk更改为Disabled

使用 CLI 启用使用指标

要使用 CLI 启用 Amazon Web Services (AWS) 弹性文件系统 (EFS) 存储容器存储接口 (CSI) 使用指标

  1. 通过运行以下命令编辑 ClusterCSIDriver

    $ oc edit clustercsidriver efs.csi.aws.com
  2. spec.aws.efsVolumeMetrics.state下,将值设置为RecursiveWalk

    RecursiveWalk表示 AWS EFS CSI 驱动程序中的卷指标收集是通过递归遍历卷中的文件来执行的。

    示例 ClusterCSIDriver efs.csi.aws.com YAML 文件
    spec:
        driverConfig:
            driverType: AWS
            aws:
                efsVolumeMetrics:
                  state: RecursiveWalk
                  recursiveWalk:
                    refreshPeriodMinutes: 100
                    fsRateLimit: 10
  3. 可选:要定义递归遍历的操作方式,您还可以设置以下字段

    • refreshPeriodMinutes:以分钟为单位指定卷指标的刷新频率。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 240 分钟。有效范围是 1 到 43200 分钟。

    • fsRateLimit:定义每个文件系统中用于处理卷指标的 goroutines 的速率限制。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 5 个 goroutines。有效范围是 1 到 100 个 goroutines。

  4. 将更改保存到efs.csi.aws.com对象。

要**禁用** AWS EFS CSI 使用指标,请使用上述步骤,但对于spec.aws.efsVolumeMetrics.state,请将值从RecursiveWalk更改为Disabled

Amazon 弹性文件存储故障排除

以下信息提供了有关如何排除 Amazon 弹性文件存储 (Amazon EFS) 问题的方法指导。

  • AWS EFS 运算符和 CSI 驱动程序在openshift-cluster-csi-drivers命名空间中运行。

  • 要启动收集 AWS EFS 运算符和 CSI 驱动程序的日志,请运行以下命令

    $ oc adm must-gather
    [must-gather      ] OUT Using must-gather plugin-in image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5
    [must-gather      ] OUT namespace/openshift-must-gather-xm4wq created
    [must-gather      ] OUT clusterrolebinding.rbac.authorization.k8s.io/must-gather-2bd8x created
    [must-gather      ] OUT pod for plug-in image quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5 created
  • 要显示 AWS EFS 运算符错误,请查看ClusterCSIDriver状态

    $ oc get clustercsidriver efs.csi.aws.com -o yaml
  • 如果卷无法挂载到 pod(如以下命令的输出所示)

    $ oc describe pod
    ...
      Type     Reason       Age    From               Message
      ----     ------       ----   ----               -------
      Normal   Scheduled    2m13s  default-scheduler  Successfully assigned default/efs-app to ip-10-0-135-94.ec2.internal
      Warning  FailedMount  13s    kubelet            MountVolume.SetUp failed for volume "pvc-d7c097e6-67ec-4fae-b968-7e7056796449" : rpc error: code = DeadlineExceeded desc = context deadline exceeded (1)
      Warning  FailedMount  10s    kubelet            Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[persistent-storage kube-api-access-9j477]: timed out waiting for the condition
    1 指示卷未挂载的警告消息。

    此错误通常是由 AWS 在 AWS 上的 Red Hat OpenShift 服务节点和 Amazon EFS 之间丢弃数据包引起的。

    检查以下内容是否正确:

    • AWS 防火墙和安全组

    • 网络:端口号和 IP 地址

卸载 AWS EFS CSI 驱动程序运算符

卸载AWS EFS CSI 驱动程序运算符(一个 Red Hat 运算符)后,所有 EFS PV 都无法访问。

先决条件
  • 访问Red Hat OpenShift Service on AWS Web控制台。

步骤

要从 Web 控制台卸载 AWS EFS CSI 驱动程序运算符

  1. 登录到Web控制台。

  2. 停止所有使用 AWS EFS PV 的应用程序。

  3. 删除所有 AWS EFS PV

    1. 单击**存储** → **PersistentVolumeClaims**。

    2. 选择 AWS EFS CSI 驱动程序运算符正在使用的每个 PVC,单击 PVC 最右侧的下拉菜单,然后单击**删除 PersistentVolumeClaims**。

  4. 卸载AWS EFS CSI 驱动程序

    在卸载运算符之前,必须先删除 CSI 驱动程序。

    1. 单击**管理** → **CustomResourceDefinitions** → **ClusterCSIDriver**。

    2. 在**实例**选项卡上,对于efs.csi.aws.com,在最左侧单击下拉菜单,然后单击**删除 ClusterCSIDriver**。

    3. 出现提示时,单击**删除**。

  5. 卸载 AWS EFS CSI 运算符

    1. 单击**运算符** → **已安装的运算符**。

    2. 在**已安装的运算符**页面上,滚动或在**按名称搜索**框中键入 AWS EFS CSI 以查找运算符,然后单击它。

    3. 在**已安装的运算符 > 运算符详细信息**页面的右上角,单击**操作** → **卸载运算符**。

    4. 在**卸载运算符**窗口中出现提示时,单击**卸载**按钮以从命名空间中删除运算符。运算符在集群上部署的任何应用程序都需要手动清理。

      卸载后,AWS EFS CSI 驱动程序运算符将不再列在 Web 控制台的**已安装的运算符**部分中。

在销毁集群(openshift-install destroy cluster)之前,必须删除 AWS 中的 EFS 卷。当存在使用集群 VPC 的 EFS 卷时,无法销毁 AWS 上的 Red Hat OpenShift 服务集群。Amazon 不允许删除此类 VPC。

其他资源