

 **帮助改进此页面** 

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

# 将 Kubernetes 卷存储与 Amazon EBS 结合使用
Amazon EBS

**注意**  
 **新增：**Amazon EKS 自动模式可自动执行块存储例行任务。了解如何[将示例有状态工作负载部署到 EKS 自动模式](sample-storage-workload.md)。

[Amazon Elastic Block Store（Amazon EBS）Container Storage Interface（CSI）驱动程序](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/)管理作为您所创建 Kubernetes 卷存储的 Amazon EBS 卷的生命周期。Amazon EBS CSI 驱动程序为以下类型的 Kubernetes 卷制作 Amazon EBS 卷：通用[临时卷](https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/)和[持久性卷](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)。

## 注意事项

+ 您无需在 EKS 自动模式集群上安装 Amazon EBS CSI 控制器。
+ 您无法将 Amazon EBS 卷挂载到 Fargate 容器组（pod）。
+ 您可以在 Fargate 节点上运行 Amazon EBS CSI 控制器，但要在 Amazon EBS CSI 节点 `DaemonSet` 只能在 Amazon EC2 实例上运行。
+ Amazon EBS 卷和 Amazon EBS CSI 驱动程序与 Amazon EKS 混合节点功能不兼容。
+ 将为最新的附加组件版本和一个先前版本提供支持。在最新版本中发现的错误或漏洞将在新的次要版本中向后移植到先前的版本。
+ EKS 自动模式需要存储类使用 `ebs.csi.eks.amazonaws.com` 作为置备程序。标准 Amazon EBS CSI 驱动程序 (`ebs.csi.aws.com`) 单独管理自己的卷。要在 EKS 自动模式下使用现有卷，请使用卷快照将其迁移到使用自动模式置备程序的存储类。

**重要**  
要使用 Amazon EBS CSI 驱动程序的快照功能，必须先安装 CSI 快照控制器。有关更多信息，请参阅 [为 CSI 卷启用快照功能](csi-snapshot-controller.md)。

## 先决条件

+ 现有集群。要查看所需的平台版本，请运行以下命令。

  ```
  aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  ```
+ EBS CSI 驱动程序需要 Amazon IAM 权限。
  +  Amazon 建议使用 EKS 容器组身份。有关更多信息，请参阅 [EKS 容器组身份设置概述](pod-identities.md#pod-id-setup-overview)。
  + 有关服务账户 IAM 角色的信息，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。

## 第 1 步：创建 IAM 角色


Amazon EBS CSI 插件需要 IAM 权限才能代表您调用 Amazon API。如果您未完成这些步骤，则在尝试安装附加组件并运行 `kubectl describe pvc` 时，将会显示 `failed to provision volume with StorageClass` 以及 `could not create volume in EC2: UnauthorizedOperation` 错误。有关更多信息，请参阅 GitHub 上的[设置驱动程序权限](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions)。

**注意**  
容器组（pod）将有权访问分配给 IAM 角色的权限，除非您阻止对 IMDS 的访问。有关更多信息，请参阅 [使用最佳实践保护 Amazon EKS 集群](security-best-practices.md)。

以下过程为您演示了如何创建 IAM 角色并向其附加 Amazon 托管策略。要实现此过程，可以使用以下过程之一：
+  [`eksctl`](#eksctl_store_app_data) 
+  [Amazon Web Services 管理控制台](#console_store_app_data) 
+  [Amazon CLI](#awscli_store_app_data) 

**注意**  
您可创建一项权限范围最小化的自主管理型策略。审阅 [https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html) 并创建一项权限精简的自定义 IAM 策略。

**注意**  
此过程中的具体步骤是为将驱动程序用作 Amazon EKS 附加组件而编写的。要将驱动程序用作自行管理的附加组件，需要遵循不同的步骤。有关更多信息，请参阅 GitHub 上的 [Set up driver permissions](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions)。

### `eksctl`


1. 创建 IAM 角色并附加到策略。Amazon 维护 Amazon 托管策略，或者您可创建自己的自定义策略。您可以使用以下命令创建 IAM 角色并将 Amazon 托管策略附加到其上。将 *my-cluster* 替换为您的集群的名称。此命令将部署 Amazon CloudFormation 堆栈，该堆栈将创建 IAM 角色，并会将 IAM 策略附加到该堆栈。

   ```
   eksctl create iamserviceaccount \
           --name ebs-csi-controller-sa \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKS_EBS_CSI_DriverRole \
           --role-only \
           --attach-policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
           --approve
   ```

1. 如果您不使用自定义 [KMS 密钥](https://www.amazonaws.cn/kms/)，可以跳过此步骤。如果在 Amazon EBS 卷上使用一个密钥进行加密，请根据需要自定义 IAM 角色。例如，执行以下操作：

   1. 复制并在新的 `kms-key-for-encryption-on-ebs.json` 文件中粘贴以下代码。将 *custom-key-arn* 替换为自定义 [KMS 密钥 ARN](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 创建策略。您可以将 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 更改为其它名称。但是，如果更改了名称，请确保在后面的步骤中也进行相应的更改。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 使用以下命令将 IAM policy 附加到该角色。请将 *111122223333* 替换为您的账户 ID。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws-cn:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

### Amazon Web Services 管理控制台


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**（概述）下所示）。

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

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

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

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

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

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

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

   1. 对于**角色名称**，为角色输入唯一名称，例如 *AmazonEKS\$1EBS\$1CSI\$1DriverRole*。

   1. 在**添加标签（可选）**下，将标签作为键值对附加，以将元数据添加到角色。有关在 IAM 中使用标签的更多信息，请参阅《IAM 用户指南》** 中的[标记 IAM 资源](https://docs.amazonaws.cn/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* 替换为您的集群所在的 Amazon 区域。将 *EXAMPLED539D4633E53DE1B71EXAMPLE* 替换为您的集群的 OIDC 提供者 ID。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
   ```

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

1. 如果在 Amazon EBS 卷上使用自定义 [KMS 密钥](https://www.amazonaws.cn/kms/)进行加密，请根据需要自定义 IAM 角色。例如，执行以下操作：

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

   1. 在**策略**页面上，选择 **Create a policy (创建策略)**。

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

   1. 将以下代码复制并粘贴到编辑器中，并将 *custom-key-arn* 替换为自定义 [KMS 密钥 ARN](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 选择**下一步：标签**。

   1. 在 **Add tags (Optional)**（添加标签（可选））页面上，选择 **Next: Review**（下一步：审核）。

   1. 在**名称**中，输入策略的唯一名称（例如，*KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*）。

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

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

   1. 在控制台中选择 ***AmazonEKS\$1EBS\$1CSI\$1DriverRole*** 以打开它进行编辑。

   1. 从**添加权限**下拉列表中，选择**附加策略**。

   1. 在**筛选策略**框中，输入 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*。

   1. 选中搜索中返回的 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 左侧的复选框。

   1. 选择**附加策略**。

### Amazon CLI


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

   ```
   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 角色并向其授予 `AssumeRoleWithWebIdentity` 操作。

   1. 将以下内容复制到名为 `aws-ebs-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:aud": "sts.amazonaws.com",
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
                  }
                }
              }
            ]
          }
      ```

   1. 创建角色。您可以将 *AmazonEKS\$1EBS\$1CSI\$1DriverRole* 更改为其它名称。如果更改了名称，请确保在后面的步骤中也进行相应的更改。

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

1. 附加策略。Amazon 维护 Amazon 托管策略，或者您可创建自己的自定义策略。使用以下命令以将 Amazon 托管策略附加到角色。

   ```
   aws iam attach-role-policy \
         --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
         --role-name AmazonEKS_EBS_CSI_DriverRole
   ```

1. 如果在 Amazon EBS 卷上使用自定义 [KMS 密钥](https://www.amazonaws.cn/kms/)进行加密，请根据需要自定义 IAM 角色。例如，执行以下操作：

   1. 复制并在新的 `kms-key-for-encryption-on-ebs.json` 文件中粘贴以下代码。将 *custom-key-arn* 替换为自定义 [KMS 密钥 ARN](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 创建策略。您可以将 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 更改为其它名称。但是，如果更改了名称，请确保在后面的步骤中也进行相应的更改。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 使用以下命令将 IAM policy 附加到该角色。请将 *111122223333* 替换为您的账户 ID。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws-cn:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

现在您已经创建了 Amazon EBS CSI 驱动程序 IAM 角色，可以前往完成下一部分。使用此 IAM 角色部署附加组件后，该附加组件会创建一个名为 `ebs-csi-controller-sa` 的服务账户，并配置为使用该服务账户。服务账户绑定到被分配了所需的 Kubernetes 权限的 Kubernetes `clusterrole`。

## 第 2 步：获取 Amazon EBS CSI 驱动程序


我们建议您通过 Amazon EKS 附加组件来安装 Amazon EBS CSI 驱动程序，从而提高安全性并减少工作量。要将 Amazon EKS 附加组件添加到您的集群，请参阅 [创建 Amazon EKS 附加组件](creating-an-add-on.md)。有关附加组件的更多信息，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。

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

**注意**  
默认情况下，EBS CSI 所使用的 RBAC 角色拥有对节点执行变更操作的权限，以支持其污点移除功能。受限于 Kubernetes RBAC 的机制，该权限同时也允许此角色对集群内的其余节点执行变更操作。Helm 图表中设有一个参数 (`node.serviceAccount.disableMutation`)，可禁用 ebs-csi-node 服务账户的节点变更类 RBAC 权限。启用此参数后，污点移除等驱动功能将无法正常运行。

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

## 第 3 步：部署示例应用程序


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