

 **帮助改进此页面** 

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

# 了解 EKS 容器组身份如何向容器组（pod）授予对 Amazon 服务的访问权限
<a name="pod-identities"></a>

容器组（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 实例的角色。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/aUjJSorBE70?rel=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/aUjJSorBE70?rel=0)


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

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

## EKS 容器组身份的优势
<a name="pod-id-benefits"></a>

EKS 容器组身份具有以下优势：
+  **最低权限** – 您可以将 IAM 权限范围限定到服务账户，并且只有使用该服务账户的容器组（pod）可以访问这些权限。此功能还消除了对 `kiam` 或 `kube2iam` 等第三方解决方案的需求。
+  **凭证隔离**：当对 [Amazon EC2 实例元数据服务（IMDS）](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)的访问受到限制时，容器组的容器只能检索与该容器所使用服务账户关联的 IAM 角色的凭证。容器永远无法访问其他容器组（pod）中其他容器所使用的凭证。如果 IMDS 不受限制，则容器组的容器还可以访问 [Amazon EKS 节点 IAM 角色](create-node-role.md)，并且容器可能能够访问同一节点上其他容器组 IAM 角色的凭证。有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://docs.amazonaws.cn/eks/latest/best-practices/identity-and-access-management.html#_identities_and_credentials_for_eks_pods_recommendations)。

**注意**  
配置为 `hostNetwork: true` 的容器组将始终具有 IMDS 访问权限，但 Amazon SDK 和 CLI 在启用后将使用容器组身份凭证。
+  **可审计性** – 可通过 Amazon CloudTrail 进行访问和事件日志记录，帮助确保追溯性审计。

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

EKS 容器组身份是一种比 [服务账户的 IAM 角色](iam-roles-for-service-accounts.md) 更简单的方法，因为此方法不使用 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 容器组身份的工作原理](pod-id-how-it-works.md)。

有关比较两种替代方案的更多信息，请参阅 [使用 Kubernetes 服务账户授予 Kubernetes 工作负载访问 Amazon 的权限](service-accounts.md)。

## EKS 容器组身份设置概述
<a name="pod-id-setup-overview"></a>

完成以下过程，打开 EKS 容器组身份：

1.  [设置 Amazon EKS 容器组身份代理](pod-id-agent-setup.md) – 对于每个集群，您只需完成一次此步骤。如果您的集群启用了 EKS 自动模式，则无需完成此步骤。

1.  [向 Kubernetes 服务账户分配 IAM 角色](pod-id-association.md) – 针对您希望应用程序拥有的每组唯一权限完成此步骤。

1.  [配置容器组（pod）使用服务账户访问 Amazon 服务](pod-id-configure-pods.md)：为需要访问 Amazon 服务的每个容器组（pod）完成此步骤。

1.  [将容器组身份与 Amazon SDK 结合使用](pod-id-minimum-sdk.md) – 确认工作负载使用支持版本的 Amazon SDK，并且工作负载使用默认凭证链。

## 限制
<a name="pod-id-limits"></a>
+ 每个集群最多支持 5000 个 EKS 容器组身份关联，用于将 IAM 角色映射到 Kubernetes 服务账户。

## 注意事项
<a name="pod-id-considerations"></a>
+  **IAM 角色关联**：集群中的每个 Kubernetes 服务账户都可以与集群相同的 Amazon 账户中的一个 IAM 角色相关联。要更改该角色，请编辑 EKS 容器组身份关联。要进行跨账户访问，请使用 IAM 角色向该角色委派访问权限。要了解更多信息，请参阅《IAM 用户指南》**中的[使用 IAM 角色委托跨 Amazon 账户的访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。
+  **EKS 容器组身份代理**：使用 EKS 容器组身份需要 EKS 容器组身份代理。该代理作为 Kubernetes `DaemonSet` 在集群节点上运行，仅向同一节点上的容器组提供凭证。其使用节点的 `hostNetwork`，占用链路本地地址上的端口 `80` 和 `2703`（IPv4 为 `169.254.170.23`，IPv6 为 `[fd00:ec2::23]`）。如果您的集群中禁用 IPv6，则请为容器组身份代理禁用 IPv6。要了解更多信息，请参阅[在 EKS 容器组身份代理中禁用 IPv6](https://docs.amazonaws.cn/eks/latest/userguide/pod-id-agent-config-ipv6.html)。
+  **最终一致性**：EKS 容器组身份关联最终保持一致，API 调用后可能会有几秒钟的延迟。避免在关键的高可用性代码路径中创建或更新关联。相反，应在单独的、不太频繁的初始化或设置例程中执行这些操作。要了解更多信息，请参阅《EKS Best Practices Guide》**中的 [Security Groups Per Pod](https://docs.amazonaws.cn/eks/latest/best-practices/sgpp.html)。
+  **代理和安全组注意事项**：对于使用代理的容器组，请将 `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”。要了解更多信息，请参阅[将安全组分配给各个容器组](https://docs.amazonaws.cn/eks/latest/userguide/security-groups-for-pods.html)。

### EKS 容器组身份集群版本
<a name="pod-id-cluster-versions"></a>

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


| Kubernetes 版本 | 平台版本 | 
| --- | --- | 
|  未列出 Kubernetes 版本  |  支持所有平台版本  | 
|   `1.28`   |   `eks.4`   | 

### EKS 容器组身份限制
<a name="pod-id-restrictions"></a>

EKS 容器组身份适用于：
+ 上一个主题 [EKS 容器组身份集群版本](#pod-id-cluster-versions) 中列出的 Amazon EKS 集群版本。
+ 集群中属于 Linux Amazon EC2 实例的 Worker 节点。

EKS 容器组身份不适用于：
+  Amazon Outposts。
+ Amazon EKS Anywhere。
+ 您在 Amazon EC2 上创建和运行的 Kubernetes 集群。EKS 容器组身份组件仅在 Amazon EKS 上可用。

您不能将 EKS 容器组身份用于：
+ 在 Linux Amazon EC2 实例之外的任何位置运行的容器组。不支持在 Amazon Fargate（Fargate）上运行的 Linux 和 Windows 容器组。不支持 Windows Amazon EC2 实例上运行的容器组。