×

概述

OpenShift Container Platform能够使用AWS Elastic File Service (EFS)的容器存储接口(CSI)驱动程序来配置持久卷(PV)。

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

安装AWS EFS CSI驱动程序操作符后,OpenShift Container Platform默认在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操作符为OpenShift Container Platform用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是无法实现的。

设置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) 上使用 OpenShift Container Platform 配置 AWS EFS CSI 驱动程序操作程序。

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

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

  • AWS 账户凭证

步骤

您可以通过多种方式获取 ARN 角色。以下过程显示了一种使用与集群安装相同的概念和 CCO 实用程序 (ccoctl) 二进制工具的方法。

要获取用于使用 STS 配置 AWS EFS CSI 驱动程序操作程序的角色 ARN

  1. 从用于使用 STS 安装集群的 OpenShift Container Platform 发行版镜像中提取ccoctl。有关更多信息,请参见“配置云凭证操作程序实用程序”。

  2. 创建并保存一个 EFS CredentialsRequest YAML 文件,例如以下示例所示,然后将其放在credrequests目录中

    示例
    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: openshift-aws-efs-csi-driver
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
        - action:
          - elasticfilesystem:*
          effect: Allow
          resource: '*'
      secretRef:
        name: aws-efs-cloud-credentials
        namespace: openshift-cluster-csi-drivers
      serviceAccountNames:
      - aws-efs-csi-driver-operator
      - aws-efs-csi-driver-controller-sa
  3. 运行ccoctl工具在 AWS 中生成新的 IAM 角色,并在本地文件系统中为其创建一个 YAML 文件 (<path_to_ccoctl_output_dir>/manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml)。

    $ ccoctl aws create-iam-roles --name=<name> --region=<aws_region> --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
    • name=<name>是用于标记为跟踪而创建的任何云资源的名称。

    • region=<aws_region>是创建云资源的 AWS 区域。

    • dir=<path_to_directory_with_list_of_credentials_requests>/credrequests是包含上一步中 EFS CredentialsRequest 文件的目录。

    • <aws_account_id>是 AWS 账户 ID。

      示例
      $ ccoctl aws create-iam-roles --name my-aws-efs --credentials-requests-dir credrequests --identity-provider-arn arn:aws:iam::123456789012:oidc-provider/my-aws-efs-oidc.s3.us-east-2.amazonaws.com
      示例输出
      2022/03/21 06:24:44 Role arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud- created
      2022/03/21 06:24:44 Saved credentials configuration to: /manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
      2022/03/21 06:24:45 Updated Role policy for Role my-aws-efs-openshift-cluster-csi-drivers-aws-efs-cloud-
  4. 从上一步的示例输出的第一行复制角色 ARN。角色 ARN 位于“Role”和“created”之间。在此示例中,角色 ARN 为“arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud”。

    安装 AWS EFS CSI 驱动程序操作程序时,您将需要角色 ARN。

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

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

先决条件
  • 访问 OpenShift Container Platform 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 驱动程序

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

步骤
  1. 点击管理CustomResourceDefinitionsClusterCSIDriver

  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. 在 OpenShift Container Platform 控制台中,点击存储存储类

  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/<random uuid>”。只有子目录会挂载到使用 PV 的 Pod。

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

AWS EFS CSI 跨账户支持

跨账户支持允许您在一个 AWS 账户中拥有 OpenShift Container Platform 集群,并使用 AWS 弹性文件系统 (EFS) 容器存储接口 (CSI) 驱动程序在另一个 AWS 账户中挂载文件系统。

OpenShift Container Platform 集群和 EFS 文件系统必须位于同一区域。

先决条件
  • 访问具有管理员权限的 OpenShift Container Platform 集群

  • 两个有效的 AWS 账户

步骤

以下步骤演示如何设置

  • AWS 账户 A 中的 OpenShift Container Platform 集群

  • 挂载账户 B 中的 AWS EFS 文件系统

要跨账户使用 AWS EFS

  1. 使用 AWS 账户 A 安装 OpenShift Container Platform 集群并安装 EFS CSI 驱动程序操作程序。

  2. 在 AWS 账户 B 中创建 EFS 卷

    1. 创建虚拟私有云 (VPC),例如“my-efs-vpc”,其 CIDR 为例如“172.20.0.0/16”,以及 AWS EFS 卷的子网。

    2. 在 AWS 控制台中,转到 https://console.aws.amazon.com/efs

    3. 点击创建新的文件系统

      1. 创建一个文件系统,例如命名为“my-filesystem”。

      2. 选择之前创建的 VPC(“my-efs-vpc”)。

      3. 接受其余设置的默认值。

    4. 确保已创建卷和挂载目标。

      1. 检查 https://console.aws.amazon.com/efs#/file-systems

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

    5. 网络选项卡上,复制安全组 ID。下一步需要它。

  3. 配置对 AWS 账户 B 上的 AWS EFS 卷的网络访问。

    1. 转到 https://console.aws.amazon.com/ec2/v2/home#SecurityGroups

    2. 通过过滤之前复制的组 ID,查找 AWS EFS 卷使用的安全组。

    3. 入站规则选项卡上,点击编辑入站规则,然后添加一条新规则以允许 OpenShift Container Platform 节点访问 AWS EFS 卷(即使用集群的 NFS 端口)。

      • 类型:NFS

      • 协议:TCP

      • 端口范围: 2049

      • 来源:自定义/OpenShift Container Platform 集群节点的 IP 地址范围(例如,“10.0.0.0/16”)。

    4. 保存规则。

      如果遇到挂载问题,请重新检查端口号、IP 地址范围,并验证 AWS EFS 卷是否使用预期的安全组。

  4. 在 AWS 账户 A 中的 OpenShift Container Platform 集群 VPC 和 AWS 账户 B 中的 AWS EFS VPC 之间创建 VPC 对等连接。

    确保两个 VPC 使用不同的网络 CIDR,并且在创建 VPC 对等连接后,在每个 VPC 中添加路由以连接两个 VPC 网络。

    1. 在账户 B 中创建一个名为“my-efs-crossaccount-peering-connection”的对等连接。对于本地 VPC ID,使用 EFS 所在的 VPC。要与账户 A 的 VPC 建立对等连接,请使用 OpenShift Container Platform 集群 VPC ID 作为 VPC ID。

    2. 在 AWS 账户 A 中接受对等连接。

    3. 修改 AWS 账户 B 中每个子网(EFS 卷使用的子网)的路由表。

      1. 在左侧窗格中,在虚拟私有云下,单击向下箭头以展开可用选项。

      2. 虚拟私有云下,单击路由表

      3. 单击路由选项卡。

      4. 目标下,输入 10.0.0.0/16。

      5. 目标下,使用从创建的对等连接指向的对等连接类型。

    4. 修改 AWS 账户 A 中每个子网(OpenShift Container Platform 集群节点使用的子网)的路由表。

      1. 在左侧窗格中,在虚拟私有云下,单击向下箭头以展开可用选项。

      2. 虚拟私有云下,单击路由表

      3. 单击路由选项卡。

      4. 目标下,输入账户 B 中 VPC 的 CIDR,在本例中为 172.20.0.0/16。

      5. 目标下,使用从创建的对等连接指向的对等连接类型。

  5. 在 AWS 账户 B 中创建一个 IAM 角色,例如“my-efs-acrossaccount-role”,该角色与 AWS 账户 A 之间存在信任关系,并添加一个具有调用“my-efs-acrossaccount-driver-policy”权限的内联 AWS EFS 策略。

    此角色由在 AWS 账户 A 中的 OpenShift Container Platform 集群上运行的 CSI 驱动程序的控制器服务使用,以确定 AWS 账户 B 中文件系统的挂载目标。

    # Trust relationships trusted entity trusted account A configuration on my-efs-acrossaccount-role in account B
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::301721915996:root"
                },
                "Action": "sts:AssumeRole",
                "Condition": {}
            }
        ]
    }
    
    # my-cross-account-assume-policy policy attached to my-efs-acrossaccount-role in account B
    
    {
        "Version": "2012-10-17",
        "Statement": {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::589722580343:role/my-efs-acrossaccount-role"
        }
    }
    
    # my-efs-acrossaccount-driver-policy attached to my-efs-acrossaccount-role in account B
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeNetworkInterfaces",
                    "ec2:DescribeSubnets"
                ],
                "Resource": "*"
            },
            {
                "Sid": "VisualEditor1",
                "Effect": "Allow",
                "Action": [
                    "elasticfilesystem:DescribeMountTargets",
                    "elasticfilesystem:DeleteAccessPoint",
                    "elasticfilesystem:ClientMount",
                    "elasticfilesystem:DescribeAccessPoints",
                    "elasticfilesystem:ClientWrite",
                    "elasticfilesystem:ClientRootAccess",
                    "elasticfilesystem:DescribeFileSystems",
                    "elasticfilesystem:CreateAccessPoint"
                ],
                "Resource": [
                    "arn:aws:elasticfilesystem:*:589722580343:access-point/*",
                    "arn:aws:elasticfilesystem:*:589722580343:file-system/*"
                ]
            }
        ]
    }
  6. 在 AWS 账户 A 中,将内联策略附加到 AWS EFS CSI 驱动程序的控制器服务帐户的 IAM 角色,该策略具有在之前创建的 IAM 角色上执行安全令牌服务 (STS) 假设角色的必要权限。

    # my-cross-account-assume-policy policy attached to Openshift cluster efs csi driver user in account A
    
    {
        "Version": "2012-10-17",
        "Statement": {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::589722580343:role/my-efs-acrossaccount-role"
        }
    }
  7. 在 AWS 账户 A 中,将 AWS 托管策略“AmazonElasticFileSystemClientFullAccess”附加到 OpenShift Container Platform 集群主角色。角色名称格式为<clusterID>-master-role(例如,my-0120ef-czjrl-master-role)。

  8. 创建一个 Kubernetes 密钥,其中awsRoleArn作为密钥,之前创建的角色作为值。

    $ oc -n openshift-cluster-csi-drivers create secret generic my-efs-cross-account --from-literal=awsRoleArn='arn:aws:iam::589722580343:role/my-efs-acrossaccount-role'

    由于驱动程序控制器需要从密钥中获取跨账户角色信息,因此需要将密钥角色绑定添加到 AWS EFS CSI 驱动程序控制器服务帐户 (SA)。

    $ oc -n openshift-cluster-csi-drivers create role access-secrets --verb=get,list,watch --resource=secrets
    
    $ oc -n openshift-cluster-csi-drivers create rolebinding --role=access-secrets default-to-secrets --serviceaccount=openshift-cluster-csi-drivers:aws-efs-csi-driver-controller-sa
  9. 为账户 B 中的文件系统(AWS EFS 卷)创建一个filesystem策略,允许 AWS 账户 A 对其执行挂载操作。

    This step is not mandatory, but can be safer for AWS EFS volume usage.
    # EFS volume filesystem policy in account B
    {
        "Version": "2012-10-17",
        "Id": "efs-policy-wizard-8089bf4a-9787-40f0-958e-bc2363012ace",
        "Statement": [
            {
                "Sid": "efs-statement-bd285549-cfa2-4f8b-861e-c372399fd238",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "*"
                },
                "Action": [
                    "elasticfilesystem:ClientRootAccess",
                    "elasticfilesystem:ClientWrite",
                    "elasticfilesystem:ClientMount"
                ],
                "Resource": "arn:aws:elasticfilesystem:us-east-2:589722580343:file-system/fs-091066a9bf9becbd5",
                "Condition": {
                    "Bool": {
                        "elasticfilesystem:AccessedViaMountTarget": "true"
                    }
                }
            },
            {
                "Sid": "efs-statement-03646e39-d80f-4daf-b396-281be1e43bab",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::589722580343:role/my-efs-acrossaccount-role"
                },
                "Action": [
                    "elasticfilesystem:ClientRootAccess",
                    "elasticfilesystem:ClientWrite",
                    "elasticfilesystem:ClientMount"
                ],
                "Resource": "arn:aws:elasticfilesystem:us-east-2:589722580343:file-system/fs-091066a9bf9becbd5"
            }
        ]
    }
  10. 使用类似于以下配置的配置创建 AWS EFS 卷存储类。

    # The cross account efs volume storageClass
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: efs-cross-account-mount-sc
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: fs-00f6c3ae6f06388bb
      directoryPerms: "700"
      gidRangeStart: "1000"
      gidRangeEnd: "2000"
      basePath: "/account-a-data"
      csi.storage.k8s.io/provisioner-secret-name: my-efs-cross-account
      csi.storage.k8s.io/provisioner-secret-namespace: openshift-cluster-csi-drivers
    volumeBindingMode: Immediate

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

此过程说明如何在 AWS 中创建和配置 EFS 卷,以便您可以在 OpenShift Container Platform 中使用它们。

先决条件
  • AWS 账户凭证

步骤

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

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

  2. 点击创建文件系统

    • 输入文件系统的名称。

    • 对于虚拟私有云 (VPC),选择您的 OpenShift Container Platform 的虚拟私有云 (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. 入站规则选项卡上,单击编辑入站规则,然后添加一条具有以下设置的新规则,以允许 OpenShift Container Platform 节点访问 EFS 卷。

    • 类型:NFS

    • 协议:TCP

    • 端口范围: 2049

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

      此步骤允许 OpenShift Container Platform 使用集群的 NFS 端口。

  7. 保存规则。

Amazon Elastic File Storage 的动态供应

与其他 CSI 驱动程序不同,AWS EFS CSI 驱动程序 支持不同形式的动态供应。它将新的 PV 配置为预先存在的 EFS 卷的子目录。PV 彼此独立。但是,它们都共享相同的 EFS 卷。删除卷时,从中配置的所有 PV 也将被删除。AWS 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 或 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 Container Platform 无法使用 FSGroup 替换卷上文件的 GID。任何可以访问已挂载的 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. 单击**管理** > **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 到 43,200 分钟。

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

  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 到 43,200 分钟。

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

  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 运算符和 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 在 OpenShift Container Platform 节点和 Amazon EFS 之间丢弃数据包引起的。

    检查以下内容是否正确

    • AWS 防火墙和安全组

    • 网络:端口号和 IP 地址

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

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

先决条件
  • 访问 OpenShift Container Platform 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. 点击管理CustomResourceDefinitionsClusterCSIDriver

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

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

  5. 卸载 AWS EFS CSI 运算符

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

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

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

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

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

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

更多资源