

 **帮助改进此页面** 

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

# 部署适用于 Amazon S3 的 Mountpoint 驱动程序
<a name="s3-csi-create"></a>

借助[适用于 Amazon S3 的 Mountpoint 容器存储接口（CSI）驱动程序](https://github.com/awslabs/mountpoint-s3-csi-driver)，您的 Kubernetes 应用程序可以通过文件系统接口访问 Amazon S3 对象，从而在不更改任何应用程序代码的情况下实现高聚合吞吐量。

此过程将演示如何部署[适用于 Amazon S3 的 Mountpoint CSI Amazon EKS 驱动程序](s3-csi.md)。在继续操作之前，请查看[注意事项](s3-csi.md#s3-csi-considerations)。

## 先决条件
<a name="s3-csi-prereqs"></a>
+ 适用于集群的现有 AWS Identity and Access Management（IAM）OpenID Connect（OIDC）提供者。要确定您是否已经拥有一个或是否要创建一个，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 您的设备或 AWS CloudShell 上安装并配置了 2.12.3 或更高版本的 AWS CLI。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 步骤 1：创建 IAM policy
<a name="s3-create-iam-policy"></a>

适用于 Amazon S3 的 Mountpoint CSI 驱动程序需要 Amazon S3 权限才能与文件系统交互。本节将介绍如何创建 IAM 策略来授予必要的权限。

以下示例策略遵循 Mountpoint 的 IAM 权限建议。您也可以使用 AWS 托管式策略 [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor)，但此托管式策略授予的权限超出了 Mountpoint 所需的权限。

有关 Mountpoint 建议权限的更多信息，请参阅 GitHub 上的 [Mountpoint IAM permissions](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#iam-permissions)。

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

1. 在左侧导航窗格中，选择 **Policies（策略）**。

1. 在**策略**页面上，选择**创建策略**。

1. 对于**策略编辑器**，选择 **JSON**。

1. 在**策略编辑器**下，复制并粘贴以下内容：
**重要**  
将 `amzn-s3-demo-bucket1` 替换为您自己的 Amazon S3 存储桶名称。

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
           {
               "Sid": "MountpointFullBucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1"
               ]
           },
           {
               "Sid": "MountpointFullObjectAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:AbortMultipartUpload",
                   "s3:DeleteObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1/*"
               ]
           }
      ]
   }
   ```

   与 Amazon S3 Express One Zone 存储类一起推出的目录存储桶，使用不同于一般用途存储桶的身份验证机制。您应该使用 `s3express:CreateSession` 操作，而非使用 `s3:*` 操作。有关目录存储桶的更多信息，请参阅*《Amazon S3 用户指南》*中的[目录存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)。

   以下是您将对目录存储桶使用的最低权限策略的示例。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3express:CreateSession",
               "Resource": "arn:aws:s3express:us-west-2:111122223333:bucket/amzn-s3-demo-bucket1--usw2-az1--x-s3"
           }
       ]
   }
   ```

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

1. 在**查看和创建**页面上，为您的策略命名。此示例演练使用名称 `AmazonS3CSIDriverPolicy`。

1. 选择**创建策略**。

## 步骤 2：创建 IAM 角色
<a name="s3-create-iam-role"></a>

适用于 Amazon S3 的 Mountpoint CSI 驱动程序需要 Amazon S3 权限才能与文件系统交互。本节将介绍如何创建 IAM 角色来委派这些权限。要创建此角色，您可以使用以下工具之一：
+  [eksctl](#eksctl_s3_store_app_data) 
+  [AWS 管理控制台](#console_s3_store_app_data) 
+  [AWS CLI](#awscli_s3_store_app_data) 

**注意**  
在上一节中创建了 IAM 策略 `AmazonS3CSIDriverPolicy`。

### eksctl
<a name="eksctl_s3_store_app_data"></a>

 **使用 `eksctl` 创建适用于 Amazon S3 的 Mountpoint CSI 驱动程序 IAM 角色** 

要创建 IAM 角色和 Kubernetes 服务账户，请运行以下命令。这些命令还会将 `AmazonS3CSIDriverPolicy` IAM 策略附加到角色，使用 IAM 角色的 Amazon 资源名称（ARN）对 Kubernetes 服务账户 (`s3-csi-controller-sa`) 进行注释，并将 Kubernetes 服务账户名称添加到 IAM 角色的信任策略。

```
CLUSTER_NAME=my-cluster
REGION=region-code
ROLE_NAME=AmazonEKS_S3_CSI_DriverRole
POLICY_ARN=AmazonEKS_S3_CSI_DriverRole_ARN
eksctl create iamserviceaccount \
    --name s3-csi-driver-sa \
    --namespace kube-system \
    --cluster $CLUSTER_NAME \
    --attach-policy-arn $POLICY_ARN \
    --approve \
    --role-name $ROLE_NAME \
    --region $REGION \
    --role-only
```

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

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

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

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

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

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

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

      如果未显示 URL，请查看[先决条件](#s3-csi-prereqs)部分。

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

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

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

   1. 在**筛选策略**框中，输入 AmazonS3CSIDriverPolicy。
**注意**  
在上一节中创建了此策略。

   1. 选中搜索返回的 `AmazonS3CSIDriverPolicy` 结果左侧的复选框。

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

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

   1. 在**角色名称**中为角色输入唯一名称，例如 AmazonEKS\$1S3\$1CSI\$1DriverRole。

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

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

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:s3-csi-driver-sa"
   ```

1. 确保将 `Condition` 运算符设置为 `"StringEquals"`。

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

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

1. 查看集群的 OIDC 提供者 URL。将 *my-cluster* 替换为您的集群的名称。如果命令的输出为 `None`，请查看[先决条件](#s3-csi-prereqs)。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
   ```

   示例输出如下。

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

1. 创建 IAM 角色，向 Kubernetes 服务账户授予 `AssumeRoleWithWebIdentity` 操作权限。

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

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

   1. 创建角色。您可以将 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 更改为其它名称，但如果更改，请确保在后续步骤中也做出相应更改。

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

1. 使用以下命令将之前创建的 IAM 策略附加到角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonS3CSIDriverPolicy \
     --role-name AmazonEKS_S3_CSI_DriverRole
   ```
**注意**  
在上一节中创建了 IAM 策略 `AmazonS3CSIDriverPolicy`。

1. 如果您将驱动程序作为 Amazon EKS 附加组件安装，则跳过此步骤。对于驱动程序自主管理型安装，请创建 Kubernetes 服务账户并使用创建的 IAM 角色的 ARN 进行注释。

   1. 将以下内容保存到名为 `mountpoint-s3-service-account.yaml` 的文件中。请将 *111122223333* 替换为您的账户 ID。

      ```
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/name: aws-mountpoint-s3-csi-driver
        name: mountpoint-s3-csi-controller-sa
        namespace: kube-system
        annotations:
          eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
      ```

   1. 在集群上创建 Kubernetes 服务账户。使用您创建的名为 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 的 IAM 角色对 Kubernetes 服务账户 (`mountpoint-s3-csi-controller-sa`) 进行注释。

      ```
      kubectl apply -f mountpoint-s3-service-account.yaml
      ```
**注意**  
在此过程中部署插件后，系统会创建一个名为 `s3-csi-driver-sa` 的服务账户，并将其配置为使用该服务账户。

## 第 3 步：安装适用于 Amazon S3 的 Mountpoint CSI 驱动程序
<a name="s3-install-driver"></a>

您可以通过 Amazon EKS 附加组件，安装适用于 Amazon S3 的 Mountpoint CSI 驱动程序。您可以使用以下工具将附加组件添加到您的集群。
+  [eksctl](#eksctl_s3_add_store_app_data) 
+  [AWS 管理控制台](#console_s3_add_store_app_data) 
+  [AWS CLI](#awscli_s3_add_store_app_data) 

您也可以将适用于 Amazon S3 的 Mountpoint CSI 驱动程序作为自主管理型安装进行安装。有关执行自主管理型安装的说明，请参阅 GitHub 上的 [Installation](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/docs/install.md#deploy-driver)。

从 `v1.8.0` 开始，您可以为 CSI 驱动程序的容器组（pod）配置可容忍的污点。为此，要么使用 `node.tolerations` 指定一组要容忍的自定义污点，要么使用 `node.tolerateAllTaints` 容忍所有污点。有关更多信息，请参阅 Kubernetes 文档中的 [Taints and Tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。

### eksctl
<a name="eksctl_s3_add_store_app_data"></a>

 **使用 `eksctl` 添加 Amazon S3 CSI 附加组件** 

运行如下命令。将 *my-cluster* 替换为您的集群的名称，将 *111122223333* 替换为您的账户 ID，并将 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 替换为[之前创建的 IAM 角色](#s3-create-iam-role)的名称。

```
eksctl create addon --name aws-mountpoint-s3-csi-driver --cluster my-cluster \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole --force
```

如果您删除 *--force* 选项，并且任何 Amazon EKS 附加组件设置与您的现有设置冲突，那么更新 Amazon EKS 附加组件将会失败，而且您会收到一条帮助您解决冲突的错误消息。在指定此选项之前，请确保 Amazon EKS 附加组件不会管理您需要管理的设置，因为这些设置会被此选项覆盖。有关此设置其他选项的更多信息，请参阅 `eksctl` 文档中的 [Addons](https://eksctl.io/usage/addons/)（附加组件）。有关 Amazon EKS kubernetes 字段管理的更多信息，请参阅[确定可以为 Amazon EKS 附加组件自定义的字段](kubernetes-field-management.md)。

您可以通过配置文件对 `eksctl` 进行自定义。有关更多信息，请参阅 `eksctl` 文档中的[使用配置值](https://eksctl.io/usage/addons/#working-with-configuration-values)。以下示例演示了如何容忍所有污点。

```
# config.yaml
...

addons:
- name: aws-mountpoint-s3-csi-driver
  serviceAccountRoleARN: arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
  configurationValues: |-
    node:
      tolerateAllTaints: true
```

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

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

1. 在左侧导航窗格中，选择**集群**。

1. 选择要为其配置适用于 Amazon S3 的 Mountpoint CSI 附加组件的集群名称。

1. 选择**附加组件**选项卡。

1. 选择**获取更多附加组件**。

1. 在**选择附加组件**页面上，执行以下操作：

   1. 在 **Amazon EKS 附加组件**部分中，选中**适用于 Amazon S3 的 Mountpoint CSI 驱动程序**复选框。

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

1. 在**配置选定的附加组件设置**页面上，执行以下操作：

   1. 选择您想使用的**版本**。

   1. 对于**选择 IAM 角色**，选择要将适用于 Amazon S3 的 Mountpoint CSI 驱动程序 IAM 策略附加到的 IAM 角色的名称。

   1. （可选）展开**可选配置设置**后，更新**冲突解决方法**。如果选择**覆盖**，则可能用 Amazon EKS 附加组件设置覆盖现有附加组件的一个或多个设置。如果不启用此选项，并且与现有设置存在冲突，则操作将失败。您可以使用生成的错误消息对冲突进行故障排除。在选择此选项之前，请确保 Amazon EKS 附加组件不会管理您需要自行管理的设置。

   1. （可选）展开**可选配置设置**后，在**配置值**字段中配置容忍度。

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

1. 在**查看和添加**页面上，选择**创建**。附加组件安装完成后，您将看到已安装的附加组件。

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

 **使用 AWS CLI 添加适用于 Amazon S3 的 Mountpoint CSI 附加组件** 

运行如下命令。将 *my-cluster* 替换为您的集群的名称，将 *111122223333* 替换为您的账户 ID，并将 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 替换为之前创建的 IAM 角色的名称。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
```

您可以使用 `--configuration-values` 标志自定义命令。以下替代示例演示了如何容忍所有污点。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole \
  --configuration-values '{"node":{"tolerateAllTaints":true}}'
```

## 第 4 步：配置适用于 Amazon S3 的 Mountpoint
<a name="s3-configure-mountpoint"></a>

在大多数情况下，您可以仅使用存储桶名称来配置适用于 Amazon S3 的 Mountpoint。有关配置适用于 Amazon S3 的 Mountpoint 的说明，请参阅 GitHub 上的 [Configuring Mountpoint for Amazon S3](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md)。

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

您可以将静态预置部署到现有 Amazon S3 存储桶上的驱动程序。有关更多信息，请参阅 GitHub 上的 [Static provisioning](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/examples/kubernetes/static_provisioning/README.md)。