View a markdown version of this page

将 Amazon S3 文件系统存储与 Amazon EFS CSI 驱动程序配合使用 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

将 Amazon S3 文件系统存储与 Amazon EFS CSI 驱动程序配合使用

S3 Files 是一个共享文件系统,可将任何 Amazon 计算与您在 Amazon S3 中的数据直接连接。它以文件形式提供对所有 S3 数据的快速直接访问,具有完整的文件系统语义和低延迟性能,而数据永远不会离开 S3。这意味着基于文件的应用程序、代理和团队可以使用他们已经依赖的工具,像访问文件系统一样访问和处理 S3 数据。从版本 3.0.0 开始,Amazon EFS 容器存储接口(CSI)驱动程序允许在 Amazon 上运行的 Kubernetes 集群将 Amazon S3 文件系统作为永久卷挂载。本主题介绍了如何使用 Amazon EFS CSI 驱动程序来管理 Amazon EKS 集群上的 Amazon S3 文件系统。

注意事项

  • Amazon EFS CSI 驱动程序与基于 Windows 的容器映像不兼容。

  • EKS Fargate 不支持 S3 Files。

  • Amazon EFS CSI 驱动程序与 Amazon EKS 混合节点功能不兼容。

  • Amazon EFS CSI 驱动程序从版本 3.0.0 开始支持 Amazon S3 Files。

先决条件

  • Amazon EFS CSI 驱动程序需要 Amazon Identity and Access Management(IAM)权限。

  • 在您的设备或 Amazon CloudShell 上安装和配置 Amazon 命令行界面(Amazon CLI)的版本 2.12.3 或更高版本,或版本 1.27.160 或更高版本。要查看当前版本,请使用 aws --version | cut -d / -f2 | cut -d ' ' -f1yumapt-get 或适用于 macOS 的 Homebrew 等软件包管理器通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本,请参阅《Amazon 命令行界面用户指南》中的安装使用 aws configure 快速配置。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《Amazon CloudShell 用户指南》中的将 Amazon CLI 安装到您的主目录

  • 您的设备或 Amazon CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.29,则可以将 kubectl1.281.291.30 版本与之配合使用。要安装或升级 kubectl,请参阅 设置 kubectl 和 eksctl

步骤 1:创建 IAM 角色

Amazon EFS CSI 驱动程序需要 IAM 权限才能与您的文件系统进行交互。EFS CSI 驱动程序使用两个具有不同 IAM 角色的服务账户:

  • efs-csi-controller-sa:由控制器使用,需要 AmazonS3FilesCSIDriverPolicy

  • efs-csi-node-sa:由节点守护程序集使用,需要:

    • AmazonS3ReadOnlyAccess:启用直接从 S3 存储桶进行流式读取以提高吞吐量。

    • AmazonElasticFileSystemsUtils:启用将 efs-utils 日志发布到 Amazon CloudWatch,以便了解挂载操作并更轻松地进行故障排除。

注意

如果要同时使用 Amazon S3 文件系统和 Amazon EFS 存储,则必须将 AmazonS3FilesCSIDriverPolicyAmazonEFSCSIDriverPolicy 托管式策略同时附加到控制器角色。有关 Amazon EFS 存储的更多信息,请参阅 将弹性文件系统存储与 Amazon EFS 结合使用

要实现此过程,可以使用以下过程之一:

注意

此过程中的具体步骤是为将驱动程序用作 Amazon EKS 附加组件而编写的。有关自主管理型安装的详细信息,请参阅 GitHub 上的 Set up driver permission

eksctl

如果使用容器组身份

使用 eksctl 运行以下命令来创建 IAM 角色和容器组身份关联。将 my-cluster 替换为您的值。

export cluster_name=my-cluster # Create the controller role eksctl create podidentityassociation \ --service-account-name efs-csi-controller-sa \ --namespace kube-system \ --cluster $cluster_name \ --role-name AmazonEKS_EFS_CSI_ControllerRole \ --permission-policy-arns arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy # Create the node role eksctl create podidentityassociation \ --service-account-name efs-csi-node-sa \ --namespace kube-system \ --cluster $cluster_name \ --role-name AmazonEKS_EFS_CSI_NodeRole \ --permission-policy-arns arn:aws-cn:iam::aws:policy/AmazonS3ReadOnlyAccess,arn:aws-cn:iam::aws:policy/AmazonElasticFileSystemsUtils

如果对服务账户使用 IAM 角色

使用 eksctl 运行以下命令来创建 IAM 角色。将 my-cluster 替换为您的集群名称,并将 region-code 替换为您的 Amazon 区域代码。

export cluster_name=my-cluster export region_code=region-code # Create the controller role export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole eksctl create iamserviceaccount \ --name efs-csi-controller-sa \ --namespace kube-system \ --cluster $cluster_name \ --role-name $controller_role_name \ --attach-policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \ --approve \ --region $region_code # Create the node role export node_role_name=AmazonEKS_EFS_CSI_NodeRole eksctl create iamserviceaccount \ --name efs-csi-node-sa \ --namespace kube-system \ --cluster $cluster_name \ --role-name $node_role_name \ --attach-policy-arn arn:aws-cn:iam::aws:policy/AmazonS3ReadOnlyAccess \ --attach-policy-arn arn:aws-cn:iam::aws:policy/AmazonElasticFileSystemsUtils \ --approve \ --region $region_code

Amazon Web Services 管理控制台

使用 Amazon Web Services 管理控制台 运行以下命令以创建 IAM 角色。

  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 在左侧导航窗格中,选择 Roles(角色)。

  3. Roles(角色)页面上,选择 Create role(创建角色)。

  4. Select trusted entity(选择受信任的实体)页面上,请执行以下操作:

    1. 如果使用 EKS 容器组身份:

      1. 可信实体类型部分中,选择 Amazon 服务

      2. 服务或应用场景下拉列表中,选择 EKS

      3. 应用场景部分中,选择 EKS – 容器组身份

      4. 选择下一步

    2. 如果对服务账户使用 IAM 角色:

      1. Trusted entity type(受信任的实体类型)部分中,选择 Web identity(Web 身份)。

      2. 对于 Identity provider(身份提供商),为您的集群选择 OpenID Connect provider URL(OpenID Connect 提供程序 URL)(如 Amazon EKS 中的 Overview(概述)下所示)。

      3. 对于 Audience (受众),请选择 sts.amazonaws.com

      4. 选择下一步

  5. Add permissions(添加权限)页面上,请执行以下操作:

    1. Filter policies (筛选器策略) 框中,输入 AmazonS3FilesCSIDriverPolicy

    2. 选中搜索返回的策略左侧的复选框。

    3. 选择下一步

  6. Name, review, and create(命名、查看和创建)页面中,请执行以下操作:

    1. 对于 Role name(角色名称),请为角色输入唯一名称,例如 AmazonEKS_EFS_CSI_ControllerRole

    2. 添加标签(可选)下,将标签作为键值对附加,以将元数据添加到角色。有关在 IAM 中使用标签的更多信息,请参阅《IAM 用户指南》 中的标记 IAM 资源

    3. 选择创建角色

  7. 创建角色后:

    1. 如果使用 EKS 容器组身份:

      1. 打开 Amazon EKS 控制台

      2. 在左侧导航窗格中,选择集群,然后为您要配置 EKS 容器组身份关联的集群选择名称。

      3. 选择访问选项卡。

      4. 容器组身份关联中,选择创建

      5. 选择 IAM 角色下拉列表,然后选择您新创建的角色。

      6. 选择 Kubernetes 命名空间字段并输入 kube-system

      7. 选择 Kubernetes 服务账户字段并输入 efs-csi-controller-sa

      8. 选择创建

      9. 有关创建容器组身份关联的更多信息,请参阅创建容器组身份关联(Amazon 控制台)

      10. 重复上述步骤,为节点服务账户创建第二个角色。在添加权限页面上,改为附加 AmazonS3ReadOnlyAccessAmazonElasticFileSystemsUtils。然后为 Kubernetes 服务账户字段创建与 efs-csi-node-sa 的容器组身份关联。

    2. 如果对服务账户使用 IAM 角色:

      1. 选择要打开进行编辑的角色。

      2. 选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。

      3. 该行看起来类似于以下行:

        "oidc.eks.region-code.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com"

        将以下行添加到上一行的上方。将 <region-code> 替换为集群所在的 Amazon 区域。将 <EXAMPLED539D4633E53DE1B71EXAMPLE> 替换为集群的 OIDC 提供者 ID。

        "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa",
      4. 选择 Update policy(更新策略)以完成操作。

      5. 重复上述步骤,为节点服务账户创建第二个角色。在添加权限页面上,改为附加 AmazonS3ReadOnlyAccessAmazonElasticFileSystemsUtils。在信任策略中,使用 efs-csi-node-sa 作为 :sub 条件值。

Amazon CLI

使用 Amazon CLI 运行以下命令来创建 IAM 角色。

如果使用容器组身份

  1. 创建向 pods.eks.amazonaws.com 服务授予 AssumeRoleTagSession 操作权限的 IAM 角色。

    1. 将以下内容复制到名为 aws-efs-csi-driver-trust-policy-pod-identity.json 的文件中。

      { "Version":"2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
    2. 创建角色。将 my-cluster 替换为您的集群名称。

      export cluster_name=my-cluster export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole aws iam create-role \ --role-name $controller_role_name \ --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
  2. 将所需的 Amazon 托管策略附加到控制器角色。

    aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \ --role-name $controller_role_name
  3. 使用相同的信任策略创建节点 IAM 角色。

    export node_role_name=AmazonEKS_EFS_CSI_NodeRole aws iam create-role \ --role-name $node_role_name \ --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
  4. 将所需的 Amazon 托管式策略附加到节点角色。

    aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/AmazonS3ReadOnlyAccess \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/AmazonElasticFileSystemsUtils \ --role-name $node_role_name
  5. 运行以下命令来创建容器组身份关联。请将 <111122223333> 替换为您的账户 ID。

    aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/$controller_role_name --namespace kube-system --service-account efs-csi-controller-sa
    aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/$node_role_name --namespace kube-system --service-account efs-csi-node-sa
  6. 有关创建容器组身份关联的更多信息,请参阅创建容器组身份关联(Amazon 控制台)

如果对服务账户使用 IAM 角色

  1. 查看集群的 OIDC 提供者 URL。将 my-cluster 替换为您的集群名称。

    export cluster_name=my-cluster aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text

    示例输出如下。

    https://oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>

    如果命令的输出为 None,请查看先决条件

  2. 为控制器服务账户创建 IAM 角色。

    1. 将以下内容复制到名为 controller-trust-policy.json 的文件中。请将 <111122223333> 替换为您的账户 ID。将 <EXAMPLED539D4633E53DE1B71EXAMPLE><region-code> 替换为在上一步中返回的值。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::<111122223333>:oidc-provider/oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com", "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] }
    2. 创建角色。

      export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole aws iam create-role \ --role-name $controller_role_name \ --assume-role-policy-document file://"controller-trust-policy.json"
  3. 将所需的 Amazon 托管策略附加到控制器角色。

    aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \ --role-name $controller_role_name
  4. 为节点服务账户创建 IAM 角色。

    1. 将以下内容复制到名为 node-trust-policy.json 的文件中。请将 <111122223333> 替换为您的账户 ID。将 <EXAMPLED539D4633E53DE1B71EXAMPLE><region-code> 替换为在步骤 1 中返回的值。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::<111122223333>:oidc-provider/oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-node-sa", "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com" } } } ] }
    2. 创建角色。

      export node_role_name=AmazonEKS_EFS_CSI_NodeRole aws iam create-role \ --role-name $node_role_name \ --assume-role-policy-document file://"node-trust-policy.json"
  5. 将所需的 Amazon 托管式策略附加到节点角色。

    aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/AmazonS3ReadOnlyAccess \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::aws:policy/AmazonElasticFileSystemsUtils \ --role-name $node_role_name
注意

AmazonS3ReadOnlyAccess 策略授予对所有 S3 存储桶的读取权限。要限制对特定存储桶的访问,您可以将其分离并替换为基于标签的内联策略。有关详细信息,请参阅 GitHub 上的 Amazon EFS CSI 驱动程序 IAM 策略文档

第 2 步:获取 Amazon EFS CSI 驱动程序

我们建议您通过 Amazon EKS 附加组件方式来安装 Amazon EFS CSI 驱动程序。要将 Amazon EKS 附加组件添加到您的集群,请参阅 创建 Amazon EKS 附加组件。有关附加组件的更多信息,请参阅 Amazon EKS 附加组件。如果您无法使用 Amazon EKS 附加组件,我们鼓励您向容器路线图 GitHub 存储库提交有关您为什么无法使用的问题。

重要

在将 Amazon EFS 驱动程序添加为 Amazon EKS 附加组件之前,请确认集群上没有安装该驱动程序的自行管理版本。如果安装了这样的版本,请参阅 GitHub 上的 Uninstalling the Amazon EFS CSI Driver

如果要对 Amazon EFS CSI 驱动程序进行自主管理型安装,请参阅 GitHub 上的 Installation

步骤 3:创建 Amazon S3 文件系统

要创建 Amazon S3 文件系统,请参阅 GitHub 上的 Create an Amazon S3 file system for Amazon EKS

第 4 步:部署示例应用程序

您可以部署各种示例应用程序并根据需要对其进行修改。有关更多信息,请参阅 GitHub 上的示例