使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源 - Amazon EKS

帮助改进此页面

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

使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源

在 Amazon Elastic Kubernetes Service(Amazon EKS)上运行应用程序时,您可能需要访问位于不同 AWS 账户中的 AWS 资源。本指南向您介绍如何使用 EKS 容器组身份设置跨账户访问,以便 Kubernetes 容器组(pod)能够使用目标角色访问其他 AWS 资源。

先决条件

在开始之前,请确保您已完成以下步骤:

工作方式

容器组身份通过名为角色链的流程,使 EKS 集群中的应用程序能够跨账户访问 AWS 资源。

创建容器组身份关联时,可以提供两个 IAM 角色:一个是与 EKS 集群位于同一账户的 EKS 容器组(pod)身份角色,另一个是包含您希望访问的 AWS 资源(例如 S3 存储桶或 RDS 数据库)的账户中的目标 IAM 角色。因 IAM PassRole 要求,EKS 容器组身份角色必须位于 EKS 集群所在账户中,而目标 IAM 角色可以位于任何 AWS 账户中。PassRole 允许 AWS 实体将角色代入委派给其他服务。EKS 容器组身份通过 PassRole 将角色连接到 Kubernetes 服务账户,同时要求角色及传递该角色的身份都必须与 EKS 集群位于同一 AWS 账户中。如果应用程序容器组(pod)需要访问 AWS 资源,它会向容器组身份请求凭证。随后,容器组身份会按顺序自动执行两次角色代入:首先代入 EKS 容器组身份角色,然后使用该凭证代入目标 IAM 角色。此过程可为容器组(pod)提供临时凭证(这些凭证具有目标角色中定义的权限),从而安全访问其他 AWS 账户中的资源。

缓存注意事项

由于缓存机制,对现有容器组身份关联中 IAM 角色的更新可能不会立即在 EKS 集群上运行的容器组(pod)中生效。容器组身份代理会根据获取凭证时的关联配置来缓存 IAM 凭证。如果关联仅包含 EKS 容器组身份角色而不包含目标 IAM 角色,则缓存凭证有效期为 6 小时。如果关联同时包含 EKS 容器组身份角色 ARN 和目标 IAM 角色,则缓存凭证有效期为 59 分钟。修改现有关联(例如更新 EKS 容器组身份角色 ARN 或添加目标 IAM 角色)不会重置现有缓存。因此,只有在刷新缓存凭证后,代理才会识别更新。如需立即应用更改,可重新创建现有容器组(pod);否则需等待缓存过期。

第 1 步:创建并关联目标 IAM 角色

在此步骤中,您将通过创建和配置目标 IAM 角色来建立安全的信任链。出于演示目的,我们将创建新的目标 IAM 角色,以在两个 AWS 账户间建立信任链:位于 EKS 集群 AWS 账户中的 EKS 容器组身份角色(例如 eks-pod-identity-primary-role)将获得代入目标账户中目标 IAM 角色(例如 eks-pod-identity-aws-resources)的权限,从而实现对 Amazon S3 存储桶等 AWS 资源的访问。

创建目标 IAM 角色

  1. 打开 Amazon IAM 控制台

  2. 在顶部导航栏中,确认您已登录包含目标 IAM 角色所需 AWS 资源(例如 S3 存储桶或 DynamoDB 表)的账户。

  3. 在左侧导航窗格中,选择 角色

  4. 选择创建角色按钮,然后选择“可信实体类型”下的 AWS 账户

  5. 选择其他 AWS 账户,输入 AWS 账号(EKS 容器组身份角色所在的账户账号),然后选择下一步

  6. 添加要与该角色关联的权限策略(例如 AmazonS3FullAccess),然后选择下一步

  7. 输入 MyCustomIAMTargetRole 等角色名称,然后选择创建角色

更新目标 IAM 角色的信任策略

  1. 创建角色后,您将返回到角色列表。查找并选择您在上一步中创建的新角色(例如 MyCustomIAMTargetRole)。

  2. 选择信任关系选项卡。

  3. 点击右侧的编辑信任策略

  4. 在策略编辑器中,将默认 JSON 替换为信任策略。将 IAM 角色 ARN 中角色名称和 111122223333 的占位符值替换为托管 EKS 集群的 AWS 账户 ID。您也可以选择在角色信任策略中使用 PrincipalTags,以仅授权来自给定集群和命名空间的特定服务账户来代入目标角色。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ], "Condition": { "StringEquals": { "aws:PrincipalTag/eks-cluster-arn": "arn:aws:eks:us-east-1:111122223333:cluster/example-cluster", "aws:PrincipalTag/kubernetes-namespace": "ExampleNameSpace", "aws:PrincipalTag/kubernetes-service-account": "ExampleServiceAccountName" }, "ArnEquals": { "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role" } } } ] }

上述策略允许来自 AWS 账户 111122223333,并带有相关 EKS 容器组身份会话标签的角色 eks-pod-identeity-primary-role 代入此角色。

如果您在 EKS 容器组身份中禁用会话标签,则在代入目标角色时,EKS 容器组身份还会设置 sts:ExternalId,其中包含有关容器组(pod)集群、命名空间和服务账户的信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "region/111122223333/cluster-name/namespace/service-account-name" }, "ArnEquals": { "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "sts:TagSession" } ] }

上述策略有助于确保只有预期的集群、命名空间和服务账户才能代入目标角色。

更新 EKS 容器组身份角色的权限策略

在此步骤中,您将通过添加目标 IAM 角色 ARN 作为资源,来更新 EKS 容器组身份角色(与 Amazon EKS 集群关联)的权限策略。

  1. 打开 Amazon EKS 控制台

  2. 在左侧导航窗格中,选择集群,然后选择 EKS 集群名称。

  3. 选择访问选项卡。

  4. 容器组身份关联下,选择 EKS 容器组身份角色

  5. 依次选择权限添加权限,然后选择创建内联策略

  6. 选择右侧的 JSON

  7. 在策略编辑器中,将默认 JSON 替换为权限策略。将 IAM 角色 ARN 中角色名称和 222233334444 的占位符值替换为目标 IAM 角色。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:TagSession" ], "Resource": "arn:aws:iam::222233334444:role/eks-pod-identity-aws-resources" } ] }

第 2 步:将 IAM 角色关联到 Kubernetes 服务账户

在此步骤中,您将在目标 IAM 角色与 EKS 集群中的 Kubernetes 服务账户之间创建关联。

  1. 打开 Amazon EKS 控制台

  2. 在左侧导航窗格中,选择集群,然后选择要向其添加关联的集群名称。

  3. 选择访问选项卡。

  4. 容器组身份关联中,选择创建

  5. IAM 角色中选择供工作负载代入的 EKS 容器组身份角色

  6. 目标 IAM 角色中选择将由 EKS 容器组身份角色代入的目标 IAM 角色。

  7. Kubernetes 命名空间字段中,输入要在其中创建关联的命名空间名称(例如 my-app-namespace),这将定义服务账户所在的位置。

  8. Kubernetes 服务账户字段中,输入将使用 IAM 凭证的服务账户名称(例如 my-service-account)。这会将 IAM 角色链接到服务账号。

  9. 选择创建以创建关联。