

 **帮助改进此页面** 

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

# 将 Amazon S3 文件系统存储与 Amazon EFS CSI 驱动程序配合使用
<a name="s3files-csi"></a>

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

## 注意事项
<a name="s3files-csi-considerations"></a>
+ Amazon EFS CSI 驱动程序与基于 Windows 的容器映像不兼容。
+ EKS Fargate 不支持 S3 Files。
+ Amazon EFS CSI 驱动程序与 Amazon EKS 混合节点功能不兼容。
+ Amazon EFS CSI 驱动程序从版本 [3.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-3.x.md#v300) 开始支持 Amazon S3 Files。

## 先决条件
<a name="s3files-csi-prereqs"></a>
+ Amazon EFS CSI 驱动程序需要 Amazon Identity and Access Management（IAM）权限。
  +  Amazon 建议使用 EKS 容器组身份。有关更多信息，请参阅 [EKS 容器组身份设置概述](pod-identities.md#pod-id-setup-overview)。
  + 有关服务账户的 IAM 角色以及为您的集群设置 IAM OpenID Connect（OIDC）提供者的信息，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 在您的设备或 Amazon CloudShell 上安装和配置 Amazon 命令行界面（Amazon CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本，请参阅《Amazon 命令行界面用户指南》**中的[安装](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《Amazon CloudShell 用户指南》**中的[将 Amazon CLI 安装到您的主目录](https://docs.amazonaws.cn/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 Amazon CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 步骤 1：创建 IAM 角色
<a name="s3files-create-iam-resources"></a>

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 存储，则必须将 `AmazonS3FilesCSIDriverPolicy` 和 `AmazonEFSCSIDriverPolicy` 托管式策略同时附加到控制器角色。有关 Amazon EFS 存储的更多信息，请参阅 [将弹性文件系统存储与 Amazon EFS 结合使用](efs-csi.md)。

要实现此过程，可以使用以下过程之一：
+  [`eksctl`](#eksctl_s3files_store_app_data) 
+  [Amazon Web Services 管理控制台](#console_s3files_store_app_data) 
+  [Amazon CLI](#awscli_s3files_store_app_data) 

**注意**  
此过程中的具体步骤是为将驱动程序用作 Amazon EKS 附加组件而编写的。有关自主管理型安装的详细信息，请参阅 GitHub 上的 [Set up driver permission](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md#set-up-driver-permission)。

### `eksctl`
<a name="eksctl_s3files_store_app_data"></a>

#### 如果使用容器组身份
<a name="s3files-eksctl-pod-identities"></a>

使用 `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 角色
<a name="s3files-eksctl-irsa"></a>

使用 `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 管理控制台
<a name="console_s3files_store_app_data"></a>

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

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

1. 在左侧导航窗格中，选择 **Roles**（角色）。

1. 在 **Roles**（角色）页面上，选择 **Create role**（创建角色）。

1. 在 **Select trusted entity**（选择受信任的实体）页面上，请执行以下操作：

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

      1. 在**可信实体类型**部分中，选择 **Amazon 服务**。

      1. 在**服务或应用场景**下拉列表中，选择 **EKS**。

      1. 在**应用场景**部分中，选择 **EKS – 容器组身份**。

      1. 选择**下一步**。

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

      1. 在 **Trusted entity type**（受信任的实体类型）部分中，选择 **Web identity**（Web 身份）。

      1. 对于 **Identity provider**（身份提供商），为您的集群选择 **OpenID Connect provider URL**（OpenID Connect 提供程序 URL）（如 Amazon EKS 中的 **Overview**（概述）下所示）。

      1. 对于 **Audience (受众)**，请选择 `sts.amazonaws.com`。

      1. 选择**下一步**。

1. 在 **Add permissions**（添加权限）页面上，请执行以下操作：

   1. 在 **Filter policies (筛选器策略)** 框中，输入 `AmazonS3FilesCSIDriverPolicy`。

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

   1. 选择**下一步**。

1. 在 **Name, review, and create**（命名、查看和创建）页面中，请执行以下操作：

   1. 对于 **Role name**（角色名称），请为角色输入唯一名称，例如 `AmazonEKS_EFS_CSI_ControllerRole`。

   1. 在**添加标签（可选）**下，将标签作为键值对附加，以将元数据添加到角色。有关在 IAM 中使用标签的更多信息，请参阅《IAM 用户指南》** 中的[标记 IAM 资源](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_tags.html)。

   1. 选择**创建角色**。

1. 创建角色后：

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

      1. 打开 [Amazon EKS 控制台](https://console.amazonaws.cn/eks/home#/clusters)。

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

      1. 选择**访问**选项卡。

      1. 在**容器组身份关联**中，选择**创建**。

      1. 选择 **IAM 角色**下拉列表，然后选择您新创建的角色。

      1. 选择 **Kubernetes 命名空间**字段并输入 `kube-system`。

      1. 选择 **Kubernetes 服务账户**字段并输入 `efs-csi-controller-sa`。

      1. 选择**创建**。

      1. 有关创建容器组身份关联的更多信息，请参阅[创建容器组身份关联（Amazon 控制台）](pod-id-association.md#pod-id-association-create)。

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

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

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

      1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

      1. 该行看起来类似于以下行：

         ```
         "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",
         ```

      1. 选择 **Update policy**（更新策略）以完成操作。

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

### Amazon CLI
<a name="awscli_s3files_store_app_data"></a>

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

#### 如果使用容器组身份
<a name="s3files-cli-pod-identities"></a>

1. 创建向 `pods.eks.amazonaws.com` 服务授予 `AssumeRole` 和 `TagSession` 操作权限的 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"
                  ]
              }
          ]
      }
      ```

   1. 创建角色。将 *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"
      ```

1. 将所需的 Amazon 托管策略附加到控制器角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \
     --role-name $controller_role_name
   ```

1. 使用相同的信任策略创建节点 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"
   ```

1. 将所需的 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
   ```

1. 运行以下命令来创建容器组身份关联。请将 `<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
   ```

1. 有关创建容器组身份关联的更多信息，请参阅[创建容器组身份关联（Amazon 控制台）](pod-id-association.md#pod-id-association-create)。

#### 如果对服务账户使用 IAM 角色
<a name="s3files-cli-irsa"></a>

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`，请查看**先决条件**。

1. 为控制器服务账户创建 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"
                      }
                  }
              }
          ]
      }
      ```

   1. 创建角色。

      ```
      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"
      ```

1. 将所需的 Amazon 托管策略附加到控制器角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \
     --role-name $controller_role_name
   ```

1. 为节点服务账户创建 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"
                      }
                  }
              }
          ]
      }
      ```

   1. 创建角色。

      ```
      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"
      ```

1. 将所需的 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 策略文档](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/iam-policy-create.md)。

## 第 2 步：获取 Amazon EFS CSI 驱动程序
<a name="s3files-install-driver"></a>

我们建议您通过 Amazon EKS 附加组件方式来安装 Amazon EFS CSI 驱动程序。要将 Amazon EKS 附加组件添加到您的集群，请参阅 [创建 Amazon EKS 附加组件](creating-an-add-on.md)。有关附加组件的更多信息，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。如果您无法使用 Amazon EKS 附加组件，我们鼓励您向[容器路线图 GitHub 存储库](https://github.com/aws/containers-roadmap/issues)提交有关您为什么无法使用的问题。

**重要**  
在将 Amazon EFS 驱动程序添加为 Amazon EKS 附加组件之前，请确认集群上没有安装该驱动程序的自行管理版本。如果安装了这样的版本，请参阅 GitHub 上的 [Uninstalling the Amazon EFS CSI Driver](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md#uninstalling-the-amazon-efs-csi-driver)。

如果要对 Amazon EFS CSI 驱动程序进行自主管理型安装，请参阅 GitHub 上的 [Installation](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md)。

## 步骤 3：创建 Amazon S3 文件系统
<a name="s3files-create-filesystem"></a>

要创建 Amazon S3 文件系统，请参阅 GitHub 上的 [Create an Amazon S3 file system for Amazon EKS](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/s3files-create-filesystem.md)。

## 第 4 步：部署示例应用程序
<a name="s3files-sample-app"></a>

您可以部署各种示例应用程序并根据需要对其进行修改。有关更多信息，请参阅 GitHub 上的[示例](https://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes)。