使用 Amazon EBS 存储 Kubernetes 卷 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

使用 Amazon EBS 存储 Kubernetes 卷

Amazon Elastic Block Store(Amazon EBS)容器存储接口(CSI)驱动程序可管理 Amazon EBS 卷(作为您创建的 Kubernetes 卷的存储)的生命周期。Amazon EBS CSI 驱动程序为以下类型的 Kubernetes 卷制作 Amazon EBS 卷:通用临时卷持久性卷

注意事项

  • 您无法将 Amazon EBS 卷挂载到 Fargate Pods。

  • 您可以在 Fargate 节点上运行 Amazon EBS CSI 控制器,但要在 Amazon EBS CSI 节点 DaemonSet 只能在 Amazon EC2 实例上运行。

重要

要使用 Amazon EBS CSI 驱动程序的快照功能,必须在安装附加组件之前或之后安装外部快照程序。必须按以下顺序安装外部快照程序组件:

有关更多信息,请参阅 GitHub 上的 CSI 快照程序

先决条件

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

    aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  • 集群的现有 AWS Identity and Access Management IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

  • 如果您使用的是集群范围内受限的 PodSecurityPolicy,请确保授予该附加组件足够的权限,以进行部署。有关每个附加组件 Pod 所需的权限,请参阅 GitHub 上的相关附加组件清单定义

步骤 1:创建 IAM 角色

Amazon EBS CSI 插件需要 IAM 权限才能代表您调用 AWS API。如果您未完成这些步骤,则在尝试安装附加组件并运行 kubectl describe pvc 时,将会显示 failed to provision volume with StorageClass 以及 could not create volume in EC2: UnauthorizedOperation 错误。有关更多信息,请参阅 GitHub 上的设置驱动程序权限

注意

Pods 将有权访问分配给 IAM 角色的权限,除非您阻止对 IMDS 的访问。有关更多信息,请参阅 使用最佳实践保护 Amazon EKS 集群

以下过程为您演示了如何创建 IAM 角色并向其附加 AWS 托管策略。您可以使用 eksctl、AWS Management Console或 AWS CLI。

注意

此过程中的具体步骤是为将驱动程序用作 Amazon EKS 附加组件而编写的。要将驱动程序用作自行管理的附加组件,需要遵循不同的步骤。有关更多信息,请参阅 GitHub 上的设置驱动程序权限

eksctl
使用 eksctl 创建 Amazon EBS CSI 插件 IAM 角色
  1. 创建 IAM 角色并附加到策略。AWS 维护 AWS 托管策略,或者您可创建自己的自定义策略。您可以使用以下命令创建 IAM 角色并将 AWS 托管策略附加到其上。将 my-cluster 替换为您的集群名称。此命令将部署 AWS CloudFormation 堆栈,该堆栈将创建 IAM 角色,并会将 IAM policy 附加到该堆栈。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

    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:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve
  2. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 复制并在新的 kms-key-for-encryption-on-ebs.json 文件中粘贴以下代码。将 custom-key-arn 替换为自定义 KMS 密钥 ARN

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-arn"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-arn"] } ] }
    2. 创建 策略。您可以将 KMS_Key_For_Encryption_On_EBS_Policy 更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 使用以下命令将 IAM policy 附加到该角色。请将 111122223333 替换为您的账户 ID。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
AWS Management Console
使用 AWS Management Console 创建 Amazon EBS CSI 插件 IAM 角色
  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

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

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

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

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

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

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

    4. 选择下一步

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

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

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

    3. 选择下一步

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

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

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

    3. 选择 Create role(创建角色)。

  7. 创建角色后,在控制台中选择角色以将其打开进行编辑。

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

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

    "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:ebs-csi-controller-sa"
  10. 选择 Update policy(更新策略)以完成操作。

  11. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 在左侧导航窗格中,选择 Policies(策略)

    2. 策略页面上,选择 Create a policy (创建策略)

    3. 创建策略页面上,选择 JSON 选项卡。

    4. 将以下代码复制并粘贴到编辑器中,并将 custom-key-arn 替换为自定义 KMS 密钥 ARN

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-arn"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-arn"] } ] }
    5. 选择下一步:标签

    6. Add tags (Optional)(添加标签(可选))页面上,选择 Next: Review(下一步:审核)。

    7. 对于 Name(名称),请为您的策略输入唯一的名称(例如 KMS_Key_For_Encryption_On_EBS_Policy)。

    8. 选择创建策略

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

    10. 在控制台中选择 AmazonEKS_EBS_CSI_DriverRole 以打开它进行编辑。

    11. 添加权限下拉列表中,选择附加策略

    12. Filter policies (筛选器策略) 框中,输入 KMS_Key_For_Encryption_On_EBS_Policy

    13. 选中搜索中返回的 KMS_Key_For_Encryption_On_EBS_Policy 左侧的复选框。

    14. 选择附加策略

AWS CLI
使用 AWS CLI 创建 Amazon EBS CSI 插件 IAM 角色
  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
  2. 创建 IAM 角色并向其授予 AssumeRoleWithWebIdentity 操作。

    1. 将以下内容复制到名为 aws-ebs-csi-driver-trust-policy.json 的文件中。请将 111122223333 替换为您的账户 ID。将 EXAMPLED539D4633E53DE1B71EXAMPLEregion-code 替换为在上一步中返回的值。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: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:ebs-csi-controller-sa" } } } ] }
    2. 创建角色。您可以将 AmazonEKS_EBS_CSI_DriverRole 更改为其他名称。如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
  3. 附加策略。AWS 维护 AWS 托管策略,或者您可创建自己的自定义策略。使用以下命令以将 AWS 托管策略附加到角色。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  4. 如果在 Amazon EBS 卷上使用自定义 KMS 密钥进行加密,请根据需要自定义 IAM 角色。例如,执行以下操作:

    1. 复制并在新的 kms-key-for-encryption-on-ebs.json 文件中粘贴以下代码。将 custom-key-arn 替换为自定义 KMS 密钥 ARN

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["custom-key-arn"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["custom-key-arn"] } ] }
    2. 创建 策略。您可以将 KMS_Key_For_Encryption_On_EBS_Policy 更改为其他名称。但是,如果更改了名称,请确保在后面的步骤中也进行相应的更改。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 使用以下命令将 IAM policy 附加到该角色。请将 111122223333 替换为您的账户 ID。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

      aws iam attach-role-policy \ --policy-arn arn:aws: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 附加组件。有关附加组件的更多信息,请参阅 Amazon EKS 附加组件

重要

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

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

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

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