

 **帮助改进此页面** 

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

# 将弹性文件系统存储与 Amazon EFS 结合使用
<a name="efs-csi"></a>

 [Amazon Elastic File System](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)（Amazon EFS）提供无服务器的完全弹性文件存储，因此，您无需预置或管理存储容量和性能，即可共享文件数据。[Amazon EFS 容器存储接口（CSI）驱动程序](https://github.com/kubernetes-sigs/aws-efs-csi-driver)允许在 AWS 上运行的 Kubernetes 集群将 Amazon EFS 文件系统作为永久卷挂载。本主题介绍了如何部署 Amazon EFS CSI 驱动程序到您的 Amazon EKS 集群。

## 注意事项
<a name="efs-csi-considerations"></a>
+ Amazon EFS CSI 驱动程序与基于 Windows 的容器映像不兼容。
+ 不能将持久性卷的[动态预置](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/dynamic_provisioning/README.md)与 Fargate 节点结合使用，但可以使用[静态预置](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/static_provisioning/README.md)。
+  [动态预置](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/dynamic_provisioning/README.md)需要 [1.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v12) 或更高版本的驱动程序。您可以在任何支持的 Amazon EKS 集群版本上通过 `1.1` 版本的驱动程序，对持久性卷使用[静态预置](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/static_provisioning/README.md)（请参阅 [Amazon EKS 支持的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)）。
+ 此驱动程序的 [1.3.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v132) 版或更高版本支持 Arm64 架构，包括基于 Amazon EC2 Graviton 的实例。
+ 版本 [1.4.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v142) 或更高版本的此驱动程序支持使用 FIPS 装载文件系统。
+ 注意 Amazon EFS 的资源配额。有关更多信息，请参阅 [Amazon EFS 配额](https://docs.aws.amazon.com/efs/latest/ug/limits.html)。
+ 从 [2.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-2.x.md#v200) 版本开始，此驱动程序使用 `stunnel` 切换到 `efs-proxy` 进行 TLS 连接。使用 `efs-proxy` 时，它将打开多个线程，其数量等于一加上它正在运行的节点的内核数。
+ Amazon EFS CSI 驱动程序与 Amazon EKS 混合节点功能不兼容。

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

**注意**  
Fargate 上运行的容器组（pod）会自动挂载 Amazon EFS 文件系统，无需手动执行驱动程序安装步骤。

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

Amazon EFS CSI 驱动程序需要 IAM 权限才能与您的文件系统进行交互。创建 IAM 角色并向其附加 ` arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy` 托管式策略。

**注意**  
如果要同时使用 Amazon EFS 和 Amazon S3 文件系统存储，则必须将 `AmazonEFSCSIDriverPolicy` 和 `AmazonS3FilesCSIDriverPolicy` 托管式策略同时附加到 IAM 角色。有关 Amazon S3 文件系统存储的更多信息，请参阅 [将 Amazon S3 文件系统存储与 Amazon EFS CSI 驱动程序配合使用](s3files-csi.md)。

要实现此过程，可以使用以下过程之一：
+  [`eksctl`](#eksctl_efs_store_app_data) 
+  [AWS 管理控制台](#console_efs_store_app_data) 
+  [AWS CLI](#awscli_efs_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_efs_store_app_data"></a>

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

使用 `eksctl` 运行以下命令以创建 IAM 角色和容器组身份。将 `my-cluster` 替换为您的集群名称。您也可以将 `AmazonEKS_EFS_CSI_DriverRole` 替换为其他名称。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --permission-policy-arns arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy
```

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

使用 `eksctl` 运行以下命令以创建 IAM 角色。将 `my-cluster` 替换为您的集群名称。您也可以将 `AmazonEKS_EFS_CSI_DriverRole` 替换为其他名称。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --output json --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"
```

### AWS 管理控制台
<a name="console_efs_store_app_data"></a>

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

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

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

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

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

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

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

      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 (筛选器策略)** 框中，输入 `AmazonEFSCSIDriverPolicy`。

   1. 选中搜索返回的 `AmazonEFSCSIDriverPolicy` 左侧的复选框。

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

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

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

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

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

1. 创建角色后：

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

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

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

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

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

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

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

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

      1. 选择**创建**。

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

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

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

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

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

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

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

         ```
         "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-*",
         ```

      1. 将 `Condition` 运算符从 `"StringEquals"` 修改为 `"StringLike"`。

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

### AWS CLI
<a name="awscli_efs_store_app_data"></a>

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

#### 如果使用容器组身份
<a name="efs-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` 替换为您的集群名称。您也可以将 `AmazonEKS_EFS_CSI_DriverRole` 替换为其他名称。

      ```
      export cluster_name=my-cluster
      export role_name=AmazonEKS_EFS_CSI_DriverRole
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
      ```

1. 使用以下命令以将所需的 AWS 托管策略附加到角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

1. 运行以下命令以创建容器组身份关联。请将 `<111122223333>` 替换为您的账户 ID。

   ```
   aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/$role_name --namespace kube-system --service-account efs-csi-controller-sa
   ```

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

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

1. 查看集群的 OIDC 提供者 URL。将 `my-cluster` 替换为您的集群名称。您也可以将 `AmazonEKS_EFS_CSI_DriverRole` 替换为其他名称。

   ```
   export cluster_name=my-cluster
   export role_name=AmazonEKS_EFS_CSI_DriverRole
   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. 创建授予 `AssumeRoleWithWebIdentity` 操作权限的 IAM 角色。

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

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. 创建角色。

      ```
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
      ```

1. 使用以下命令以将所需的 AWS 托管策略附加到角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

## 第 2 步：获取 Amazon EFS CSI 驱动程序
<a name="efs-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 EFS 文件系统
<a name="efs-create-filesystem"></a>

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

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

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