在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的升級。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,搜尋目標組件,在組件卡片單擊升級。
非ACK組件應用
短期內,可臨時重啟應用Pod,快速恢複。長期解決需要將應用所使用的client-go升級到v11.0.0和v0.15.0及以上,讓程式自動重新載入ServiceAccount Token。