すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:[製品の変更] Kubernetes 1.22以降でのサービスアカウントトークンの有効期限の解決策

最終更新日:Jan 05, 2025

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バージョンを更新できます。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、更新するコンポーネントを見つけ、[アップグレード] をクリックします。

ACKコンポーネントを使用しないアプリケーション

この問題を一時的に解決するには、アプリケーションを再起動します。 この問題を完全に解決するには、アプリケーションのclient-goバージョンを11.0.0以降または0.15.0以降に更新します。 このようにして、アプリケーションは、アプリケーションにバインドされているサービスアカウントトークンを自動的にリロードします。