了解 EKS 容器组身份如何向容器组(pod)授予对 Amazon 服务的访问权限 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

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

了解 EKS 容器组身份如何向容器组(pod)授予对 Amazon 服务的访问权限

容器组(pod)的容器中的应用程序可以使用 Amazon SDK 或 Amazon CLI 以向使用 Amazon Identity and Access Management(IAM)权限的 Amazon 服务 发出 API 请求。应用程序必须通过 Amazon 凭证签署 Amazon API 请求。

Amazon EKS 容器组身份提供管理应用程序凭证的功能,类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置容器组(pod)来使用服务账户,而不是创建 Amazon 凭证并将其分配到容器或使用 Amazon EC2 实例的角色。

每个 EKS 容器组身份关联都将角色映射到指定集群命名空间中的服务账户。如果您在多个集群中使用相同的应用程序,则可以在每个集群中进行相同的关联,而无需修改角色的信任策略。

如果某个容器组使用具有关联的服务账户,Amazon EKS 会在容器组的容器中设置环境变量。环境变量配置 Amazon SDK(包括 Amazon CLI)使用 EKS 容器组身份凭证。

EKS 容器组身份的优势

EKS 容器组身份具有以下优势:

  • 最低权限 – 您可以将 IAM 权限范围限定到服务账户,并且只有使用该服务账户的容器组(pod)可以访问这些权限。此功能还消除了对 kiamkube2iam 等第三方解决方案的需求。

  • 凭证隔离:当对 Amazon EC2 实例元数据服务(IMDS)的访问受到限制时,容器组的容器只能检索与该容器所使用服务账户关联的 IAM 角色的凭证。容器永远无法访问其他容器组(pod)中其他容器所使用的凭证。如果 IMDS 不受限制,则容器组的容器还可以访问 Amazon EKS 节点 IAM 角色,并且容器可能能够访问同一节点上其他容器组 IAM 角色的凭证。有关更多信息,请参阅限制对分配给 Worker 节点的实例配置文件的访问

注意

配置为 hostNetwork: true 的容器组将始终具有 IMDS 访问权限,但 Amazon SDK 和 CLI 在启用后将使用容器组身份凭证。

  • 可审计性 – 可通过 Amazon CloudTrail 进行访问和事件日志记录,帮助确保追溯性审计。

重要

容器并非安全边界,使用任务容器组身份也不能改变这一点。分配给同一个节点的容器组将共享一个内核,并可能共享其他资源,具体视您的容器组配置而定。虽然在不同节点上运行的容器组将在计算层被隔离,但有些节点应用程序在 Kubernetes API 中拥有超出单个实例范围的额外权限。一些示例包括 kubeletkube-proxy、CSI 存储驱动程序或您自己的 Kubernetes 应用程序。

EKS 容器组身份是一种比 服务账户的 IAM 角色 更简单的方法,因为此方法不使用 OIDC 身份提供者。EKS 容器组身份具有以下增强功能:

  • 独立操作:在许多组织中,不同的团队负责创建 OIDC 身份提供者,而不是管理 Kubernetes 集群。EKS 容器组身份有明确的职责分工,EKS 容器组身份关联的所有配置都在 Amazon EKS 中完成,而 IAM 权限的所有配置都在 IAM 中完成。

  • 可重用性:EKS 容器组身份使用单个 IAM 主体,而不是服务账户 IAM 角色使用的每个集群的单独主体。IAM 管理员将以下主体添加到任何角色的信任策略中,使其可供 EKS 容器组身份使用。

    "Principal": { "Service": "pods.eks.amazonaws.com" }
  • 可扩展性:每组临时凭证均由 EKS 容器组身份中的 EKS Auth 服务使用,而不是由每个容器组(pod)中运行的每个 Amazon SDK 使用。然后,在每个节点上运行的 Amazon EKS 容器组身份代理向 SDK 发放凭证。因此,每个节点的负载减少至一次,而且不会在每个容器组中重复。有关该过程的更多详细信息,请参阅 了解 EKS 容器组身份的工作原理

有关比较两种替代方案的更多信息,请参阅 使用 Kubernetes 服务账户授予 Kubernetes 工作负载访问 Amazon 的权限

EKS 容器组身份设置概述

完成以下过程,打开 EKS 容器组身份:

  1. 设置 Amazon EKS 容器组身份代理 – 对于每个集群,您只需完成一次此步骤。如果您的集群启用了 EKS 自动模式,则无需完成此步骤。

  2. 向 Kubernetes 服务账户分配 IAM 角色 – 针对您希望应用程序拥有的每组唯一权限完成此步骤。

  3. 配置容器组(pod)使用服务账户访问 Amazon 服务:为需要访问 Amazon 服务的每个容器组(pod)完成此步骤。

  4. 将容器组身份与 Amazon SDK 结合使用 – 确认工作负载使用支持版本的 Amazon SDK,并且工作负载使用默认凭证链。

限制

  • 每个集群最多支持 5000 个 EKS 容器组身份关联,用于将 IAM 角色映射到 Kubernetes 服务账户。

注意事项

  • IAM 角色关联:集群中的每个 Kubernetes 服务账户都可以与集群相同的 Amazon 账户中的一个 IAM 角色相关联。要更改该角色,请编辑 EKS 容器组身份关联。要进行跨账户访问,请使用 IAM 角色向该角色委派访问权限。要了解更多信息,请参阅《IAM 用户指南》中的使用 IAM 角色委托跨 Amazon 账户的访问权限

  • EKS 容器组身份代理:使用 EKS 容器组身份需要 EKS 容器组身份代理。该代理作为 Kubernetes DaemonSet 在集群节点上运行,仅向同一节点上的容器组提供凭证。其使用节点的 hostNetwork,占用链路本地地址上的端口 802703(IPv4 为 169.254.170.23,IPv6 为 [fd00:ec2::23])。如果您的集群中禁用 IPv6,则请为容器组身份代理禁用 IPv6。要了解更多信息,请参阅在 EKS 容器组身份代理中禁用 IPv6

  • 最终一致性:EKS 容器组身份关联最终保持一致,API 调用后可能会有几秒钟的延迟。避免在关键的高可用性代码路径中创建或更新关联。相反,应在单独的、不太频繁的初始化或设置例程中执行这些操作。要了解更多信息,请参阅《EKS Best Practices Guide》中的 Security Groups Per Pod

  • 代理和安全组注意事项:对于使用代理的容器组,请将 169.254.170.23(IPv4)和 [fd00:ec2::23](IPv6)添加到 no_proxy/NO_PROXY 环境变量,以防止对 EKS 容器组身份代理的请求失败。如果容器组的安全组与 Amazon VPC CNI 一起使用,则请将 ENABLE_POD_ENI 标志设置为“true”,POD_SECURITY_GROUP_ENFORCING_MODE 标志设置为“standard”。要了解更多信息,请参阅将安全组分配给各个容器组

EKS 容器组身份集群版本

要使用 EKS 容器组身份,集群的平台版本必须与下表中所列的版本相同或更高,或者 Kubernetes 版本必须比下表中所列的版本更高。要查找适用于 Kubernetes 版本的建议 Amazon EKS 容器组身份代理版本,请参阅验证 Amazon EKS 附加组件版本与集群的兼容性

Kubernetes 版本 平台版本

未列出 Kubernetes 版本

支持所有平台版本

1.28

eks.4

1.27

eks.8

1.26

eks.9

EKS 容器组身份限制

EKS 容器组身份适用于:

EKS 容器组身份不适用于:

  • Amazon Outposts。

  • Amazon EKS Anywhere。

  • 您在 Amazon EC2 上创建和运行的 Kubernetes 集群。EKS 容器组身份组件仅在 Amazon EKS 上可用。

您不能将 EKS 容器组身份用于:

  • 在 Linux Amazon EC2 实例之外的任何位置运行的容器组。不支持在 Amazon Fargate(Fargate)上运行的 Linux 和 Windows 容器组。不支持 Windows Amazon EC2 实例上运行的容器组。