

 **帮助改进此页面** 

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

# 为服务账户配置 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
   ```