×

概述

OpenShift Dedicated 可以使用 AWS Elastic File Service (EFS) 的容器存储接口 (CSI) 驱动程序来预配持久卷 (PV)。

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

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

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

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

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

关于 CSI

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

CSI Operator 为 OpenShift Dedicated 用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是无法实现的。

设置 AWS EFS CSI Driver Operator

  1. 如果您正在将 AWS EFS 与 AWS 安全令牌服务 (STS) 一起使用,请获取 STS 的角色 Amazon 资源名称 (ARN)。这对于安装 AWS EFS CSI Driver Operator 是必需的。

  2. 安装 AWS EFS CSI Driver Operator。

  3. 安装 AWS EFS CSI Driver。

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

此过程说明如何获取角色 Amazon 资源名称 (ARN),以便使用 AWS 安全令牌服务 (STS) 在 AWS 上将 AWS EFS CSI Driver Operator 与 OpenShift Dedicated 配合使用。

在安装 AWS EFS CSI Driver Operator 之前执行此过程(请参阅安装 AWS EFS CSI Driver Operator 过程)。

先决条件
  • 以具有 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 端点

    $ openshift_oidc_provider=`oc get authentication.config.openshift.io cluster \
      -o json | jq -r .spec.serviceAccountIssuer | sed -e "s/^https:\/\///"`; \
      echo $openshift_oidc_provider
    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 Driver Operator 时需要它。

  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 Driver Operator

AWS EFS CSI Driver Operator(一个 Red Hat Operator)在 OpenShift Dedicated 中并非默认安装。请使用以下步骤在您的集群中安装和配置 AWS EFS CSI Driver Operator。

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

步骤

要从 Web 控制台安装 AWS EFS CSI Driver Operator

  1. 登录 Web 控制台。

  2. 安装 AWS EFS CSI Operator

    1. 点击 **Operators** → **OperatorHub**。

    2. 在筛选框中输入 **AWS EFS CSI** 以查找 AWS EFS CSI Operator。

    3. 点击 **AWS EFS CSI Driver Operator** 按钮。

    请务必选择 **AWS EFS CSI Driver Operator**,而不是 **AWS EFS Operator**。**AWS EFS Operator** 是一个社区 Operator,不受 Red Hat 支持。

    1. 在 **AWS EFS CSI Driver Operator** 页面上,点击 **Install**。

    2. 在 **Install Operator** 页面上,确保

      • 如果您使用的是带有 AWS 安全令牌服务 (STS) 的 AWS EFS,请在 **role ARN** 字段中输入从“获取安全令牌服务的 Amazon 资源名称角色”步骤的最后一步复制的 ARN 角色。

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

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

    3. 点击 **Install**。

      安装完成后,AWS EFS CSI Operator 将列在 Web 控制台的 **已安装 Operators** 部分。

安装 AWS EFS CSI Driver

安装 AWS EFS CSI Driver Operator(一个 Red Hat operator)后,您需要安装 AWS EFS CSI driver

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

步骤
  1. 点击 **Administration** → **CustomResourceDefinitions** → **ClusterCSIDriver**。

  2. 在 **Instances** 选项卡上,点击 **Create ClusterCSIDriver**。

  3. 使用以下 YAML 文件

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

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

    • AWSEFSDriverNodeServiceControllerAvailable

    • AWSEFSDriverControllerServiceControllerAvailable

创建 AWS EFS 存储类

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

安装后,AWS EFS CSI Driver Operator(一个 Red Hat operator)不会默认创建存储类。但是,您可以手动创建 AWS EFS 存储类。

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

步骤
  1. 在 OpenShift Dedicated 控制台中,点击 **Storage** → **StorageClasses**。

  2. 在 **StorageClasses** 页面上,点击 **Create StorageClass**。

  3. 在 **StorageClass** 页面上,执行以下步骤

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

    2. 可选:输入描述。

    3. 选择回收策略。

    4. 从 **Provisioner** 下拉列表中选择 **efs.csi.aws.com**。

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

  4. 点击 **Create**。

使用 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 卷,以便您可以在 OpenShift Dedicated 中使用它们。

先决条件
  • AWS 账户凭证

步骤

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

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

  2. 点击 **创建文件系统**

    • 输入文件系统的名称。

    • 对于 **虚拟私有云 (VPC)**,选择您的 OpenShift Dedicated 的虚拟私有云 (VPC)。

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

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

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

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

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

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

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

    • **类型**: NFS

    • **协议**: TCP

    • 端口范围: 2049

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

      此步骤允许 OpenShift Dedicated 使用集群中的 NFS 端口。

  7. 保存规则。

Amazon Elastic File Storage 的动态配置

AWS EFS CSI 驱动程序支持与其他 CSI 驱动程序不同的动态配置方式。它将新的 PV 配置为预先存在的 EFS 卷的子目录。这些 PV 是相互独立的,但它们共享同一个 EFS 卷。删除卷时,也会删除从中配置的所有 PV。EFS CSI 驱动程序为每个这样的子目录创建一个 AWS Access Point。由于 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 或 Template),并引用之前创建的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应为<EFS 卷 ID>::<访问点 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;OpenShift Dedicated 无法将卷上文件的 GID 替换为 FSGroup。任何可以访问已挂载的 EFS 访问点的 Pod 都可以访问其上的任何文件。

与此无关,默认情况下启用传输加密。有关更多信息,请参阅https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html

AWS EFS 存储 CSI 使用情况指标

使用情况指标概述

Amazon Web Services (AWS) Elastic File Service (EFS) 存储容器存储接口 (CSI) 使用情况指标允许您监控动态或静态配置的 EFS 卷使用了多少空间。

此功能默认情况下处于禁用状态,因为启用指标可能会导致性能下降。

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

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

要使用 Web 控制台启用 Amazon Web Services (AWS) Elastic File Service (EFS) 存储容器存储接口 (CSI) 使用情况指标

  1. 单击**管理** > **自定义资源定义**。

  2. 在**自定义资源定义**页面上,在**名称**下拉框旁边,键入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:定义每个文件系统在 goroutine 中处理卷指标的速率限制。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 5 个 goroutine。有效范围是 1 到 100 个 goroutine。

  7. 单击**保存**。

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

使用 CLI 启用使用情况指标

要使用 CLI 启用 Amazon Web Services (AWS) Elastic File Service (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:定义每个文件系统在 goroutine 中处理卷指标的速率限制。如果此字段留空,则会选择合理的默认值,该值会随着时间的推移而发生变化。当前默认值为 5 个 goroutine。有效范围是 1 到 100 个 goroutine。

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

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

Amazon Elastic File Storage 故障排除

以下信息提供了有关如何对 Amazon Elastic File Storage (Amazon EFS) 问题进行故障排除的指导。

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

  • 要启动收集 AWS EFS Operator 和 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 Operator 错误,请查看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 在 OpenShift Dedicated 节点和 Amazon EFS 之间丢弃数据包引起的。

    检查以下内容是否正确:

    • AWS 防火墙和安全组

    • 网络:端口号和 IP 地址

卸载 AWS EFS CSI 驱动程序 Operator

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

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

步骤

要从 Web 控制台卸载 AWS EFS CSI 驱动程序 Operator

  1. 登录 Web 控制台。

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

  3. 删除所有 AWS EFS PV。

    1. 点击存储持久化卷声明 (PersistentVolumeClaims)

    2. 选择每个被 AWS EFS CSI Driver Operator 使用的 PVC,点击 PVC 最右侧的下拉菜单,然后点击删除持久化卷声明 (Delete PersistentVolumeClaims)

  4. 卸载AWS EFS CSI 驱动程序

    在卸载 Operator 之前,必须先移除 CSI 驱动程序。

    1. 点击 **Administration** → **CustomResourceDefinitions** → **ClusterCSIDriver**。

    2. 实例选项卡中,针对efs.csi.aws.com(位于最左侧),点击下拉菜单,然后点击删除集群 CSIDriver (Delete ClusterCSIDriver)

    3. 出现提示时,点击删除

  5. 卸载 AWS EFS CSI Operator

    1. 点击Operators已安装的 Operators

    2. 已安装的 Operators页面上,滚动或在按名称搜索框中输入 AWS EFS CSI 以查找 Operator,然后点击它。

    3. 已安装的 Operators > Operator 详情页面的右上方,点击操作卸载 Operator

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

      卸载后,AWS EFS CSI Driver Operator 将不再列在 Web 控制台的已安装的 Operators部分中。

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

其他资源