Kubernetes サービスアカウント - Amazon EKS

Kubernetes サービスアカウント

Kubernetes サービスアカウントは、pod で実行されるプロセスのアイデンティティを提供します。詳細については、「Kubernetes ドキュメント」の「サービスアカウントの管理」を参照してください。pod が AWS サービスにアクセスする必要がある場合、サービスアカウントを AWS Identity and Access Management のアイデンティティにマッピングして、アクセス権を付与することができます。詳細については、「サービスアカウントの IAM ロール」を参照してください。

サービスアカウントトークン

Kubernetes バージョン 1.21 以降では、BoundServiceAccountTokenVolume 機能がデフォルトで有効になっています。この機能により Kubernetes で実行しているワークロードがオーディエンス、時間、およびキーバインド化された JSON Web トークンをリクエストできるようにすることで、サービスアカウントトークンのセキュリティが向上します。サービスアカウントトークンの有効期限は 1 時間です。Kubernetes の以前のバージョンでは、トークンに有効期限はありませんでした。つまり、これらのトークンに依存するクライアントは 1 時間以内にトークンを更新する必要があります。次の Kubernetes クライアント SDK では、必要な時間内にトークンを自動的に更新します。

  • 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 バージョン 1.21 でデフォルトの 1 時間を超えてサービスアカウントトークンの有効期限を延長します。Amazon EKS クラスターの場合、延長できる有効期限は 90 日です。Amazon EKS クラスターの Kubernetes API サーバーでは、90 日を超えるトークンのリクエストは拒否されます。アプリケーションとその依存関係を確認し、Kubernetes クライアント SDK が前記のバージョンと同じかそれ以降であることを確認することをお勧めします。

API サーバーが 1 時間を超える古いトークンによるリクエストを受信すると、API 監査ログイベントに annotations.authentication.k8s.io/stale-token で注釈を付けます。注釈の値は次の例のようになります。

subject: system:serviceaccount:common:fluent-bit, seconds after warning threshold: 4185802.

クラスターでコントロールプレーンのログ記録が有効になっている場合、注釈は監査ログに記録されます。以下の CloudWatch Log 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 は、最新のトークンを読み込んでからの経過時間 (秒単位) を示します。elapsedtime が 90 日を超えると、API サーバーへのリクエストは拒否されます。トークンの自動更新を行う前記のバージョンのいずれかを使用するよう、アプリケーションの Kubernetes クライアント SDK をプロアクティブに更新する必要があります。使用しているサービスアカウントトークンが 90 日に近く、トークンの有効期限が切れる前にクライアント SDK のバージョンを更新するのに十分な時間がない場合、既存の pods を終了して新しいものを作成できます。サービスアカウントトークンが再フェッチされるので、クライアントバージョン SDK を更新するのに 90 日が追加されたことになります。

pod がデプロイの一部である場合、高可用性を維持しながら pods を終了する方法として、次のコマンドによるロールアウトの実行をお勧めします。my-deployment をデプロイの名前で置き換えます。

kubectl rollout restart deployment/my-deployment

クラスターアドオン

以下のクラスターアドオンが更新され、サービスアカウントトークンを自動的に再フェッチする Kubernetes クライアント SDK が使用できるようになりました。リストされているバージョン、またはそれ以降のバージョンを、1.21 以降のクラスターにインストールすることをお勧めします。