

 **帮助改进此页面** 

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

# 使用 Kubernetes 服务账户授予 Kubernetes 工作负载访问 AWS 的权限
<a name="service-accounts"></a>[管理服务账户](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin)[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)[了解 EKS 容器组身份如何向容器组（pod）授予对 AWS 服务的访问权限](pod-identities.md)

## 服务账户令牌
<a name="service-account-tokens"></a>

在 Kubernetes 版本中默认启用 [BoundServiceAccountTokenVolume](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-token-volume) 功能。此功能通过允许在 Kubernetes 上运行工作负载来提高服务账户令牌的安全性，以请求与受众、时间和密钥绑定的 JSON Web 令牌。服务账户令牌有效期为 1 小时。在较低的 Kubernetes 版本中，令牌并无到期限制。这意味着依赖这些令牌的客户端必须在一小时内刷新令牌。以下 [Kubernetes 客户端 SDK](https://kubernetes.io/docs/reference/using-api/client-libraries/) 会在所需的时间范围内自动刷新令牌：
+ Go 版本 `0.15.7` 和更高版本
+ Python 版本 `12.0.0` 和更高版本
+ Java 版本 `9.0.0` 和更高版本
+ JavaScript 版本 `0.10.3` 和更高版本
+ Ruby `master` 分支
+ Haskell 版本 `0.3.0.0` 
+ C\$1 版本 `7.0.5` 和更高版本

如果您的工作负载使用的是早期客户端，则必须予以更新。为了使客户顺利迁移到更新的有时限的服务账户令牌，Kubernetes 在默认一小时内向服务账户令牌添加延长的到期期限。对于 Amazon EKS 集群，延长到期期限为 90 天。Amazon EKS 集群的 Kubernetes API 服务器会拒绝令牌超过 90 天的请求。我们建议您检查应用程序及其依赖项，以确保 Kubernetes 客户端开发工具包版本等于或高于之前列出的版本。

当 API 服务器收到令牌超过一小时的请求时，它会使用 `annotations.authentication.k8s.io/stale-token` 注释 API 审核日志事件。注释的值与以下示例类似：

```
subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.
```

如果您的集群启用了[控制面板日志记录](control-plane-logs.md)，则注释在审计日志内。您可以使用以下 [CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) 查询，识别 Amazon EKS 集群中使用过时令牌的所有容器组（pod）：

```
fields @timestamp
|filter @logStream like /kube-apiserver-audit/
|filter @message like /seconds after warning threshold/
|parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime
```

`subject` 指的是容器组（pod）使用的服务账户。`elapsedtime` 表示读取最新令牌后的时间（以秒为单位）。对 API 服务器的请求在 `elapsedtime` 超过 90 天（7,776,000 秒）时被拒绝。您应该主动更新应用程序的 Kubernetes 客户端开发工具包，以使用前面列出的其中一个自动刷新令牌的版本。如果使用的服务账户令牌接近 90 天，并且您没有足够的时间在令牌到期之前更新客户端开发工具包版本，您可以终止现有容器组（pod）并创建新的容器组（pod）。这将导致重新获取服务账户令牌，从而为您提供额外 90 天的时间来更新客户端版本开发工具包。

如果容器组（pod）是部署的一部分，在保持高可用性的同时终止容器组（pod）的建议方法是使用以下命令执行部署。将 *my-deployment* 替换为您的部署的名称。

```
kubectl rollout restart deployment/my-deployment
```

## 集群附加组件
<a name="boundserviceaccounttoken-validated-add-on-versions"></a>

已更新以下集群附加组件，以使用自动重新获取服务账户令牌的 Kubernetes 客户端开发工具包。我们建议确保已在集群上安装列出的版本或更高版本。
+ 适用于 Kubernetes 的 Amazon VPC CNI 插件和指标帮助程序插件版本 `1.8.0` 和更高版本。要查看当前版本或进行更新，请参阅 [使用 Amazon VPC CNI 将 IP 分配给容器组（pod）](managing-vpc-cni.md) 和 [cni-metrics-helper](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)。
+ CoreDNS `1.8.4` 及更高版本。要查看当前版本或更新它，请参阅 [在 Amazon EKS 集群中管理 DNS 的 CoreDNS](managing-coredns.md)。
+  AWS 负载均衡器控制器版本 `2.0.0` 和更高版本。要查看当前版本或更新它，请参阅 [使用 AWS 负载均衡器控制器路由互联网流量](aws-load-balancer-controller.md)。
+ 当前 `kube-proxy` 版本。要查看当前版本或更新它，请参阅 [在 Amazon EKS 集群中管理 `kube-proxy`](managing-kube-proxy.md)。
+  AWS for Fluent Bit 版本 `2.25.0` 或更高版本。要更新当前版本，请参阅 GitHub 上的[发布](https://github.com/aws/aws-for-fluent-bit/releases)。
+ Fluentd 镜像版本 [1.14.6-1.2](https://hub.docker.com/r/fluent/fluentd/tags?page=1&name=v1.14.6-1.2) 或更高版本以及适用于 Kubernetes 元数据的 Fluentd 筛选器插件版本 [2.11.1](https://rubygems.org/gems/fluent-plugin-kubernetes_metadata_filter/versions/2.11.1) 或更高版本。

## 向 Amazon Elastic Kubernetes Service 集群上的工作负载授予 AWS Identity and Access Management 权限
<a name="service-accounts-iam"></a>

对于向 Amazon EKS 集群中运行的工作负载授予 AWS Identity and Access Management 权限，Amazon EKS 提供了两种方法：*服务账户的 IAM 角色*和 *EKS 容器组身份*。

 **服务账户的 IAM 角色**   
 *服务账户的 IAM 角色（IRSA）*可为 AWS 上运行的 Kubernetes 应用程序配置细粒度 IAM 权限，使其能够访问 Amazon S3 存储桶、Amazon DynamoDB 表等各种其他 AWS 资源。您可以在同一 Amazon EKS 集群中同时运行多个应用程序，并确保每个应用程序仅拥有所需的最低权限集。IRSA 旨在支持 AWS 支持的各种 Kubernetes 部署选项，例如 Amazon EKS、Amazon EKS Anywhere、AWS 上的 Red Hat OpenShift 服务，以及 Amazon EC2 实例上的自主管理型 Kubernetes 集群。因此，IRSA 是使用基础 AWS 服务（如 IAM）构建的，不直接依赖 Amazon EKS 服务和 EKS API。有关更多信息，请参阅 [服务账户的 IAM 角色](iam-roles-for-service-accounts.md)。

 **EKS 容器组身份**   
EKS 容器组身份为集群管理员提供了一个简化的工作流，用于对应用程序进行身份验证，以访问各种其他 AWS 资源，例如 Amazon S3 存储桶、Amazon DynamoDB 表等。EKS 容器组身份仅适用于 EKS，因此简化了集群管理员配置 Kubernetes 应用程序以获取 IAM 权限的方式。现在可以直接通过 AWS 管理控制台、EKS API 和 AWS CLI，用更少的步骤轻松配置这些权限，无需对集群内的任何 Kubernetes 对象执行任何操作。集群管理员无需在 EKS 和 IAM 服务之间切换，也无需使用特权 IAM 操作来配置应用程序所需的权限。现在可以跨多个集群使用 IAM 角色，无需在创建新集群时更新角色信任策略。EKS 容器组身份提供的 IAM 凭证包括角色会话标签，以及集群名称、命名空间、服务账户名称等属性。角色会话标签允许管理员根据匹配的标签访问 AWS 资源，从而使管理员能够创建可跨服务账户使用的单一角色。有关更多信息，请参阅 [了解 EKS 容器组身份如何向容器组（pod）授予对 AWS 服务的访问权限](pod-identities.md)。

### 比较 EKS 容器组身份和 IRSA
<a name="service-accounts-iam-compare"></a>

总的来说，EKS 容器组身份和 IRSA 都允许您向在 Kubernetes 集群上运行的应用程序授予 IAM 权限。但是，二者在配置方式、支持的限制和启用的功能方面有根本不同。下面，我们将比较这两种解决方案的一些关键方面。

**注意**  
 AWS 建议尽可能使用 EKS 容器组（pod）身份授予您的容器组（pod）访问 AWS 资源的权限。有关更多信息，请参阅 [了解 EKS 容器组身份如何向容器组（pod）授予对 AWS 服务的访问权限](pod-identities.md)。


| 属性 | EKS 容器组身份 | IRSA | 
| --- | --- | --- | 
|  角色可扩展性  |  您必须对每个角色设置一次，才能与新引入的 Amazon EKS 服务主体 `pods.eks.amazonaws.com` 建立信任。完成此一次性步骤后，每次在新集群中使用角色时，都无需更新该角色的信任策略。  |  每次要在新集群中使用 IAM 角色时，都必须使用新的 EKS 集群 OIDC 提供者端点，来更新该角色的信任策略。  | 
|  集群可扩展性  |  EKS 容器组身份不需要用户设置 IAM OIDC 提供者，因此这一限制并不适用。  |  每个 EKS 集群都具有与其关联的 OpenID Connect（OIDC）发布者 URL。要使用 IRSA，需要在 IAM 中为每个 EKS 集群创建一个唯一的 OpenID Connect 提供者。IAM 对每个 AWS 账户的默认全局限制为 100 个 OIDC 提供者。如果计划为每个使用 IRSA 的 AWS 账户设置超过 100 个 EKS 集群，则会达到 IAM OIDC 提供者限制。  | 
|  角色可扩展性  |  EKS 容器组身份不要求用户在信任策略中定义 IAM 角色和服务账户之间的信任关系，因此这一限制并不适用。  |  在 IRSA 中，您可以在角色的信任策略中定义 IAM 角色和服务账户之间的信任关系。默认情况下，信任策略大小的长度为 `2048`。这意味着您通常可以在单个信任策略中定义 4 个信任关系。虽然您可以增加信任策略长度限制，但单个信任策略中通常最多只能有 8 个信任关系。  | 
|  STS API 配额使用  |  EKS 容器组身份简化了向容器组（pod）交付 AWS 凭证的过程，无需您的代码使用 AWS Security Token Service（STS）直接调用。EKS 服务会处理角色代入，并向在容器组（pod）中使用 AWS SDK 编写的应用程序提供凭证，而无需您的容器组（pod）与 AWS STS 通信或使用 STS API 配额。  |  在 IRSA 中，容器组（pod）中使用 AWS SDK 编写的应用程序会使用令牌在 AWS Security Token Service（STS）上调用 `AssumeRoleWithWebIdentity` API。根据您在 AWS SDK 上的代码逻辑，您的代码可能会对 AWS STS 进行不必要的调用并收到节流错误。  | 
|  角色可重用性  |   EKS 容器组身份提供的 AWS STS 临时凭证包括角色会话标签，例如集群名称、命名空间、服务账户名称。角色会话标签使管理员能够创建单个 IAM 角色，该角色可用于具有不同有效权限的多个服务账户，方法是允许根据附加到资源的 AWS 标签来访问资源，也称为基于属性的访问权限控制（ABAC）。有关更多信息，请参阅 [基于标签授予容器组（pod）对 AWS 资源的访问权限](pod-id-abac.md)。  |   不支持 AWS STS 会话标签。您可以在集群之间重用角色，但每个容器组都会获得该角色的所有权限。  | 
|  支持的环境  |  EKS 容器组身份仅在 Amazon EKS 上可用。  |  IRSA 可用于 Amazon EKS、Amazon EKS Anywhere、AWS 上的 Red Hat OpenShift 服务，以及 Amazon EC2 实例上的自主管理型 Kubernetes 集群。  | 
|  支持的 EKS 版本  |  所有受支持的 EKS 集群版本。有关特定平台版本，请参阅 [EKS 容器组身份集群版本](pod-identities.md#pod-id-cluster-versions)。  |  所有受支持的 EKS 集群版本。  | 

# 服务账户的 IAM 角色
<a name="iam-roles-for-service-accounts"></a>

**提示**  
 [注册参加](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即将举办的 Amazon EKS 讲习会。

容器组（pod）的容器中的应用程序可以使用 AWS SDK 或 AWS CLI 以向使用 AWS Identity and Access Management（IAM）权限的 AWS 服务 发出 API 请求。应用程序必须通过 AWS 凭证签署 AWS API 请求。**服务账户的 IAM 角色（IRSA）**可用于管理供应用程序使用的凭证，这与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式类似。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置容器组（pod）来使用服务账户，而不是创建 AWS 凭证并将其分配到容器或使用 Amazon EC2 实例的角色。您不能将服务账户的 IAM 角色用于 [AWS Outposts 上的 Amazon EKS 本地集群](eks-outposts-local-cluster-overview.md)。

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

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

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

通过完成下列步骤为服务账户启用 IAM 角色：

1.  [为集群创建 IAM OIDC 提供者](enable-iam-roles-for-service-accounts.md) – 您只需为集群完成一次此操作。
**注意**  
如果启用了 EKS VPC 端点，则无法从该 VPC 内部访问 EKS OIDC 服务端点。因此，您在 VPC 中使用 `eksctl` 创建 OIDC 提供者等操作将不起作用，并且在尝试请求 `https://oidc.eks.region.amazonaws.com` 时将导致超时。错误消息示例如下：  

   ```
   server cant find oidc.eks.region.amazonaws.com: NXDOMAIN
   ```
要完成此步骤，您可以在 VPC 外部运行该命令，例如在 AWS CloudShell 中或在连接到互联网的计算机上。您也可在 VPC 中创建水平分割条件解析器（例如 Route 53 Resolver），以便为 OIDC 发布者 URL 使用不同的解析器，而不对其使用 VPC DNS。有关 CoreDNS 中条件转发的示例，请参阅 GitHub 上的 [Amazon EKS feature request](https://github.com/aws/containers-roadmap/issues/2038)。

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

1.  [将容器组（pod）配置为使用 Kubernetes 服务账户](pod-configuration.md) – 为需要访问 AWS 服务的每个 容器组（pod）完成此过程。

1.  [将 IRSA 与 AWS SDK 结合使用](iam-roles-for-service-accounts-minimum-sdk.md) – 确认工作负载使用支持版本的 AWS SDK，并且工作负载使用默认凭证链。

## IAM、Kubernetes 和 OpenID Connect（OIDC）背景信息
<a name="irsa-oidc-background"></a>

2014 年，AWS Identity and Access Management 使用 OpenID Connect（OIDC）增加了对联合身份验证的支持。此功能允许您通过支持的身份提供商对 AWS API 调用进行身份验证，并获得有效的 OIDC JSON Web 令牌 (JWT)。您可以将此令牌传递到 AWS STS `AssumeRoleWithWebIdentity` API 操作并接收 IAM 临时角色凭证。您可以使用这些凭证与任意 AWS 服务交互，包括 Amazon S3 和 DynamoDB。

每个 JWT 令牌均由签名密钥对签名。密钥由 Amazon EKS 管理的 OIDC 提供者提供，私钥每 7 天轮换一次。Amazon EKS 会保留公钥直至其过期。如果您连接外部 OIDC 客户端，请注意您需要在公钥过期之前刷新签名密钥。了解如何[获取签名密钥以验证 OIDC 令牌](irsa-fetch-keys.md)。

Kubernetes 长期以来将服务账户用作其内部身份系统。Pod 可以使用自动装载的令牌（这是非 OIDC JWT，只有 Kubernetes API 服务器可以验证）进行 Kubernetes API 服务器的身份验证。这些旧服务账户令牌不会过期，轮换签名密钥是一个困难的过程。在 Kubernetes `1.12` 版本中，添加了对新 `ProjectedServiceAccountToken` 功能的支持。此功能是 OIDC JSON Web 令牌，包含了服务账户身份，且支持可配置的受众。

Amazon EKS 为包含 `ProjectedServiceAccountToken` JSON Web 令牌的签名密钥的每个集群托管公有 OIDC 发现端点，这样 IAM 等外部系统就可以验证和接收 Kubernetes 颁发的 OIDC 令牌。

# 为集群创建 IAM OIDC 提供商
<a name="enable-iam-roles-for-service-accounts"></a>

您的集群具有与其关联的 [OpenID Connect](https://openid.net/connect/)（OIDC）发布者 URL。要将 AWS Identity and Access Management（IAM）角色用于服务账户，您集群的 OIDC 发布者 URL 必须存在 IAM OIDC 提供者。

## 先决条件
<a name="_prerequisites"></a>
+ 现有 Amazon EKS 集群。要部署一个角色，请参阅[开始使用 Amazon EKS](getting-started.md)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

您可以使用 `eksctl` 或 AWS 管理控制台为集群创建 IAM OIDC 提供者。

## 创建 OIDC 提供者（eksctl）
<a name="_create_oidc_provider_eksctl"></a>

1. 您的设备或 AWS CloudShell 上安装 `0.215.0` 版或更高版本的 `eksctl` 命令行工具。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。

1. 确定集群的 OIDC 发布者 ID。

   检索集群的 OIDC 发布者 ID 并将其存储在变量中。将 `<my-cluster>` 替换为您自己的值。

   ```
   cluster_name=<my-cluster>
   oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   echo $oidc_id
   ```

1. 确定账户中是否已存在具有集群发布者 ID 的 IAM OIDC 提供者。

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   如果返回了输出，则表示集群已经有 IAM OIDC 提供者，您可以跳过下一步。如果没有返回输出，则您必须为集群创建 IAM OIDC 提供者。

1. 使用以下命令为您的集群创建 IAM OIDC 身份提供商。

   ```
   eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve
   ```
**注意**  
如果启用了 EKS VPC 端点，则无法从该 VPC 内部访问 EKS OIDC 服务端点。因此，您在 VPC 中使用 `eksctl` 创建 OIDC 提供者等操作将不起作用，并将导致超时。错误消息示例如下：  

   ```
   ** server cant find oidc.eks.<region-code>.amazonaws.com: NXDOMAIN
   ```

   要完成此步骤，您可以在 VPC 外部运行该命令，例如在 AWS CloudShell 中或在连接到互联网的计算机上。您也可在 VPC 中创建水平分割条件解析器（例如 Route 53 Resolver），以便为 OIDC 发布者 URL 使用不同的解析器，而不对其使用 VPC DNS。有关 CoreDNS 中条件转发的示例，请参阅 GitHub 上的 [Amazon EKS feature request](https://github.com/aws/containers-roadmap/issues/2038)。

## 创建 OIDC 提供者（AWS 控制台）
<a name="create_oidc_provider_shared_aws_console"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧窗格中，选择 **Clusters**（集群），然后在 **Clusters**（集群）页面上选择集群的名称。

1. 在 **Overview**（概述）选项卡上的 **Details**（详细信息）部分中，记下 **OpenID Connect provider URL**（OpenID Connect 提供商 URL）的值。

1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

1. 请在左侧导航窗格中，选择 **Access management**（访问管理）下方的 **Identity Providers**（标识提供程序）。如果列出的 **Provider（提供商）**与集群的 URL 匹配，那么您的集群已经有了提供商。如果未列出与集群 URL 匹配的提供者，则必须创建一个提提供者。

1. 要创建提供商，请选择 **Add Provider**（添加提供商）。

1. 对于**提供者类型**，选择 **OpenID Connect**。

1. 对于**提供者 URL**，输入集群的 OIDC 提供者 URL。

1. 对于**受众**,，输入 `sts.amazonaws.com`。

1. （可选）添加任何标签，例如用于标识哪个集群用于该提供商的标签。

1. 选择**添加提供程序**。

下一步: [为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md) 

# 为 Kubernetes 服务账户分配 IAM 角色
<a name="associate-service-account-role"></a>

本主题介绍如何配置 Kubernetes 服务账户，以担任 AWS Identity and Access Management（IAM）角色。然后，配置为使用服务账户的任何容器组（pod）都可以访问该角色有权访问的任何 AWS 服务。

## 先决条件
<a name="_prerequisites"></a>
+ 现有集群。如果您没有，可以按照[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 您的集群的现有 IAM OpenID Connect (OIDC) 提供商。要了解您是否已拥有一个（IAM）角色或如何创建一个（IAM）角色，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

## 步骤 1：创建 IAM 策略
<a name="irsa-associate-role-procedure"></a>

要将现有 IAM 策略关联到您的 IAM 角色，请跳至下一步。

1. 创建一个 IAM 策略。您可以创建自己的策略，也可以复制已授予您部分所需权限的 AWS 托管策略，并根据您的特定要求对其进行自定义。有关更多信息，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

1. 创建一个文件，其中包含您希望容器组（pod）访问的 AWS 服务所需的权限。有关所有 AWS 服务的所有操作的列表，请参阅[服务授权参考](https://docs.aws.amazon.com/service-authorization/latest/reference/)。

   您可以运行以下命令创建一个示例策略文件，以实现对 Amazon S3 存储桶的只读访问权限。您可以选择将配置信息或引导脚本存储在此存储桶中，并且容器组（pod）中的容器可以从存储桶读取文件并将其加载到应用程序中。如果您要创建此示例策略，请将以下内容复制到您的设备。将 *my-pod-secrets-bucket* 替换为您的存储桶名称并运行该命令。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

1. 创建 IAM 策略。

   ```
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

## 步骤 2：创建和关联 IAM 角色
<a name="_step_2_create_and_associate_iam_role"></a>

创建 IAM 角色并将其与 Kubernetes 服务账户关联。您可以使用 `eksctl` 或 AWS CLI。

### 创建和关联角色（eksctl）
<a name="_create_and_associate_role_eksctl"></a>

此 `eksctl` 命令会在指定的命名空间中创建一个 Kubernetes 服务账户，创建具有指定名称的 IAM 角色（如果其不存在），将现有的 IAM 策略 ARN 附加到该角色，并使用 IAM 角色 ARN 为该服务账户添加注释。请务必使用您的具体值替换此命令中的示例占位符值。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。

```
eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \
    --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
```

**重要**  
如果角色或服务账户已经存在，则之前的命令可能会失败。在这些情况下，`eksctl` 提供不同的选项供您使用。有关更多信息，请运行 `eksctl create iamserviceaccount --help`。

### 创建和关联角色（AWS CLI）
<a name="create_and_associate_role_shared_aws_cli"></a>

如果您有要担任 IAM 角色的现有 Kubernetes 服务账户，则可跳过此步骤。

1. 创建一个 Kubernetes 服务账户。将以下内容复制到您的设备。将 *my-service-account* 替换为所需的名称，如有必要，将 *default* 替换为其他命名空间。如更改 *default*，则命名空间必须已经存在。

   ```
   cat >my-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     name: my-service-account
     namespace: default
   EOF
   kubectl apply -f my-service-account.yaml
   ```

1. 使用以下命令将 AWS 账户 ID 设置为环境变量。

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. 使用以下命令将集群的 OIDC 身份提供者设置为环境变量。将 *my-cluster* 替换为您的集群的名称。

   ```
   oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
   ```

1. 为服务账户的命名空间和名称设置变量。将 *my-service-account* 替换为要担任角色的 Kubernetes 服务账户。将 *default* 替换为服务账户的命名空间。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 运行以下命令为 IAM 角色创建信任策略文件。若要允许命名空间内的所有服务账户使用该角色，请将以下内容复制到您的设备。将 *StringEquals* 替换为 `StringLike`，并将 *\$1service\$1account* 替换为 `*`。您可在 `StringEquals` 和 `StringLike` 条件中添加多个条目，以允许多个服务账户或命名空间分派角色。要允许其它 AWS 账户中的角色（而不是您的集群所在账户中的角色）分派该角色户，请参阅[使用 IRSA 对另一个账户进行身份验证](cross-account-access.md)获取更多信息。

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::123456789012:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   ```

1. 创建角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-role-description* 替换为您的角色的描述。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 将 IAM 策略附加到您的角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-policy* 替换为您创建的现有策略的名称。

   ```
   aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
   ```

1. 请使用要让服务账户分派的 IAM 角色的 Amazon 资源名称（ARN）注释您的服务账户。将 *my-role* 替换为您的现有 IAM 角色的名称。假设您在上一步中允许其它 AWS 账户中的角色（而不是您的集群所在账户中的角色）分派该角色户。那么，请确保指定其它账户中的 AWS 账户和角色。有关更多信息，请参阅[使用 IRSA 对另一个账户进行身份验证](cross-account-access.md)。

   ```
   kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
   ```

1. （可选）[为服务账户配置 AWS Security Token Service 端点](configure-sts-endpoint.md)。AWS 建议使用区域级 AWS STS 端点而不是全局端点。这可以减少延迟，提供内置冗余并提高会话令牌的有效性。

## 步骤 3：确认配置
<a name="irsa-confirm-role-configuration"></a>

1. 确认 IAM 角色的信任策略配置正确。

   ```
   aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
   ```

   示例输出如下。

   ```
   {
       "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:sub": "system:serviceaccount:default:my-service-account",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

1. 确认您在上一步中附加到角色的策略已附加到该角色。

   ```
   aws iam list-attached-role-policies --role-name my-role --query "AttachedPolicies[].PolicyArn" --output text
   ```

   示例输出如下。

   ```
                  arn:aws:iam::111122223333:policy/my-policy
   ```

1. 设置一个变量以存储要使用策略的 Amazon 资源名称（ARN）。将 *my-policy* 替换为要确认其权限的策略的名称。

   ```
   export policy_arn=arn:aws:iam::111122223333:policy/my-policy
   ```

1. 查看该策略的默认版本。

   ```
   aws iam get-policy --policy-arn $policy_arn
   ```

   示例输出如下。

   ```
   {
       "Policy": {
           "PolicyName": "my-policy",
           "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
           "Arn": "arn:aws:iam::111122223333:policy/my-policy",
           "Path": "/",
           "DefaultVersionId": "v1",
           [...]
       }
   }
   ```

1. 查看策略内容以确保该策略包含容器组（pod）所需的所有权限。如有必要，将以下命令中的 *1* 替换为上一个输出中返回的版本。

   ```
   aws iam get-policy-version --policy-arn $policy_arn --version-id v1
   ```

   示例输出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

   如果您在上一步中创建了示例策略，则您的输出与示例相同。如果您创建了其他策略，则与*示例*内容不同。

1. 确认已使用角色为 Kubernetes 服务账户添加注释。

   ```
   kubectl describe serviceaccount my-service-account -n default
   ```

   示例输出如下。

   ```
   Name:                my-service-account
   Namespace:           default
   Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
   Image pull secrets:  <none>
   Mountable secrets:   my-service-account-token-qqjfl
   Tokens:              my-service-account-token-qqjfl
   [...]
   ```

## 后续步骤
<a name="_next_steps"></a>
+  [配置容器组（pod）使用 Kubernetes 服务账户](pod-configuration.md) 

# 配置容器组（pod）使用 Kubernetes 服务账户
<a name="pod-configuration"></a>

如果容器组（pod）需要访问 AWS 服务，则必须配置它来使用 Kubernetes 服务账户。服务账户必须关联到有权访问 AWS 服务的 AWS Identity and Access Management（IAM）角色。
+ 现有集群。如果还没有，可以使用[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 您的集群的现有 IAM OpenID Connect (OIDC) 提供商。要了解您是否已拥有一个（IAM）角色或如何创建一个（IAM）角色，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 与 IAM 角色关联的现有 Kubernetes 服务账户。必须使用 IAM 角色的 Amazon 资源名称（ARN）注释服务账户。该角色必须具有关联的 IAM 策略，其中包含您希望容器组（pod）必须具有的权限，以便使用 AWS 服务。有关如何创建和配置服务账户和角色的更多信息，请参阅 [为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

  1. 使用以下命令创建部署清单，您可以使用该部署清单部署容器组（pod）来确认配置。将示例值替换为您自己的值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 将清单部署到集群。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 确认容器组（pod）具有所需的环境变量。

     1. 按上一步部署后，查看部署的容器组（pod）。

        ```
        kubectl get pods | grep my-app
        ```

        示例输出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 查看容器组（pod）使用的 IAM 角色的 ARN。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:
        ```

        示例输出如下。

        ```
        AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/my-role
        ```

        角色 ARN 必须与您用于注释现有服务账户的角色 ARN 匹配。有注释服务账户的更多信息，请参阅 [为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)。

     1. 确认容器组（pod）有 Web 身份令牌文件挂载。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:
        ```

        示例输出如下。

        ```
        AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
        ```

        `kubelet` 代表容器组（pod）请求并存储令牌。默认情况下，如果令牌早于其总生存时间的 80%，或者令牌大于 24 小时，则 `kubelet` 会刷新令牌。您可以使用容器组（pod）规范中的设置修改任何账户（默认服务账户除外）的到期期限。有关更多信息，请参阅 Kubernetes 文档中的[服务账户令牌卷预测](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection)。

        集群上的 [Amazon EKS 容器组身份 Webhook](https://github.com/aws/amazon-eks-pod-identity-webhook#amazon-eks-pod-identity-webhook) 监控使用具有以下注释的服务账户：

        ```
        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
        ```

        Webhook 将之前的环境变量应用于这些容器组（pod）。您的集群无需使用 Webhook 来配置环境变量和令牌文件挂载。您可以手动配置容器组（pod）来包含这些环境变量。[AWS 开发工具包支持的版本](iam-roles-for-service-accounts-minimum-sdk.md)首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的容器组（pod）。

  1. 确认您的容器组（pod）可以使用您在附加到角色的 IAM 策略中分配的权限与 AWS 服务进行交互。
**注意**  
当容器组（pod）使用来自与服务账户关联的 IAM 角色的 AWS 凭证时，该容器组（pod）中的 AWS CLI 或其他 SDK 包仅使用该角色提供的凭证。如果您不限制对提供给 [Amazon EKS 节点 IAM 角色](create-node-role.md)的凭证的访问，容器组（pod）仍然可以访问这些凭证。有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的容器组（pod）无法按预期与服务进行交互，请完成以下步骤，确认所有配置都正确。

     1. 确认您的容器组（pod）使用支持通过 OpenID Connect Web 身份令牌文件担任 IAM 角色的 AWS SDK 版本。有关更多信息，请参阅 [将 IRSA 与 AWS SDK 结合使用](iam-roles-for-service-accounts-minimum-sdk.md)。

     1. 确认部署正在使用服务账户。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        示例输出如下。

        ```
        Service Account:  my-service-account
        ```

     1. 如果您的容器组（pod）仍然无法访问服务，请查看[为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md#irsa-confirm-role-configuration)中描述的[步骤](associate-service-account-role.md)，确认角色和服务账户的配置都正确。

# 为服务账户配置 AWS Security Token Service 端点
<a name="configure-sts-endpoint"></a>

如果将 Kubernetes 服务账户与[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)结合使用，则可配置服务账户使用的 AWS Security Token Service 端点类型。

 AWS 建议使用区域 AWS STS 端点而不是全局端点。这可以减少延迟，提供内置冗余并提高会话令牌的有效性。AWS Security Token Service 必须在容器组（pod）运行的 AWS 区域处于活动状态。此外，您的应用程序必须内置冗余功能，以便在该 AWS 区域的服务出现故障时选择其它 AWS 区域。有关更多信息，请参阅《IAM 用户指南》中的[在 AWS 区域中管理 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。
+ 现有集群。如果还没有，可以使用 [开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 集群的现有 IAM OIDC 提供商。有关更多信息，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 现有的 Kubernetes 服务账户配置为与[适用于服务账户的 Amazon EKS IAM](iam-roles-for-service-accounts.md) 功能结合使用。

以下示例全部使用 [Amazon VPC CNI 插件](cni-iam-role.md)所使用的 aws-node Kubernetes 服务账户。可将*示例值*替换为您自己的服务账户、容器组（pod）、命名空间和其他资源。

1. 选择一个使用要更改其端点的服务账户的容器组（pod）。确定容器组（pod）在其中运行的 AWS 区域。将 *aws-node-6mfgv* 替换为容器组（pod）的名称，并将 *kube-system* 替换为容器组（pod）的命名空间。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep Node:
   ```

   示例输出如下。

   ```
   ip-192-168-79-166.us-west-2/192.168.79.166
   ```

   在之前的输出中，容器组（pod）在 us-west-2 AWS 区域中的节点上运行。

1. 确定容器组（pod）的服务账户使用的端点类型。

   ```
   kubectl describe pod aws-node-6mfgv -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   示例输出如下。

   ```
   AWS_STS_REGIONAL_ENDPOINTS: regional
   ```

   如果当前端点是全局端点，则输出中将返回 `global`。如果没有返回输出，则默认端点类型正在使用中且尚未被覆盖。

1. 如果您的集群或平台版本与表中列出的版本相同或晚于该版本，则可以使用以下命令之一将服务账户使用的端点类型从默认类型更改为其他类型。将 *aws-node* 替换为您的服务账户的名称，并将 *kube-system* 替换为您的服务账户的命名空间。
   + 如果您的默认或当前端点类型为全局端点类型，并且您想将其更改为区域性端点：

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=true
     ```

     如果您使用[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)，在容器组（pod）的容器中运行的应用程序中生成预签名 S3 URL，则区域端点的 URL 格式与以下示例类似：

     ```
     https://bucket.s3.us-west-2.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```
   + 如果您的默认或当前端点类型为区域性端点类型，并且您想将其更改为全局性端点：

     ```
     kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=false
     ```

     如果您的应用程序明确向 AWS STS 全局端点提出请求，且您不会覆盖在 Amazon EKS 集群中使用区域端点的默认行为，则请求将失败，并出现错误。有关更多信息，请参阅 [容器组（pod）容器收到以下错误：`An error occurred (SignatureDoesNotMatch) when calling the GetCallerIdentity operation: Credential should be scoped to a valid region`](security-iam-troubleshoot.md#security-iam-troubleshoot-wrong-sts-endpoint)。

     如果您使用[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)，在容器组（pod）的容器中运行的应用程序中生成预签名 S3 URL，则全局端点的 URL 格式与以下示例类似：

     ```
     https://bucket.s3.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...
     ```

   如果您的自动化需要特定格式的预签名 URL，或者如果您的应用程序或使用预签名 URL 的下游依赖关系对目标 AWS 区域有期望，则进行必要的更改以使用适当的 AWS STS 端点。

1. 删除并重新创建任何与服务账户关联的现有容器组（pod），以应用凭证环境变量。变更 Webhook 不会将其应用到已经在运行的容器组（pod）。您可以将 *Pods*、*kube-system* 和 *-l k8s-app=aws-node* 替换为设置注释的容器组（pod）信息。

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. 确认容器组（pod）已全部重新启动。

   ```
   kubectl get Pods -n kube-system -l k8s-app=aws-node
   ```

1. 查看其中一个容器组（pod）的环境变量。验证 `AWS_STS_REGIONAL_ENDPOINTS` 值是您在上一步中将其设置的值。

   ```
   kubectl describe pod aws-node-kzbtr -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS
   ```

   示例输出如下。

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```

# 使用 IRSA 对另一个账户进行身份验证
<a name="cross-account-access"></a>

您可以通过从其它账户的集群创建身份提供者或者使用链接的 `AssumeRole` 操作，配置跨账户 IAM 权限。在以下示例中，*账户 A* 拥有一个支持服务账户的 IAM 角色的 Amazon EKS 集群。在该集群上运行的容器组（pod）需要承担来自*账户 B* 的 IAM 权限。
+  **选项 1** 更简单，但需要账户 B 为账户 A 的集群创建和管理 OIDC 身份提供程序。
+  **选项 2 将** OIDC 管理保留在账户 A 中，但需要通过两次 `AssumeRole` 调用进行角色链式操作。

## 从其它账户的集群创建身份提供程序
<a name="_option_1_create_an_identity_provider_from_another_accounts_cluster"></a>

在此示例中，账户 A 从其集群向账户 B 提供 OpenID Connect（OIDC）颁发者 URL。账户 B 遵循[为集群创建 IAM OIDC 提供者](enable-iam-roles-for-service-accounts.md)和[为 Kubernetes 服务账户分配 IAM 角色](associate-service-account-role.md)中的说明，使用来自账户 A 集群的 OIDC 发布者 URL。然后，集群管理员注释账户 A 的集群中的服务账户以使用来自账户 B 的角色（*444455556666*）。

```
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::444455556666:role/account-b-role
```

## 选项 2：使用链式 `AssumeRole` 操作
<a name="_option_2_use_chained_assumerole_operations"></a>

在此方案中，每个账户创建一个 IAM 角色。账户 B 的角色信任账户 A，账户 A 的角色使用 OIDC 联合身份验证从集群获取凭证。然后，容器组（pod）使用 AWS CLI 配置文件将这两个角色链接在一起。

### 步骤 1：在账户 B 中创建目标角色
<a name="_step_1_create_the_target_role_in_account_b"></a>

账户 B（*444455556666*）创建一个 IAM 角色，该角色具有账户 A 集群中容器组（pod）所需的权限。账户 B 将所需权限策略附加到此角色，然后添加以下信任策略。

 **账户 B 角色的信任策略**–该策略允许账户 A 的特定 IRSA 角色承担此角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```

**重要**  
为遵循最低权限原则，请将 `Principal` ARN 替换为账户 A 中的特定角色 ARN，而不是使用账户根（`arn:aws:iam::111122223333:root`）。使用账户根将允许账户 A 中的*任何* IAM 主体承担此角色。

### 步骤 2：在账户 A 中创建 IRSA 角色
<a name="_step_2_create_the_irsa_role_in_account_a"></a>

账户 A （*111122223333*）创建具有信任策略的角色，该策略从使用集群的 OIDC 颁发者地址创建的身份提供者处获取凭证。

 **账户 A 角色的信任策略（OIDC 联合联合身份验证）**–该策略允许 EKS 集群的 OIDC 提供程序为此角色颁发凭证。

```
{
  "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"
        }
      }
    }
  ]
}
```

**重要**  
为遵循最低权限原则，请为 `sub` 声明添加 `StringEquals` 条件，以将此角色限定给特定的 Kubernetes 服务账户。在没有 `sub` 条件的情况下，集群中的任何服务账号都可以担任此角色。`sub` 值的格式为 `system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME `。例如，要将范围限定为 `default` 命名空间中名为 `my-service-account` 的服务账户：  

```
"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account"
```

### 步骤 3：将 AssumeRole 权限附加到账户 A 的角色
<a name="_step_3_attach_the_assumerole_permission_to_account_as_role"></a>

账户 A 将为步骤 2 中创建的角色附加一个权限策略。该策略允许该角色承担账户 B 的角色。

 **账户 A 角色的权限策略**–该策略授予对账户 B 目标角色的 `sts:AssumeRole` 权限。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::444455556666:role/account-b-role"
        }
    ]
}
```

### 步骤 4：配置容器组（pod）以链式使用角色
<a name="_step_4_configure_the_pod_to_chain_roles"></a>

容器组（pod）的应用程序代码使用两个配置文件担任账户 B 的角色：`account_b_role` 和 `account_a_role`。`account_b_role` 配置文件使用 `account_a_role` 配置文件作为其源。对于 AWS CLI，`~/.aws/config` 文件类似于以下内容。

```
[profile account_b_role]
source_profile = account_a_role
role_arn=arn:aws:iam::444455556666:role/account-b-role

[profile account_a_role]
web_identity_token_file = /var/run/secrets/eks.amazonaws.com/serviceaccount/token
role_arn=arn:aws:iam::111122223333:role/account-a-role
```

要为其它 AWS SDK 指定链接的配置文件，请参考所使用 SDK 的文档。有关更多信息，请参阅[用于在 AWS 上进行构建的工具](https://aws.amazon.com/developer/tools/)。

# 将 IRSA 与 AWS SDK 结合使用
<a name="iam-roles-for-service-accounts-minimum-sdk"></a>

**使用凭证**  
要使用服务账户的 IAM 角色（IRSA）凭证，代码可以使用任何 AWS SDK 为具有 SDK 的 AWS 服务创建客户端。默认情况下，SDK 会在一系列位置中搜索要使用的 AWS Identity and Access Management 凭证。如果您在创建客户端或者初始化 SDK 时未指定凭证提供程序，则将使用服务账户凭证的 IAM 角色。

由于服务账户的 IAM 角色已添加为默认凭证链中的一个步骤，因此该操作可行。如果您的工作负载当前使用凭证链中较早的证书，则即使您为同一工作负载的服务账户配置了 IAM 角色，这些凭证也将继续使用。

SDK 使用 `AssumeRoleWithWebIdentity` 操作自动将服务账户 OIDC 令牌交换为 AWS Security Token Service 中的临时凭证。Amazon EKS 和此 SDK 操作会在临时凭证到期前进行续订，从而继续轮换临时凭证。

在使用[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)时，容器组（pod）中的容器必须使用支持通过 OpenID Connect Web 身份令牌文件担任 IAM 角色的 AWS SDK 版本。请确保为您的 AWS SDK 使用以下版本或更高版本：
+ Java（版本 2）– [2.10.11](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.10.11) 
+ Java – [1.12.782](https://github.com/aws/aws-sdk-java/releases/tag/1.12.782) 
+  AWS SDK for Go v1 – [1.23.13](https://github.com/aws/aws-sdk-go/releases/tag/v1.23.13) 
+  AWS SDK for Go v2 – 所有版本均支持
+ Python (Boto3) – [1.9.220](https://github.com/boto/boto3/releases/tag/1.9.220) 
+ Python (botocore) – [1.12.200](https://github.com/boto/botocore/releases/tag/1.12.200) 
+  AWS CLI – [1.16.232](https://github.com/aws/aws-cli/releases/tag/1.16.232) 
+ 节点：[2.525.0](https://github.com/aws/aws-sdk-js/releases/tag/v2.525.0) 和 [3.27.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.27.0) 
+ Ruby – [3.58.0](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-core/CHANGELOG.md#3580-2019-07-01) 
+ C\$1\$1 – [1.7.174](https://github.com/aws/aws-sdk-cpp/releases/tag/1.7.174) 
+ .NET：[3.3.659.1](https://github.com/aws/aws-sdk-net/releases/tag/3.3.659.1)，您必须还包括 `AWSSDK.SecurityToken`。
+ PHP – [3.110.7](https://github.com/aws/aws-sdk-php/releases/tag/3.110.7) 

许多流行的 Kubernetes 附加组件（例如 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)、[使用 AWS 负载均衡器控制器的路由互联网流量](aws-load-balancer-controller.md)和[适用于 Kubernetes 的 Amazon VPC CNI 插件](cni-iam-role.md)）支持服务账户的 IAM 角色。

为了确保您使用的是受支持的 SDK，请在构建容器时按照[用于在 AWS 上进行构建的工具](https://aws.amazon.com/tools/)中针对您的首选 SDK 的安装说明操作。

## 注意事项
<a name="_considerations"></a>

### Java
<a name="_java"></a>

使用 Java 时，*必须*在类路径中包括 `sts` 模块。有关更多信息，请参阅 Java SDK 文档中的 [WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html)。

# 获取签名密钥以验证 OIDC 令牌
<a name="irsa-fetch-keys"></a>

Kubernetes 向每个 Kubernetes 服务账户发放一个 `ProjectedServiceAccountToken`。此令牌是一个 OIDC 令牌，更是一种 JSON Web 令牌（JWT）。Amazon EKS 为包含令牌的签名密钥的每个集群托管公有 OIDC 端点，这样外部系统就可以验证。

您需要获取 OIDC 公有签名密钥 [又称 JSON Web 密钥集（简称 JWKS）] 才能验证 `ProjectedServiceAccountToken`。在应用程序中使用这些密钥来验证令牌。例如，您可以使用 [PyJWT Python 库](https://pyjwt.readthedocs.io/en/latest/)来验证使用这些密钥的令牌。有关 `ProjectedServiceAccountToken` 的更多信息，请参阅 [IAM、Kubernetes 和 OpenID Connect（OIDC）背景信息](iam-roles-for-service-accounts.md#irsa-oidc-background)。

## 先决条件
<a name="_prerequisites"></a>
+ 适用于集群的现有 AWS Identity and Access Management（IAM）OpenID Connect（OIDC）提供者。要确定您是否已经拥有一个或是否要创建一个，请参阅[为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+  **AWS CLI** – 与 AWS 服务（包括 Amazon EKS）结合使用的命令行工具。有关更多信息，请参阅《AWS 命令行界面用户指南》中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。在安装 AWS CLI 后，建议您还要对其进行配置。有关更多信息，请参阅《AWS 命令行界面用户指南》中的[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。

## 过程
<a name="_procedure"></a>

1. 使用 AWS CLI 检索适用于 Amazon EKS 集群的 OIDC URL。

   ```
   $ aws eks describe-cluster --name my-cluster --query 'cluster.identity.oidc.issuer'
   "https://oidc.eks.us-west-2.amazonaws.com/id/8EBDXXXX00BAE"
   ```

1. 使用 curl 或类似工具检索公有签名密钥。结果是 [JSON Web 密钥集（JWKS）](https://www.rfc-editor.org/rfc/rfc7517#section-5)。
**重要**  
Amazon EKS 会限制对 OIDC 端点的调用。您应该缓存公共签名密钥。请遵守响应中包含的 `cache-control` 标题。
**重要**  
Amazon EKS 每七天轮换一次 OIDC 签名密钥。

   ```
   $ curl https://oidc.eks.us-west-2.amazonaws.com/id/8EBDXXXX00BAE/keys
   {"keys":[{"kty":"RSA","kid":"2284XXXX4a40","use":"sig","alg":"RS256","n":"wklbXXXXMVfQ","e":"AQAB"}]}
   ```

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

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

 *Amazon EKS 容器组身份*提供管理应用程序凭证的功能，类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置容器组（pod）来使用服务账户，而不是创建 AWS 凭证并将其分配到容器或使用 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 会在容器组的容器中设置环境变量。环境变量配置 AWS SDK（包括 AWS CLI）使用 EKS 容器组身份凭证。

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

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

**注意**  
配置为 `hostNetwork: true` 的容器组将始终具有 IMDS 访问权限，但 AWS SDK 和 CLI 在启用后将使用容器组身份凭证。
+  **可审计性** – 可通过 AWS 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）中运行的每个 AWS SDK 使用。然后，在每个节点上运行的 Amazon EKS 容器组身份代理向 SDK 发放凭证。因此，每个节点的负载减少至一次，而且不会在每个容器组中重复。有关该过程的更多详细信息，请参阅 [了解 EKS 容器组身份的工作原理](pod-id-how-it-works.md)。

有关比较两种替代方案的更多信息，请参阅 [使用 Kubernetes 服务账户授予 Kubernetes 工作负载访问 AWS 的权限](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）使用服务账户访问 AWS 服务](pod-id-configure-pods.md)：为需要访问 AWS 服务的每个容器组（pod）完成此步骤。

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

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

## 注意事项
<a name="pod-id-considerations"></a>
+  **IAM 角色关联**：集群中的每个 Kubernetes 服务账户都可以与集群相同的 AWS 账户中的一个 IAM 角色相关联。要更改该角色，请编辑 EKS 容器组身份关联。要进行跨账户访问，请使用 IAM 角色向该角色委派访问权限。要了解更多信息，请参阅《IAM 用户指南》**中的[使用 IAM 角色委托跨 AWS 账户的访问权限](https://docs.aws.amazon.com/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.aws.amazon.com/eks/latest/userguide/pod-id-agent-config-ipv6.html)。
+  **最终一致性**：EKS 容器组身份关联最终保持一致，API 调用后可能会有几秒钟的延迟。避免在关键的高可用性代码路径中创建或更新关联。相反，应在单独的、不太频繁的初始化或设置例程中执行这些操作。要了解更多信息，请参阅《EKS Best Practices Guide》**中的 [Security Groups Per Pod](https://docs.aws.amazon.com/eks/latest/best-practices/sgpp.html)。
+  **代理和安全组注意事项**：对于使用代理的容器组，请将 `169.254.170.23`（IPv4）和 `[fd00:ec2::23]`（IPv6）添加到 `no_proxy/NO_PROXY` 环境变量，以防止对 EKS 容器组身份代理的请求失败。如果容器组的安全组与 AWS VPC CNI 一起使用，则请将 `ENABLE_POD_ENI` 标志设置为“true”，`POD_SECURITY_GROUP_ENFORCING_MODE` 标志设置为“standard”。要了解更多信息，请参阅[将安全组分配给各个容器组](https://docs.aws.amazon.com/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 容器组身份不适用于：
+  AWS Outposts。
+ Amazon EKS Anywhere。
+ 您在 Amazon EC2 上创建和运行的 Kubernetes 集群。EKS 容器组身份组件仅在 Amazon EKS 上可用。

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

# 了解 EKS 容器组身份的工作原理
<a name="pod-id-how-it-works"></a>

Amazon EKS 容器组身份关联提供管理应用程序凭证的功能，类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。

Amazon EKS 容器组身份通过额外的 *EKS Auth* API，以及在每个节点上运行的代理容器组为您的工作负载提供凭证。

在您的插件中，例如，*Amazon EKS 插件*和自我管理控制器、运算符和其他插件，创建者需要更新软件才能使用最新的 AWS SDK。有关 EKS 容器组身份与 Amazon EKS 插件之间的兼容性列表，请参阅上一节 [EKS 容器组身份限制](pod-identities.md#pod-id-restrictions)。

## 在代码中使用 EKS 容器组身份
<a name="pod-id-credentials"></a>

在您的代码中，您可以使用 AWS SDK 访问 AWS 服务。您可以编写代码，为使用 SDK 的 AWS 服务创建客户端，默认情况下，SDK 会在一系列位置中搜索要使用的 AWS Identity and Access Management 凭证。找到有效凭证后，搜索停止。有关使用的默认位置的更多信息，请参阅《AWS SDK 和工具参考指南》中的[凭证提供程序链](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html#credentialProviderChain)。

EKS 容器组身份已添加到*容器凭证提供程序*，可在默认凭证链的一个步骤中搜索。如果您的工作负载当前使用凭证链中较早的证书，则即使您为同一工作负载配置了 EKS 容器组身份关联，这些凭证也将继续使用。这样，在删除旧凭证之前，您可以先创建关联，从而安全地从其他类型的凭证迁移。

容器凭证提供程序从每个节点上运行的代理处提供临时凭证。在 Amazon EKS 中，代理是 Amazon EKS 容器组身份，而在 Amazon Elastic Container Service 中，代理则是 `amazon-ecs-agent`。SDK 使用环境变量来定位要连接的代理。

相比之下，*服务账户的 IAM 角色*提供了一个 *Web 身份*令牌，AWS SDK 必须使用 `AssumeRoleWithWebIdentity` 与 AWS Security Token Service 进行交换。

## EKS 容器组身份代理如何使用容器组（pod）
<a name="pod-id-agent-pod"></a>

1. 当 Amazon EKS 启动一个新的容器组（pod），而该容器组使用与 EKS 容器组身份关联的服务账户时，集群将添加以下内容到容器组清单中：

   ```
       env:
       - name: AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE
         value: "/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token"
       - name: AWS_CONTAINER_CREDENTIALS_FULL_URI
         value: "http://169.254.170.23/v1/credentials"
       volumeMounts:
       - mountPath: "/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/"
         name: eks-pod-identity-token
     volumes:
     - name: eks-pod-identity-token
       projected:
         defaultMode: 420
         sources:
         - serviceAccountToken:
             audience: pods.eks.amazonaws.com
             expirationSeconds: 86400 # 24 hours
             path: eks-pod-identity-token
   ```

1. Kubernetes 选择要在哪个节点上运行容器组（pod）。然后，节点上的 Amazon EKS 容器组身份代理使用 [AssumeRoleForPodIdentity](https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html) 操作从 EKS Auth API 检索临时凭证。

1. EKS 容器组身份代理可为在容器中运行的 AWS SDK 提供这些凭证。

1. 在应用程序中使用 SDK 时，无需指定凭证提供程序使用默认凭证链。或者，您可以指定容器凭证提供程序。有关使用的默认位置的更多信息，请参阅《AWS SDK 和工具参考指南》中的[凭证提供程序链](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html#credentialProviderChain)。

1. SDK 使用环境变量连接到 EKS 容器组身份代理并检索凭证。
**注意**  
如果您的工作负载当前使用凭证链中较早的证书，则即使您为同一工作负载配置了 EKS 容器组身份关联，这些凭证也将继续使用。

# 设置 Amazon EKS 容器组身份代理
<a name="pod-id-agent-setup"></a>

Amazon EKS 容器组身份关联提供管理应用程序凭证的功能，类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。

Amazon EKS 容器组身份通过额外的 *EKS Auth* API，以及在每个节点上运行的代理容器组为您的工作负载提供凭证。

**提示**  
您无需在 EKS 自动模式集群上安装 EKS 容器组身份代理。此功能已内置在 EKS 自动模式中。

## 注意事项
<a name="pod-id-agent-considerations"></a>
+ 默认情况下，EKS 容器组身份代理预安装在 EKS 自动模式集群上。要了解更多信息，请参阅[使用 EKS 自动模式实现集群基础设施自动化](automode.md)。
+ 默认情况下，EKS 容器组身份代理会侦听 `IPv4` 和 `IPv6` 地址，以便为容器组请求凭证。对于 `IPv4`，代理会使用环回（本地主机）IP 地址 `169.254.170.23`，对于 `IPv6`，则会使用本地主机 IP 地址 `[fd00:ec2::23]`。
+ 如果禁用 `IPv6` 地址或以其它方式阻止本地主机 `IPv6` IP 地址，代理将无法启动。要在无法使用 `IPv6` 的节点上启动代理，请按照 [在 EKS 容器组身份代理中禁用 `IPv6`](pod-id-agent-config-ipv6.md) 中的步骤禁用 `IPv6` 配置。

## 创建 Amazon EKS 容器组身份代理
<a name="pod-id-agent-add-on-create"></a>

### 代理先决条件
<a name="pod-id-agent-prereqs"></a>
+ 现有 Amazon EKS 集群。要部署一个角色，请参阅[开始使用 Amazon EKS](getting-started.md)。集群版本和平台版本必须与 [EKS 容器组身份集群版本](pod-identities.md#pod-id-cluster-versions)中列出的版本相同或更高。
+ 节点角色有权让代理在 EKS Auth API 中执行 `AssumeRoleForPodIdentity` 操作。您可以使用 [AWS 托管式策略：AmazonEKSWorkerNodePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-amazoneksworkernodepolicy)，或添加类似如下的自定义策略：

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "eks-auth:AssumeRoleForPodIdentity"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

  可通过标签来限制此操作，以限制使用代理的容器组可以分派哪些角色。
+ 节点可以访问 Amazon ECR 并从中下载映像。该附加组件的容器映像位于[查看 Amazon EKS 附加组件的 Amazon 容器映像注册表](add-ons-images.md)中列出的注册表中。

  请注意，您可以在 AWS 管理控制台 中的**可选配置设置**，以及 AWS CLI 中的 `--configuration-values` 更改映像位置并为 EKS 附加组件提供 `imagePullSecrets`。
+ 节点可以访问 Amazon EKS Auth API。对于私有集群，AWS PrivateLink 中的 `eks-auth` 端点是必需的。

### 使用 AWS 控制台设置代理
<a name="setup_agent_with_shared_aws_console"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后为您要配置 EKS 容器组身份代理插件的集群选择集群名称。

1. 选择**附加组件**选项卡。

1. 选择**获取更多附加组件**。

1. 选择 EKS 容器组身份代理插件框右上角的框，然后选择**下一步**。

1. 在**配置选定插件设置**页面上，从**版本**下拉列表中选择任意版本。

1. （可选）展开**可选配置设置**以输入其他配置。例如，您可以提供备用容器映像位置和 `ImagePullSecrets`。带有已接受键的 JSON 架构显示在**附加组件配置架构**中。

   在**配置值**中输入配置键和值。

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

1. 确认 EKS 容器组身份代理容器组正在您的集群上运行。

   ```
   kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
   ```

   示例输出如下。

   ```
   eks-pod-identity-agent-gmqp7                                          1/1     Running   1 (24h ago)   24h
   eks-pod-identity-agent-prnsh                                          1/1     Running   1 (24h ago)   24h
   ```

   现在，您可以在集群中使用 EKS 容器组身份关联。有关更多信息，请参阅 [向 Kubernetes 服务账户分配 IAM 角色](pod-id-association.md)。

### 使用 AWS CLI 设置代理
<a name="setup_agent_with_shared_aws_cli"></a>

1. 运行以下 AWS CLI 命令。将 `my-cluster` 替换为您的集群名称。

   ```
   aws eks create-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent --addon-version v1.0.0-eksbuild.1
   ```
**注意**  
EKS 容器组身份代理不将 `service-account-role-arn` 用于*服务账户的 IAM 角色*。您必须为 EKS 容器组身份代理提供节点角色的权限。

1. 确认 EKS 容器组身份代理容器组正在您的集群上运行。

   ```
   kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
   ```

   示例输出如下。

   ```
   eks-pod-identity-agent-gmqp7                                          1/1     Running   1 (24h ago)   24h
   eks-pod-identity-agent-prnsh                                          1/1     Running   1 (24h ago)   24h
   ```

   现在，您可以在集群中使用 EKS 容器组身份关联。有关更多信息，请参阅 [向 Kubernetes 服务账户分配 IAM 角色](pod-id-association.md)。

# 向 Kubernetes 服务账户分配 IAM 角色
<a name="pod-id-association"></a>

本主题介绍如何配置 Kubernetes 服务账户，以便使用 EKS 容器组身份担任 AWS Identity and Access Management（IAM）角色。然后，配置为使用服务账户的任何容器组（pod）都可以访问该角色有权访问的任何 AWS 服务。

要创建 EKS 容器组身份关联，只需一步；您可以通过 AWS 管理控制台、AWS CLI、AWS SDK、AWS CloudFormation，以及其它工具在 EKS 中创建关联。任何 Kubernetes 对象中都没有关于集群内关联的任何数据或元数据，也不需要向服务账户添加任何注释。

 **先决条件** 
+ 现有集群。如果您没有，可以按照[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 创建关联的 IAM 主体必须具有 `iam:PassRole`。
+ 在您的设备或 AWS CLI 上安装和配置的最新版本 AWS CloudShell。您可以使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1` 检查您的当前版本。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

## 创建容器组身份关联（AWS 控制台）
<a name="pod-id-association-create"></a>

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后为您要配置 EKS 容器组身份代理插件的集群选择集群名称。

1. 选择**访问**选项卡。

1. 在**容器组身份关联**中，选择**创建**。

1. 对于 **IAM 角色**，选择具有工作负载所需权限的 IAM 角色。
**注意**  
该列表仅包含具有以下信任策略的角色，该策略允许 EKS 容器组身份使用这些角色。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   ```

    `sts:AssumeRole` – 在将临时凭证传递给您的容器组之前，EKS 容器组身份使用 `AssumeRole` 分派 IAM 角色。

    `sts:TagSession` – EKS 容器组身份使用 `TagSession` 在对 AWS STS 的请求中包含*会话标签*。

   您可以在信任策略的*条件键*中使用这些标签，来限制哪些服务账户、命名空间和集群可以使用此角色。

   有关 Amazon EKS 条件键的列表，请参阅《Service Authorization Reference》**中的 [Conditions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-policy-keys)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Actions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。

1. 对于 **Kubernetes 命名空间**，选择包含服务账户和工作负载的 Kubernetes 命名空间。或者，您可以按名称指定集群中不存在的命名空间。

1. 对于 **Kubernetes 服务账户**，选择要使用的 Kubernetes 服务账户。Kubernetes 工作负载清单必须指定此服务账户。或者，您可以按名称指定集群中不存在的服务账户。

1. （可选）选择**禁用会话标签**以禁用容器组身份在担任角色时自动添加的默认会话标签。

1. （可选）切换**配置会话策略**，以配置 IAM 策略，以便对这个容器组身份关联施加超出附加到 IAM 角色的 IAM 策略所定义权限的额外限制。
**注意**  
只有在**禁用会话标签**设置被选中的情况下，才能应用会话策略。

1. （可选）对于**标签**，选择**添加标签**以在键值对中添加元数据。这些标签将应用于关联，并可在 IAM 策略中使用。

   您可以重复此步骤以添加多个标签。

1. 选择**创建**。

## 创建容器组身份关联（AWS CLI）
<a name="create_a_pod_identity_association_shared_aws_cli"></a>

1. 要将现有 IAM 策略关联到您的 IAM 角色，请跳至下一步。

   创建一个 IAM 策略。您可以创建自己的策略，也可以复制已授予您部分所需权限的 AWS 托管策略，并根据您的特定要求对其进行自定义。有关更多信息，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

   1. 创建一个文件，其中包含您希望容器组（pod）访问的 AWS 服务所需的权限。有关所有 AWS 服务的所有操作的列表，请参阅[服务授权参考](https://docs.aws.amazon.com/service-authorization/latest/reference/)。

      您可以运行以下命令创建一个示例策略文件，以实现对 Amazon S3 存储桶的只读访问权限。您可以选择将配置信息或引导脚本存储在此存储桶中，并且容器组（pod）中的容器可以从存储桶读取文件并将其加载到应用程序中。如果您要创建此示例策略，请将以下内容复制到您的设备。将 *my-pod-secrets-bucket* 替换为您的存储桶名称并运行该命令。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
              }
          ]
      }
      ```

   1. 创建 IAM 策略。

      ```
      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
      ```

1. 创建 IAM 角色并将其与 Kubernetes 服务账户关联。

   1. 如果您有要担任 IAM 角色的现有 Kubernetes 服务账户，则可跳过此步骤。

      创建一个 Kubernetes 服务账户。将以下内容复制到您的设备。将 *my-service-account* 替换为所需的名称，如有必要，将 *default* 替换为其他命名空间。如更改 *default*，则命名空间必须已经存在。

      ```
      cat >my-service-account.yaml <<EOF
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: my-service-account
        namespace: default
      EOF
      kubectl apply -f my-service-account.yaml
      ```

      运行如下命令。

      ```
      kubectl apply -f my-service-account.yaml
      ```

   1. 运行以下命令为 IAM 角色创建信任策略文件。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "pods.eks.amazonaws.com"
                  },
                  "Action": [
                      "sts:AssumeRole",
                      "sts:TagSession"
                  ]
              }
          ]
      }
      ```

   1. 创建角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-role-description* 替换为您的角色的描述。

      ```
      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
      ```

   1. 将 IAM 策略附加到您的角色。将 *my-role* 替换为您的 IAM 角色的名称，并将 *my-policy* 替换为您创建的现有策略的名称。

      ```
      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::111122223333:policy/my-policy
      ```
**注意**  
与服务账户的 IAM 角色不同，EKS 容器组身份不在服务账户上使用注释。

   1. 运行以下命令以创建关联。将 `my-cluster` 替换为集群的名称，将 *my-service-account* 替换为您所需的名称，并根据需要将 *default* 替换为其他命名空间。

      ```
      aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account
      ```

      示例输出如下。

      ```
      {
          "association": {
              "clusterName": "my-cluster",
              "namespace": "default",
              "serviceAccount": "my-service-account",
              "roleArn": "arn:aws:iam::111122223333:role/my-role",
              "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1",
              "associationId": "a-abcdefghijklmnop1",
              "tags": {},
              "createdAt": 1700862734.922,
              "modifiedAt": 1700862734.922
          }
      }
      ```
**注意**  
您可以按名称指定集群中不存在的命名空间和服务账户。您必须创建命名空间、服务账户，以及使用服务账户的工作负载，EKS 容器组身份关联才能正常工作。

## 确认配置
<a name="pod-id-confirm-role-configuration"></a>

1. 确认 IAM 角色的信任策略配置正确。

   ```
   aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
   ```

   示例输出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Allow EKS Auth service to assume this role for Pod Identities",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   ```

1. 确认您在上一步中附加到角色的策略已附加到该角色。

   ```
   aws iam list-attached-role-policies --role-name my-role --query 'AttachedPolicies[].PolicyArn' --output text
   ```

   示例输出如下。

   ```
                  arn:aws:iam::111122223333:policy/my-policy
   ```

1. 设置一个变量以存储要使用策略的 Amazon 资源名称（ARN）。将 *my-policy* 替换为要确认其权限的策略的名称。

   ```
   export policy_arn=arn:aws:iam::111122223333:policy/my-policy
   ```

1. 查看该策略的默认版本。

   ```
   aws iam get-policy --policy-arn $policy_arn
   ```

   示例输出如下。

   ```
   {
       "Policy": {
           "PolicyName": "my-policy",
           "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
           "Arn": "arn:aws:iam::111122223333:policy/my-policy",
           "Path": "/",
           "DefaultVersionId": "v1",
           [...]
       }
   }
   ```

1. 查看策略内容以确保该策略包含容器组（pod）所需的所有权限。如有必要，将以下命令中的 *1* 替换为上一个输出中返回的版本。

   ```
   aws iam get-policy-version --policy-arn $policy_arn --version-id v1
   ```

   示例输出如下。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
           }
       ]
   }
   ```

   如果您在上一步中创建了示例策略，则您的输出与示例相同。如果您创建了其他策略，则与*示例*内容不同。

## 后续步骤
<a name="_next_steps"></a>

 [配置容器组（pod）使用服务账户访问 AWS 服务](pod-id-configure-pods.md) 

# 使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源
<a name="pod-id-assign-target-role"></a>

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

## 先决条件
<a name="_prerequisites"></a>

在开始之前，请确保您已完成以下步骤：
+  [设置 Amazon EKS 容器组身份代理](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html) 
+  [创建 EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) 

## 工作方式
<a name="_how_it_works"></a>

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

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

## 缓存注意事项
<a name="_caching_considerations"></a>

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

## 第 1 步：创建并关联目标 IAM 角色
<a name="_step_1_create_and_associate_a_target_iam_role"></a>

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

### 创建目标 IAM 角色
<a name="_create_the_target_iam_role"></a>

1. 打开 [Amazon IAM 控制台](https://console.aws.amazon.com/iam/home)。

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

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

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

1. 选择**其他 AWS 账户**，输入 AWS 账号（[EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)所在的账户账号），然后选择**下一步**。

1. 添加要与该角色关联的权限策略（例如 AmazonS3FullAccess），然后选择**下一步**。

1. 输入 `MyCustomIAMTargetRole` 等角色名称，然后选择**创建角色**。

### 更新目标 IAM 角色的信任策略
<a name="_update_the_target_iam_role_trust_policy"></a>

1. 创建角色后，您将返回到**角色**列表。查找并选择您在上一步中创建的新角色（例如 `MyCustomIAMTargetRole`）。

1. 选择**信任关系**选项卡。

1. 点击右侧的**编辑信任策略**。

1. 在策略编辑器中，将默认 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:RequestTag/eks-cluster-arn": "arn:aws:eks:us-east-1:111122223333:cluster/example-cluster",
          "aws:RequestTag/kubernetes-namespace": "ExampleNameSpace",
          "aws:RequestTag/kubernetes-service-account": "ExampleServiceAccountName"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    }
  ]
}
```

上述策略允许来自 AWS 账户 111122223333，并带有相关 [EKS 容器组身份会话标签](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html)的角色 `eks-pod-identeity-primary-role` 代入此角色。

如果您在 EKS 容器组身份中[禁用会话标签](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html#pod-id-abac-tags)，则在代入目标角色时，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 容器组身份角色的权限策略
<a name="_update_the_permission_policy_for_eks_pod_identity_role"></a>

在此步骤中，您将通过添加目标 IAM 角色 ARN 作为资源，来更新 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)（与 Amazon EKS 集群关联）的权限策略。

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后选择 EKS 集群名称。

1. 选择**访问**选项卡。

1. 在**容器组身份关联**下，选择 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)。

1. 依次选择**权限**、**添加权限**，然后选择**创建内联策略**。

1. 选择右侧的 **JSON**。

1. 在策略编辑器中，将默认 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 服务账户
<a name="_step_2_associate_the_target_iam_role_to_a_kubernetes_service_account"></a>

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

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

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

1. 选择**访问**选项卡。

1. 在**容器组身份关联**中，选择**创建**。

1. 在 **IAM 角色**中选择供工作负载代入的 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)。

1. 在**目标 IAM 角色**中选择将由 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)代入的目标 IAM 角色。

1. 在 **Kubernetes 命名空间**字段中，输入要在其中创建关联的命名空间名称（例如 `my-app-namespace`），这将定义服务账户所在的位置。

1. 在 **Kubernetes 服务账户**字段中，输入将使用 IAM 凭证的服务账户名称（例如 `my-service-account`）。这会将 IAM 角色链接到服务账号。

1. （可选）选择**禁用会话标签**以禁用容器组身份在担任角色时自动添加的默认会话标签。

1. （可选）切换**配置会话策略**，以配置 IAM 策略，以便对这个容器组身份关联施加超出附加到**目标 IAM 角色**的 IAM 策略所定义权限的额外限制。
**注意**  
1. 只有在**禁用会话标签**设置被选中的情况下，才能应用会话策略。2. 如果您指定会话策略，则策略限制适用于**目标 IAM 角色**的权限，而不是与此容器组身份关联相关联的 **IAM 角色**。

1. 选择**创建**以创建关联。

# 配置容器组（pod）使用服务账户访问 AWS 服务
<a name="pod-id-configure-pods"></a>

如果容器组（pod）需要访问 AWS 服务，则必须配置它来使用 Kubernetes 服务账户。服务账户必须关联到有权访问 AWS 服务的 AWS Identity and Access Management（IAM）角色。
+ 现有集群。如果还没有，可以使用[开始使用 Amazon EKS](getting-started.md) 中的指南之一创建一个。
+ 现有 Kubernetes 服务账户和 EKS 容器组身份关联（将服务账户与 IAM 角色关联）。该角色必须具有关联的 IAM 策略，其中包含您希望容器组（pod）必须具有的权限，以便使用 AWS 服务。有关如何创建和配置服务账户和角色的更多信息，请参阅 [向 Kubernetes 服务账户分配 IAM 角色](pod-id-association.md)。
+ 在您的设备或 AWS CLI 上安装和配置的最新版本 AWS CloudShell。您可以使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1` 检查您的当前版本。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 AWS CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。
+ 包含集群配置的现有 `kubectl` `config` 文件。要创建 `kubectl` `config` 文件，请参阅 [通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群](create-kubeconfig.md)。

  1. 使用以下命令创建部署清单，您可以使用该部署清单部署容器组（pod）来确认配置。将示例值替换为您自己的值。

     ```
     cat >my-deployment.yaml <<EOF
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: my-app
     spec:
       selector:
         matchLabels:
           app: my-app
       template:
         metadata:
           labels:
             app: my-app
         spec:
           serviceAccountName: my-service-account
           containers:
           - name: my-app
             image: public.ecr.aws/nginx/nginx:X.XX
     EOF
     ```

  1. 将清单部署到集群。

     ```
     kubectl apply -f my-deployment.yaml
     ```

  1. 确认容器组（pod）具有所需的环境变量。

     1. 按上一步部署后，查看部署的容器组（pod）。

        ```
        kubectl get pods | grep my-app
        ```

        示例输出如下。

        ```
        my-app-6f4dfff6cb-76cv9   1/1     Running   0          3m28s
        ```

     1. 确认容器组（pod）已挂载服务账户令牌。

        ```
        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:
        ```

        示例输出如下。

        ```
        AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:  /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token
        ```

  1. 确认您的容器组（pod）可以使用您在附加到角色的 IAM 策略中分配的权限与 AWS 服务进行交互。
**注意**  
当容器组（pod）使用来自与服务账户关联的 IAM 角色的 AWS 凭证时，该容器组（pod）中的 AWS CLI 或其他 SDK 包仅使用该角色提供的凭证。如果您不限制对提供给 [Amazon EKS 节点 IAM 角色](create-node-role.md)的凭证的访问，容器组（pod）仍然可以访问这些凭证。有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     如果您的容器组（pod）无法按预期与服务进行交互，请完成以下步骤，确认所有配置都正确。

     1. 确认容器组（pod）使用的 AWS SDK 版本支持通过 EKS 容器组身份关联担任 IAM 角色。有关更多信息，请参阅 [将容器组身份与 AWS SDK 结合使用](pod-id-minimum-sdk.md)。

     1. 确认部署正在使用服务账户。

        ```
        kubectl describe deployment my-app | grep "Service Account"
        ```

        示例输出如下。

        ```
        Service Account:  my-service-account
        ```

# 基于标签授予容器组（pod）对 AWS 资源的访问权限
<a name="pod-id-abac"></a>

基于属性的访问权限控制（ABAC）通过将各种属性组合在一起的策略向用户授予权限。EKS 容器组身份将标签附加到每个容器组（pod）的临时凭证上，其中包含集群名称、命名空间、服务账户名称等属性。这些角色会话标签允许管理员根据匹配的标签访问 AWS 资源，从而使管理员能够创建可跨服务账户使用的单一角色。通过添加对角色会话标签的支持，您可以在集群之间和集群内的工作负载之间实施更严格的安全边界，同时重复使用相同的 IAM 角色和 IAM 策略。

## 带标签的示例策略
<a name="_sample_policy_with_tags"></a>

以下是一个 IAM 策略示例，该策略会在相应对象标有 EKS 集群名称时授予 `s3:GetObject` 权限。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/eks-cluster-name": "${aws:PrincipalTag/eks-cluster-name}"
                }
            }
        }
    ]
}
```

## 启用或禁用会话标签
<a name="pod-id-abac-tags"></a>

EKS 容器组身份会在代入角色时添加一组预定义的会话标签。这些会话标签允许管理员根据匹配的标签访问 AWS 资源，从而使管理员能够创建可跨资源使用的单一角色。

### 启用会话标签
<a name="_enable_session_tags"></a>

会话标签将通过 EKS 容器组身份自动启用，您无需执行任何操作。默认情况下，EKS 容器组身份会将一组预定义标签附加到会话。要在策略中引用这些标签，请使用语法 `${aws:PrincipalTag/`，后跟标签键。例如 `${aws:PrincipalTag/kubernetes-namespace}`。
+  `eks-cluster-arn` 
+  `eks-cluster-name` 
+  `kubernetes-namespace` 
+  `kubernetes-service-account` 
+  `kubernetes-pod-name` 
+  `kubernetes-pod-uid` 

### 禁用会话标签
<a name="_disable_session_tags"></a>

 AWS 会将内联会话策略、托管策略 ARN 和会话标签压缩为具有单独限制的打包二进制格式。如果您收到 `PackedPolicyTooLarge` 错误消息，表明打包二进制格式超出了大小限制，则可通过禁用由 EKS 容器组身份添加的会话标签来减小大小。要禁用这些会话标签，请执行以下步骤：

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后选择要修改的集群名称。

1. 选择**访问**选项卡。

1. 在**容器组身份关联**中，在**关联 ID** 中选择要修改的关联 ID，然后选择**编辑**。

1. 在**会话标签**下，选择**禁用会话标签**。

1. 选择**保存更改**。

## 跨账户标签
<a name="pod-id-abac-chaining"></a>

EKS 容器组身份添加的所有会话标签都是*可传递*的；将标签键和值传递到任何 `AssumeRole` 操作，以便您的工作负载用于将角色切换到其他账户。您可以在其他账户的策略中使用这些标签，来限制跨账户场景中的访问。有关更多信息，请参阅《IAM 用户指南》**中的[使用会话标签链接角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining)。

## 自定义标签
<a name="pod-id-abac-custom-tags"></a>

EKS 容器组身份无法在其执行的 `AssumeRole` 操作中添加其它自定义标签。但是，应用于 IAM 角色的标签始终可通过相同格式引用：`${aws:PrincipalTag/` 后跟键，例如 `${aws:PrincipalTag/MyCustomTag}`。

**注意**  
如果发生冲突，通过 `sts:AssumeRole` 请求添加到会话中的标签优先。例如，假设：  
EKS 代入客户角色时，Amazon EKS 向会话添加键 `eks-cluster-name` 和值 `my-cluster`
您向 IAM 角色添加了一个值为 `my-own-cluster` 的 `eks-cluster-name` 标签。
在这种情况下，前者优先，`eks-cluster-name` 标签的值为 `my-cluster`。

# 将容器组身份与 AWS SDK 结合使用
<a name="pod-id-minimum-sdk"></a>

## 使用 EKS 容器组身份凭证
<a name="pod-id-using-creds"></a>

要使用来自 EKS 容器组身份关联的凭证，您的代码可以使用任何 AWS SDK 为具有 SDK 的 AWS 服务创建客户端，默认情况下，SDK 会在一系列位置中搜索要使用的 AWS Identity and Access Management 凭证。如果您在创建客户端或者初始化 SDK 时未指定凭证提供程序，则将使用 EKS 容器组身份凭证。

由于 EKS 容器组身份已添加到*容器凭证提供程序*，可在默认凭证链的一个步骤中搜索，因此该操作可行。如果您的工作负载当前使用凭证链中较早的证书，则即使您为同一工作负载配置了 EKS 容器组身份关联，这些凭证也将继续使用。

有关 EKS 容器组身份如何工作的更多信息，请参阅 [了解 EKS 容器组身份的工作原理](pod-id-how-it-works.md)。

在使用[了解 EKS 容器组身份如何向容器组（pod）授予对 AWS 服务的访问权限](pod-identities.md)时，容器组中的容器必须使用支持从 EKS 容器组身份代理担任 IAM 角色的 AWS SDK 版本。请确保为您的 AWS SDK 使用以下版本或更高版本：
+ Java（版本 2）：[2.21.30](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.21.30) 
+ Java – [1.12.746](https://github.com/aws/aws-sdk-java/releases/tag/1.12.746) 
+ Go v1：[v1.47.11](https://github.com/aws/aws-sdk-go/releases/tag/v1.47.11) 
+ Go v2：[release-2023-11-14](https://github.com/aws/aws-sdk-go-v2/releases/tag/release-2023-11-14) 
+ Python（Boto3）– [1.34.41](https://github.com/boto/boto3/releases/tag/1.34.41) 
+ Python (botocore) – [1.34.41](https://github.com/boto/botocore/releases/tag/1.34.41) 
+  AWS CLI – [1.30.0](https://github.com/aws/aws-cli/releases/tag/1.30.0) 

   AWS CLI – [2.15.0](https://github.com/aws/aws-cli/releases/tag/2.15.0) 
+ JavaScript v2 – [2.1550.0](https://github.com/aws/aws-sdk-js/releases/tag/v2.1550.0) 
+ JavaScript v3 – [v3.458.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.458.0) 
+ Kotlin – [v1.0.1](https://github.com/awslabs/aws-sdk-kotlin/releases/tag/v1.0.1) 
+ Ruby：[3.188.0](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-core/CHANGELOG.md#31880-2023-11-22) 
+ Rust – [release-2024-03-13](https://github.com/awslabs/aws-sdk-rust/releases/tag/release-2024-03-13) 
+ C\$1\$1 – [1.11.263](https://github.com/aws/aws-sdk-cpp/releases/tag/1.11.263) 
+ .NET – [3.7.734.0](https://github.com/aws/aws-sdk-net/releases/tag/3.7.734.0) 
+ PowerShell – [4.1.502](https://www.powershellgallery.com/packages/AWS.Tools.Common/4.1.502) 
+ PHP：[3.289.0](https://github.com/aws/aws-sdk-php/releases/tag/3.287.1) 

为了确保您使用的是受支持的 SDK，请在构建容器时按照[用于在 AWS 上进行构建的工具](https://aws.amazon.com/tools/)中针对您的首选 SDK 的安装说明操作。

有关支持 EKS 容器组身份的附加组件列表，请参阅 [容器组身份支持参考](retreive-iam-info.md#pod-id-add-on-versions)。

# 在 EKS 容器组身份代理中禁用 `IPv6`
<a name="pod-id-agent-config-ipv6"></a>

## AWS 管理控制台
<a name="pod-id-console"></a>

1. 要在 EKS 容器组身份代理中禁用 `IPv6`，请将以下配置添加到 EKS 附加组件的**可选配置设置**中。

   1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

   1. 在左侧导航窗格中，选择 **Clusters**（集群），然后选择要为其配置附加组件的集群的名称。

   1. 选择**附加组件**选项卡。

   1. 选择 EKS 容器组身份代理附加组件框右上角的框，然后选择**编辑**。

   1. 在**配置 EKS 容器组身份代理**页面上：

      1. 选择您想使用的**版本**。我们建议您保留与上一步相同的版本，并通过单独的操作更新版本和配置。

      1. 展开**可选配置设置**。

      1. 在**配置值**中输入 JSON 键 `"agent":`，以及键为 `"additionalArgs":` 的嵌套 JSON 对象的值。生成的文本必须是有效的 JSON 对象。如果此键和值是文本框中的唯一数据，请用大括号 `{ }` 将键和值括起来。以下示例显示网络策略已启用：

         ```
         {
             "agent": {
                 "additionalArgs": {
                     "-b": "169.254.170.23"
                 }
             }
         }
         ```

         此配置会将 `IPv4` 地址设置为代理所使用的唯一地址。

   1. 要通过替换 EKS 容器组身份代理容器组来应用新配置，请选择**保存更改**。

      Amazon EKS 通过*推出*适用于 EKS 容器组身份代理的 Kubernetes `DaemonSet`，将更改应用到 EKS 附加组件。可在 AWS 管理控制台 中的附加组件**更新历史记录**中跟踪推出状态和 `kubectl rollout status daemonset/eks-pod-identity-agent --namespace kube-system`。

       `kubectl rollout` 具有以下命令：

      ```
      $ kubectl rollout
      
      history  -- View rollout history
      pause    -- Mark the provided resource as paused
      restart  -- Restart a resource
      resume   -- Resume a paused resource
      status   -- Show the status of the rollout
      undo     -- Undo a previous rollout
      ```

      如果推出时间过长，Amazon EKS 将撤销推出，并且会将类型为**附加组件更新**且状态为**失败**的消息添加到附加组件的**更新历史记录**中。要调查任何问题，请先查看推出历史记录，然后在 EKS 容器组身份代理容器组上运行 `kubectl logs`，进而查看 EKS 容器组身份代理的日志。

1. 如果**更新历史记录**中的新条目状态为**成功**，则表示推出已完成，并且附加组件正在所有 EKS 容器组身份代理容器组中使用新配置。

## AWS CLI
<a name="pod-id-cli"></a>

1. 要在 EKS 容器组身份代理中禁用 `IPv6`，请将以下配置添加到 EKS 附加组件的**配置值**中。

   运行以下 AWS CLI 命令。将 `my-cluster` 替换为集群的名称，并将 IAM 角色 ARN 替换为您正在使用的角色。

   ```
   aws eks update-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent \
       --resolve-conflicts PRESERVE --configuration-values '{"agent":{"additionalArgs": { "-b": "169.254.170.23"}}}'
   ```

   此配置会将 `IPv4` 地址设置为代理所使用的唯一地址。

   Amazon EKS 通过*推出*适用于 EKS 容器组身份代理的 Kubernetes DaemonSet，将更改应用到 EKS 附加组件。可在 AWS 管理控制台 中的附加组件**更新历史记录**中跟踪推出状态和 `kubectl rollout status daemonset/eks-pod-identity-agent --namespace kube-system`。

    `kubectl rollout` 具有以下命令：

   ```
   kubectl rollout
   
   history  -- View rollout history
   pause    -- Mark the provided resource as paused
   restart  -- Restart a resource
   resume   -- Resume a paused resource
   status   -- Show the status of the rollout
   undo     -- Undo a previous rollout
   ```

   如果推出时间过长，Amazon EKS 将撤销推出，并且会将类型为**附加组件更新**且状态为**失败**的消息添加到附加组件的**更新历史记录**中。要调查任何问题，请先查看推出历史记录，然后在 EKS 容器组身份代理容器组上运行 `kubectl logs`，进而查看 EKS 容器组身份代理的日志。

# 创建具有 EKS 容器组身份所需信任策略的 IAM 角色
<a name="pod-id-role"></a>

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}
```

 ** `sts:AssumeRole` **   
在将临时凭证传递给您的容器组之前，EKS 容器组身份使用 `AssumeRole` 分派 IAM 角色。

 ** `sts:TagSession` **   
EKS 容器组身份使用 `TagSession` 在对 AWS STS 的请求中包含*会话标签*。

 **设置条件**   
您可以在信任策略的*条件键*中使用这些标签，来限制哪些服务账户、命名空间和集群可以使用此角色。有关容器组身份添加的请求标签列表，请参阅[启用或禁用会话标签](pod-id-abac.md#pod-id-abac-tags)。  
例如，您可以通过在以下信任策略中添加 `Condition`，将可以担任某个容器组身份 IAM 角色的容器组（pod）限制为特定的 `ServiceAccount` 和 `Namespace`：

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/kubernetes-namespace": [
                        "Namespace"
                    ],
                    "aws:RequestTag/kubernetes-service-account": [
                        "ServiceAccount"
                    ]
                }
            }
        }
    ]
}
```

有关 Amazon EKS 条件键的列表，请参阅《Service Authorization Reference》**中的 [Conditions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-policy-keys)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Actions defined by Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelastickubernetesservice.html#amazonelastickubernetesservice-actions-as-permissions)。