Kubernetes 服务账户
Kubernetes 服务账户为在 Pod 中运行的进程提供身份。有关更多信息,请参阅 Kubernetes 文档中的管理服务账户
服务账户令牌
Kubernetes 版本中默认启用 BoundServiceAccountTokenVolume
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 在默认一小时内向服务账户令牌添加延长的到期期限。对于 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 天(7,776,000 秒)时被拒绝。您应该主动更新应用程序的 Kubernetes 客户端开发工具包,以使用前面列出的其中一个自动刷新令牌的版本。如果使用的服务账户令牌接近 90 天,并且您没有足够的时间在令牌到期之前更新客户端开发工具包版本,您可以终止现有 Pods 并创建新的。这将导致重新获取服务账户令牌,从而为您提供额外 90 天的时间来更新客户端版本开发工具包。
如果 Pod 是部署的一部分,那么在保持高可用性的同时终止 Pods 的建议方法是使用以下命令执行部署。将
替换为您的部署的名称。my-deployment
kubectl rollout restart deployment/
my-deployment
集群附加组件
已更新以下集群附加组件以使用自动重新获取服务账户令牌的 Kubernetes 客户端开发工具包。我们建议确保已在集群上安装列出的版本或更高版本。
-
Amazon VPC CNI plugin for Kubernetes 和指标帮助程序插件版本
1.8.0
和更高版本。要查看当前版本或进行更新,请参阅 使用 Amazon VPC CNI plugin for Kubernetes Amazon EKS 附加组件 和 cni-metrics-helper。 -
CoreDNS 版本
1.8.4
和更高版本。要查看当前版本或更新它,请参阅 使用 CoreDNS Amazon EKS 附加组件。 -
AWS Load Balancer Controller 版本
2.0.0
和更高版本。要查看当前版本或更新它,请参阅 安装 AWS Load Balancer Controller 附加组件。 -
当前
kube-proxy
版本。要查看当前版本或更新它,请参阅 更新 Kubernetes kube-proxy 自行管理的附加组件。 AWS for Fluent Bit 版本
2.25.0
或更高版本。要更新当前版本,请参阅 GitHub 上的发布。 Fluentd 镜像版本 1.14.6-1.2
或更高版本以及适用于 Kubernetes 元数据的 Fluentd 筛选器插件版本 2.11.1 或更高版本。