5.4.5. AWS EFS CSI 跨帐户支持


通过跨帐户支持,您可以在 AWS 帐户中有一个 Red Hat OpenShift Service on AWS 集群,并使用 AWS Elastic File System (EFS) Container Storage Interface (CSI)驱动程序将文件系统挂载到另一个 AWS 帐户中。

注意

Red Hat OpenShift Service on AWS 集群和 EFS 文件系统必须位于同一区域。

先决条件

  • 使用管理员权限访问 Red Hat OpenShift Service on AWS 集群
  • 两个有效的 AWS 帐户

流程

以下流程演示了如何设置:

  • AWS 帐户 A 中的 Red Hat OpenShift Service on AWS 集群
  • 在帐户 B 中挂载 AWS EFS 文件系统

在帐户间使用 AWS EFS:

  1. 使用 AWS 帐户 A 在 AWS 集群中安装 Red Hat OpenShift Service 并安装 EFS CSI Driver Operator。
  2. 在 AWS 帐户 B 中创建 EFS 卷:

    1. 创建一个带有 CIDR 虚拟私有云 (VPC)(例如称为 "my-efs-vpc”),例如“172.20.0.0/16” 以及 AWS EFS 卷的子网。
    2. 在 AWS 控制台中,转至 https://console.aws.amazon.com/efs
    3. Create new filesystem

      1. 创建一个文件系统,如 "my-filesystem"。
      2. 选择之前创建的 VPC ("my-efs-vpc")。
      3. 接受其余设置的默认值。
    4. 确保已创建了卷和挂载目标:

      1. https://console.aws.amazon.com/efs#/file-systems.
      2. 点您的卷,在 Network 选项卡中,等待所有 Mount Targets 可用(大约 1-2 分钟)。
    5. Network 选项卡中,复制安全组 ID。下一步需要它。
  3. 配置 AWS 帐户 B 上 AWS EFS 卷的网络访问:

    1. 进入 https://console.aws.amazon.com/ec2/v2/home#SecurityGroups
    2. 通过过滤之前复制的组 ID 来查找 AWS EFS 卷使用的安全组。
    3. Inbound rules 选项卡中,点 Edit inbound rules,然后添加一个新规则来允许 Red Hat OpenShift Service on AWS 节点访问 AWS EFS 卷(即,使用集群中的 NFS 端口):

      • 类型 :NFS
      • 协议 :TCP
      • 端口范围 :2049
      • Source: 您的 Red Hat OpenShift Service on AWS 集群节点上的自定义/IP 地址范围(如 "10.0.0.0/16")
    4. 保存规则。
    注意

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

  4. 在 AWS 帐户 A 中的 Red Hat OpenShift Service on AWS 集群 VPC 和 AWS 帐户 B 中的 AWS EFS VPC 之间创建 VPC 对等:

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

    1. 在帐户 B 中创建一个名为 "my-efs-crossaccount-peering-connection" 的对等连接。对于本地 VPC ID,请使用 EFS-located VPC。要与 VPC 用于帐户 A 的对等,对于 VPC ID,使用 Red Hat OpenShift Service on AWS 集群 VPC ID。
    2. 接受 AWS 帐户 A 中的对等连接。
    3. 修改 AWS 帐户 B 中每个子网的路由表 (EFS-volume 使用的子网):

      1. 在左侧窗格中,在 Virtual private cloud 下,单向下箭头以展开可用选项。
      2. Virtual private cloud 下,点 Route tables"。
      3. Routes 选项卡。
      4. Destination 下,输入 10.0.0.0/16。
      5. Target 下,使用来自创建的对等连接的对等连接类型点。
    4. 修改 AWS 帐户 A 中每个子网的路由表(Red Hat OpenShift Service on AWS 集群节点上的使用子网):

      1. 在左侧窗格中,在 Virtual private cloud 下,单向下箭头以展开可用选项。
      2. Virtual private cloud 下,点 Route tables"。
      3. Routes 选项卡。
      4. Destination 下,在帐户 B 中输入 VPC 的 CIDR,本例中为 172.20.0.0/16。
      5. Target 下,使用来自创建的对等连接的对等连接类型点。
  5. 准备 AWS 帐户 A IAM 角色和策略。

    注意

    这个过程需要 两个独立的 AWS 帐户。

    1. 为 EFS CSI 驱动程序创建 IAM 策略。

      注意

      与单个帐户 EFS CSI 策略相比,这个权限有额外的权限。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "elasticfilesystem:DescribeAccessPoints",
                      "elasticfilesystem:DescribeFileSystems",
                      "elasticfilesystem:DescribeMountTargets",
                      "elasticfilesystem:TagResource",
                      "elasticfilesystem:ClientMount",
                      "elasticfilesystem:ClientRootAccess",
                      "elasticfilesystem:ClientWrite",
                      "elasticfilesystem:DescribeMountTargets",
                      "ec2:DescribeAvailabilityZones"
                  ],
                  "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"
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Action": "sts:AssumeRole",
                  "Resource": "arn:aws:iam::${AWS_ACCOUNT_B_ID}:role/cross-account-efs-role"
              }
          ]
      }
    2. 创建策略。

      $ aws iam create-policy --policy-name "${CLUSTER_NAME}-rosa-efs-csi" \
         --policy-document file://<path-to-file>.json \
         --query 'Policy.Arn' --output text
    3. 创建信任策略。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::${AWS_ACCOUNT_A_ID}:oidc-provider/${OIDC_PROVIDER}"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "${OIDC_PROVIDER}:sub": [
                              "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-operator",
                              "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-controller-sa"
                          ]
                      }
                  }
              }
          ]
      }
    4. 为 EFS CSI Driver Operator 创建角色。

      $ aws iam create-role \
        --role-name "${CLUSTER_NAME}-aws-efs-csi-operator" \
        --assume-role-policy-document file://<path-to-file>.json \
        --query "Role.Arn" --output text
    5. 将策略附加到角色。

      $ aws iam attach-role-policy \
         --role-name "${CLUSTER_NAME}-aws-efs-csi-operator" \
         --policy-arn ${ACCOUNT_A_POLICY_ARN}

    EFS CSI 控制器使用的此角色现在可以假设帐户 B 中的角色。

  6. 准备 AWS 帐户 B IAM 角色和策略。

    1. 创建 IAM 策略。

      {
          "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",
                      "elasticfilesystem:TagResource"
                  ],
                  "Resource": "*"
              }
          ]
      }
    2. 创建策略。

      $ aws iam create-policy --policy-name "cross-account-rosa-efs-csi" \
         --policy-document file://<path-to-file>.json \
         --query 'Policy.Arn' --output text
    3. 创建信任策略。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::${AWS_ACCOUNT_A_ID}:root"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {}
              }
          ]
      }
    4. 为 EFS CSI Driver Operator 创建角色以假定。

      $ aws iam create-role \
        --role-name "cross-account-efs-role" \
        --assume-role-policy-document file://<path-to-file>.json \
        --query "Role.Arn" --output text
    5. 将策略附加到角色。

      $ aws iam attach-role-policy \
      --role-name "cross-account-efs-role" \
      --policy-arn ${ACCOUNT_B_POLICY_ARN}
  7. 在 AWS 帐户 A 中部署 AWS EFS CSI Operator。

    1. 创建一个 secret 告知 AWS EFS Operator 要请求哪个 IAM 角色。

      apiVersion: v1
      kind: Secret
      metadata:
       name: aws-efs-cloud-credentials
       namespace: openshift-cluster-csi-drivers
      stringData:
        credentials: |-
          [default]
          role_arn = ${ACCOUNT_A_ROLE_ARN}
          web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    2. 安装 EFS Operator。

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        generateName: openshift-cluster-csi-drivers-
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        labels:
          operators.coreos.com/aws-efs-csi-driver-operator.openshift-cluster-csi-drivers: ""
        name: aws-efs-csi-driver-operator
        namespace: openshift-cluster-csi-drivers
      spec:
        channel: stable
        installPlanApproval: Automatic
        name: aws-efs-csi-driver-operator
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    3. 检查 Operator 是否在运行。

      $ oc get deployment aws-efs-csi-driver-operator -n openshift-cluster-csi-drivers
    4. 安装 AWS EFS CSI 驱动程序。

      apiVersion: operator.openshift.io/v1
      kind: ClusterCSIDriver
      metadata:
          name: efs.csi.aws.com
      spec:
        managementState: Managed
    5. 检查 CSI 驱动程序是否正在运行。

      $ oc get daemonset aws-efs-csi-driver-node -n openshift-cluster-csi-drivers
    6. 创建一个新 secret,它将告知 CSI 驱动程序 Account B 中的角色名称。

      $ oc create secret generic cross-account-arn \
        -n openshift-cluster-csi-drivers \
        --from-literal=awsRoleArn="arn:aws:iam::${AWS_ACCOUNT_B_ID}:role/cross-account-efs-role"
    7. 允许 EFS CSI 控制器读取此 secret。

      $ 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
    8. 为 EFS 卷创建存储类。

      # The cross account efs volume storageClass
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: efs-sc
      provisioner: efs.csi.aws.com
      parameters:
        provisioningMode: efs-ap
        fileSystemId: ${EFS_FILESYSTEM_ID}
        directoryPerms: "700"
        gidRangeStart: "1000"
        gidRangeEnd: "2000"
        basePath: "/dynamic_provisioning"
        csi.storage.k8s.io/provisioner-secret-name: cross-account-arn
        csi.storage.k8s.io/provisioner-secret-namespace: openshift-cluster-csi-drivers
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部