Kubernetes 服务账户 - Amazon EKS

Kubernetes 服务账户

Kubernetes 服务账户为在 pod 中运行的进程提供身份。有关更多信息,请参阅 Kubernetes 文档中的管理服务账户。如果您的 pod 需要访问 AWS 服务,您可以将服务账户映射到 AWS Identity and Access Management 身份来授予该访问权限。有关更多信息,请参阅服务账户的 IAM 角色

服务账户令牌

Kubernetes 版本 1.21 及更高版本中默认启用 BoundServiceAccountTokenVolume 功能。此功能允许在 Kubernetes 上运行工作负载,以请求与受众、时间和密钥绑定的 JSON Web 令牌,从而提高了服务账户令牌的安全性。服务账户令牌有效期为 1 小时。在较早的 Kubernetes 版本中,令牌没有过期时间。这意味着依赖这些令牌的客户端必须在一小时内刷新令牌。以下 Kubernetes 客户端开发工具包会在要求的时间范围内自动刷新令牌:

  • Go 版本 0.15.7 和更高版本

  • Python 版本 12.0.0 和更高版本

  • Java 版本 9.0.0 和更高版本

  • JavaScript 版本 0.10.3 和更高版本

  • Ruby master 分支

  • Haskell 版本 0.3.0.0

  • C# 版本 7.0.5 和更高版本

如果您的工作负载使用的是旧版本的客户端,则必须予以更新。为了使客户端顺利迁移到更新的有时限的服务账户令牌,Kubernetes 版本 1.21 及更高版本在默认一小时内向服务账户令牌添加延长的到期期限。对于 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.

如果您的集群启用了控制面板日志记录,则注释在审计日志内。您可以使用以下 CloudWatch Logs Insights 查询,以识别 Amazon EKS 集群中使用过时令牌的所有 pods:

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 天时被拒绝。您应该主动更新应用程序的 Kubernetes 客户端开发工具包,以使用前面列出的其中一个自动刷新令牌的版本。如果使用的服务账户令牌接近 90 天,并且您没有足够的时间在令牌到期之前更新客户端开发工具包版本,您可以终止现有 pods 并创建新的。这将导致重新获取服务账户令牌,从而为您提供额外 90 天的时间来更新客户端版本开发工具包。

如果 pod 是部署的一部分,那么在保持高可用性的同时终止 pods 的建议方法是使用以下命令执行部署。将 my-deployment 替换为您的部署的名称。

kubectl rollout restart deployment/my-deployment

集群附加组件

已更新以下集群附加组件以使用自动重新获取服务账户令牌的 Kubernetes 客户端开发工具包。我们建议确保列出的版本或更高版本已安装在 1.21 或更高版本的集群上。