全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:【产品变更】升级1.22版本后ServiceAccount Token过期解决方案

更新时间:Aug 01, 2023

在1.22及以上的Kubernetes版本中,ServiceAccount Token有效期为一年,kubelet组件会定期刷新Token。但client-go版本小于v11.0.0或v0.15.0时,系统不会自动重新加载Token,出现过期风险。本文介绍1.22及以上版本的集群ServiceAccount Token过期的影响范围、影响详情及解决方案。

为了提升安全性,Kubernetes社区在1.21版本默认启动了BoundServiceAccountTokenVolume功能。该功能设定了ServiceAccount Token的过期时间、自动刷新机制和删除Pod后的Token失效机制。client-go客户端版本大于等于v11.0.0和v0.15.0时,kubelet组件会定时刷新Token,定时从挂载盘重新加载Token,实现Token更新。为了保持向前兼容,过期后,您可以继续使用该Token一年。但一年后,如果client-go版本小于v11.0.0或者v0.15.0,系统不会自动重新加载并更新Token,导致Token过期风险,出现如下报错。

# 组件中日志
Error listing resources error=Unauthorized
# API Server访问日志
"Unable to authenticate the request" err="[invalid bearer token, Token has expired.]"

此时,您需要重启组件Pod,让client-go读取新的Token。

影响范围

集群Kubernetes版本为1.22及以上,且应用代码中使用的client-go版本小于v11.0.0或者v0.15.0。

过期影响

  • 1.22版本及以上的集群,但部署应用的client-go版本小于v11.0.0或者v0.15.0时,存在ServiceAccount Token过期一年后不会自动重新加载的风险。

  • 集群升级到1.22及以上版本时,如原有应用没有升级改造,也没有发生重启,将导致一年后ServiceAccount Token过期,需要重启应用恢复。

解决方案

ACK组件应用

ACK组件内置新版本的client-go,如您待升级client-go版本的应用使用ACK组件,您可以升级组件以完成client-go的升级。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,搜索目标组件,在组件卡片单击升级

非ACK组件应用

短期内,可临时重启应用Pod,快速恢复。长期解决需要将应用所使用的client-go升级到v11.0.0和v0.15.0及以上,让程序自动重新加载ServiceAccount Token。