配置服务账户的 AWS Security Token Service 端点 - Amazon EKS

配置服务账户的 AWS Security Token Service 端点

如果您将 Kubernetes 服务账户与 服务账户的 IAM 角色 结合使用,若您的集群和平台版本相同,或者晚于下表中所列的版本,则您可以配置服务账户使用的 AWS Security Token Service 端点类型。如果您的 Kubernetes 或平台版本早于表中列出的版本,则您的服务账户只能使用全局端点。

Kubernetes 版本 平台版本 默认端点类型
1.23 eks.1 区域性
1.22 eks.1 区域性
1.21 eks.3 服务全球
1.20 eks.3 服务全球
1.19 eks.7 服务全球

AWS 建议使用区域 AWS STS 端点而不是全局端点。这可以减少延迟,提供内置冗余并提高会话令牌的有效性。AWS Security Token Service 必须在 pod 运行的 AWS 区域 中是活动的。此外,您的应用程序必须内置冗余功能,以便在该 AWS 区域 的服务出现故障时选择其他 AWS 区域。有关更多信息,请参阅 IAM 用户指南中的在 AWS 区域中管理 AWS STS

先决条件

要配置 Kubernetes 服务账户使用的端点类型

以下示例全部使用 Amazon VPC CNI 插件所使用的 aws-node Kubernetes 服务账户。您可以将 example values 替换为您自己的服务账户、pods、命名空间和其他资源。

  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 在 AWS 区域 us-west-2 中的节点上运行。

  2. 确定容器组(pod)的服务账户使用的端点类型。

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

    输出示例如下。

    AWS_STS_REGIONAL_ENDPOINTS: regional

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

  3. 如果您的集群或平台版本与表中列出的版本相同或晚于该版本,则可以使用以下命令之一将服务账户使用的端点类型从默认类型更改为其他类型。将 aws-node 替换为服务账户的服务账户的名称,并将 kube-system 替换为服务账户的命名空间。

    • 如果您的默认或当前端点类型为全局端点类型,并且您想将其更改为区域性端点:

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

      如果您使用 服务账户的 IAM 角色 以在 pods 的容器中运行的应用程序中生成预签名 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 1.22 和更高版本集群中使用区域端点的默认行为,则请求将失败,并出现错误。有关更多信息,请参阅容器组(pod)容器收到以下错误:An error occurred (SignatureDoesNotMatch) when calling the GetCallerIdentity operation: Credential should be scoped to a valid region.

      如果您使用 服务账户的 IAM 角色 以在 pods 的容器中运行的应用程序中生成预签名 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 端点。

  4. 删除并重新创建任何与服务账户关联的现有 pods,以应用凭证环境变量。变异 Webhook 不将其应用到已经在运行的 pods。您可以将 podskube-system-l k8s-app=aws-node 替换为您设置注释的 pods 的信息。

    kubectl delete pods -n kube-system -l k8s-app=aws-node
  5. 确认 pods 已全部重新启动。

    kubectl get pods -n kube-system -l k8s-app=aws-node
  6. 查看其中一个 pods 的环境变量。验证 AWS_STS_REGIONAL_ENDPOINTS 值是您在上一步中将其设置的值。

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

    输出示例如下。

    AWS_STS_REGIONAL_ENDPOINTS=regional