Kubernetes 1.22以降では、サービスアカウントトークンの有効期間は1年です。 kubeletは、有効期限が切れる前にサービスアカウントのトークンを自動的に更新します。 ただし、client-goバージョンが11.0.0または0.15.0より前の場合、システムはサービスアカウントトークンを自動的にリロードしません。 その結果、有効期間が終了すると、サービスアカウントのトークンは期限切れになります。 このトピックでは、Kubernetes 1.22以降を実行するContainer service for Kubernetes (ACK) クラスターおよびソリューションのサービスアカウントトークンの有効期限の影響について説明します。
データのセキュリティを確保するため、Kubernetes 1.21ではデフォルトでBoundServiceAccountTokenVolume機能が有効になっています。 この機能では、サービスアカウントトークンの有効期間を指定し、有効期限が切れる前にサービスアカウントトークンを自動的に更新し、トークンがバインドされているポッドが削除された後にサービスアカウントトークンを無効にします。 client-goバージョンが11.0.0以降または0.15.0以降の場合、kubeletは自動的にディスクからサービスアカウントトークンをリロードしてトークンを更新します。 上位互換性を確保するために、有効期限が切れてから1年間は引き続きトークンを使用できます。 トークンの有効期限が切れた後、client-goバージョンが11.0.0または0.15.0より前の場合、システムはトークンを自動的に更新しません。 サービスアカウントのトークンの有効期限が切れると、次のエラーが表示されます。
# コンポーネントログ。
リソースの一覧エラー=Unauthorized
# クラスターのKubernetes APIサーバーのアクセスログ。
"リクエストを認証できません" err="[無効なベアラトークン、トークンは期限切れです。]" コンポーネントポッドを再起動して、client-goが新しいトークンを取得できるようにします。
影響の範囲
Kubernetes 1.22以降のクラスターで実行され、11.0.0または0.15.0より前のクライアントバージョンを使用するアプリケーションが影響を受けます。
影響
Kubernetes 1.22以降を実行するクラスターでは、client-goバージョンが11.0.0または0.15.0より前の場合、サービスアカウントトークンは有効期限が切れてから1年後にリロードされない場合があります。
Kubernetesバージョンのクラスターを1.22以降に更新してから1年後に、アプリケーションを更新または再起動しないと、既存のアプリケーションにバインドされているサービスアカウントトークンは期限切れになります。
解決策
ACKコンポーネントを使用するアプリケーション
デフォルトでは、ACKコンポーネントは最新バージョンのclient-goでプリインストールされています。 ACKコンポーネントのclient-goバージョンが最新でない場合は、コンポーネントを更新してclient-goバージョンを更新できます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、更新するコンポーネントを見つけ、[アップグレード] をクリックします。
ACKコンポーネントを使用しないアプリケーション
この問題を一時的に解決するには、アプリケーションを再起動します。 この問題を完全に解決するには、アプリケーションのclient-goバージョンを11.0.0以降または0.15.0以降に更新します。 このようにして、アプリケーションは、アプリケーションにバインドされているサービスアカウントトークンを自動的にリロードします。