ServiceAccount は、Pod で実行されているプロセスの ID を提供します。 Pod 内のプロセスは、関連付けられたサービス アカウントの ID を使用して、クラスターの APIServer で認証できます。 Pod を作成するときに、Pod が使用する ServiceAccount を指定するための spec.serviceAccount プロパティが仕様の下にあります。指定されていない場合は、デフォルトの sa がデフォルトで使用されます。次に、ボリュームを投影すると、Pod のディレクトリ /run/secrets/kubernetes.io/serviceaccount/ にトークン ファイルが作成されます。 RBAC を通じて sa に権限を付与すると、コンテナ内のアプリケーションはこのトークンを保持した後に対応する権限を持つようになります。 ただし、K8s のバージョンによってトークン ファイルの使用方法が異なることに注意してください。ここで簡単に説明します。 <=1.20 バージョンkind を使用して、バージョンが v1.20 以下のクラスターをすばやく作成します。 ☸ ➜ kind create cluster -- name kind120 -- image kindest / node : v1 .20 .15 ☸ ➜ kubectlノードを取得する 名前ステータス役割年齢バージョン kind120 -コントロールプレーン準備完了コントロールプレーン、マスター33s v1 .20 .15 まず、sa-demo という名前の ServiceAccount オブジェクトを作成します。 ☸ ➜ kubectl create sa sa -デモ ☸ ➜ kubectl saを取得する 名前秘密年齢 デフォルト1 43秒 sa -デモ1 6秒 ☸ ➜ kubectlシークレットを取得する 名前タイプデータ年齢 デフォルト-トークン- dv78w kubernetes .io /サービス-アカウント-トークン3 46秒 sa -デモ-トークン- 4 gvbw kubernetes .io /サービス-アカウント-トークン3 8 s sa が作成された後、シークレットが自動的に生成されることがわかります。形式は <saname>-token-xxxx です。たとえば、sa-demo という名前の sa を作成すると、システムは sa-demo-token-4gvbw という名前のシークレットを自動的に作成します。このシークレットにはトークンが含まれています。 ☸ ➜ kubectlシークレットを記述しますsa -デモ-トークン- 4 gvbw 名前: sa -デモ-トークン- 4 gvbw 名前空間:デフォルト ラベル: <なし> 注釈: kubernetes 。 io /サービスアカウント。名前: sa - demo Kubernetes 。 io /サービスアカウント。 uid : 1 ae8eea9 - acc6 - 4e3 d - b378 - 07f eb9146ac4
タイプ: kubernetes .io /サービス-アカウント-トークン
データ ==== 約. crt : 1066バイト 名前空間: 7バイト トークン: eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQ 。 eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY 2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZ CI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ 。 j0DQmzTesfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4L U6uw4kA_6kwEsz4q2quWcB_fiH_Z3iKVfh1JolYTVAWTBMWnVn6gBvIrlXV5ny2oyvcPQeVfIek8aPQqhbsct_qOxrjqpZY8mpBz0ETR_EELjmcZxVVPLvomOdCqEqbV - FF5KRiFxizB3Xoh6NHz3EcsxpCZNRYdおよびUFHaBQC9IPwJKzxhANGmuZuWJUCqCVGGRZTo9c6eoyVz831sZ0A 自動的に生成されたシークレット オブジェクトにはトークンが含まれていることがわかります。このトークンは次のコマンドでも取得できます。 ☸ ➜ kubectlシークレットを取得sa -デモ-トークン- 4 gvbw - o jsnotallow = '{.data.token}' | base64 - d このトークンは JWT 構造になっています。このトークンを jwt.io ウェブサイトにコピーしてデコードすることができます。 右側には、デコード後のトークンの内容が表示されます。 PAYLOAD 部分は、トークンに含まれる sa-demo 情報です。有効期限がないことがわかります。これは、トークンが期限切れにならないことも示しています。 ここで、上で作成した sa を使用して Pod を実行します。 #デモ- pod.yaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 仕様: サービスアカウント: sa -デモ コンテナ: -名前:デモ イメージ: nginx : 1.7.9 ポート: -コンテナポート: 80 Pod を作成するだけです: ☸ ➜ kubectl apply -fデモ- pod .yaml ☸ ➜ kubectlポッドを取得する 名前準備完了ステータス再起動年齢 デモ1/1実行中0 81秒 ☸ ➜ kubectl get podデモ- oyaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 名前空間:デフォルト 仕様: コンテナ: -イメージ: nginx : 1.7.9 imagePullPolicy : IfNotPresent 名前:デモ # ...... ボリュームマウント: -マウントパス: /var/run/secrets/kubernetes.io/serviceaccount 名前: sa -デモ-トークン- 4 gvbw 読み取り専用: true # ...... 巻数: -名前: sa -デモ-トークン- 4 gvbw 秘密: デフォルトモード: 420 SecretName : sa -デモ-トークン- 4 gvbw Pod が作成されると、指定された sa に対応するシークレットがコンテナの /var/run/secrets/kubernetes.io/serviceaccount ディレクトリに自動的にマウントされることがわかります。そのため、ディレクトリには対応するトークン ファイルが含まれている必要があります。値をチェックして検証することができます: ☸ ➜ kubectl exec - itデモ-- cat / run / secrets / kubernetes .io / serviceaccount / token eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQ 。 eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY 2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZ CI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ 。 j0DQmzTesfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4L U6uw4kA_6kwEsz4q2quWcB_fiH_Z3iKVfh1JolYTVAWTBMWnVn6gBvIrlXV5ny2oyvcPQeVfIek8aPQqhbsct_qOxrjqpZY8mpBz0ETR_EELjmcZxVVPLvomOdCqEqbV - FF5KRiFxizB3Xoh6NHz3EcsxpCZNRYdおよびUFHaBQC9IPwJKzxhANGmuZuWJUCqCVGGRZTo9c6eoyVz831sZ0A 投影されたボリュームを通じて Pod にマウントされたトークンが、sa-demo に対応するシークレットに含まれるトークンとまったく同じであることがわかります。このトークンは期限切れにならないため、Pod が削除されて再作成された場合でも、シークレット オブジェクト内のトークン データが変更されていないため、Pod 内のトークンは変更されません。 Pod 内の K8s クラスターのリソース オブジェクトにアクセスする必要がある場合は、使用する sa に対応する権限をバインドし、Pod アプリケーション内の対応するトークンを使用して APIServer と通信できるようになりました。このとき、トークンは対応する権限を認識できます。 >=1.21 バージョン && <= 1.23 バージョン次に、バージョン >= 1.21 && <= 1.23 に基づいて K8s クラスターをテストします。 ここでは kind を使用して、v1.22.15 クラスターをすばやく作成します。 ☸ ➜ kind create cluster -- name kind122 -- image kindest / node : v1 .22 .15 ☸ ➜ kubectlノードを取得する 名前ステータス役割年齢バージョン kind122 -コントロールプレーン準備完了コントロールプレーン、マスター115 s v1 .22 .15 また、最初に sa-demo という名前の ServiceAccount オブジェクトを作成します。 ☸ ➜ kubectl create sa sa -デモ ☸ ➜ kubectl saを取得する 名前秘密年齢 デフォルト1 43秒 sa -デモ1 6秒 ☸ ➜ kubectlシークレットを取得する 名前タイプデータ年齢 デフォルト-トークン- 9 w9bp kubernetes .io /サービス-アカウント-トークン3 116秒 sa -デモ-トークン- g7d2g kubernetes .io /サービス-アカウント-トークン3 8 s また、sa を作成した後、システムによって対応するシークレット オブジェクトが自動的に作成されることもわかります。これは以前のバージョンと変わりません。次のコマンドを使用して、シークレット オブジェクトに含まれるトークン値を取得することもできます。 ☸ ➜ kubectlシークレットを取得sa -デモ-トークン- g7d2g - o jsnotallow = '{.data.token}' | base64 - d eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQ 。 eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tZzdkMmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY 2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZ CI6IjI3ZGI0M2FjLTdjYjItNDQ2Yi05N2Q1LWU0MGUzOWRjZTg4YyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ .fnSaqrZKolTfz2pi9t32X38Er60WSzUoRHArte6qVmQ1NTaMis4F6rESWekeJvGW26szTJdll6vK8KtL_IRO2m6sp_fEAYfNMQMXL4CuaRByXeAavDqLgMHhodf4k4Yg - Mj4LCQ3aHOxojbAbPT1i_h17Ewivc39fmzp - dAXbHhhWhCW2Vl_CkM - F - UtzLyDwThvJedkeetrfyOOjE7K6HpzWfqIQyMUdCJog3WnFO_4kHXacFCgYg_gNPMYyViQAsTsxB8FplGdEzRuWKnQO9cDE55V4l55IxmE0er - dSSdG8085PzxaM_lMCtRI8YtjRjxcbxS5QkTm5R_ps0IsA また、デコードのためにトークン値を jwt.io Web サイトにコピーします。 デコードされた値から、トークン値にも有効期限が含まれていないことがわかります。これは、sa を作成した後、対応するトークンが期限切れにならないことも示しています。 同様に、上記の sa を再度使用して、以下に示すように Pod を作成します。 #デモ- pod.yaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 仕様: サービスアカウント: sa -デモ コンテナ: -名前:デモ イメージ: nginx : 1.7.9 ポート: -コンテナポート: 80 Pod を直接作成します。 ☸ ➜ kubectl apply -fデモ- pod .yaml ☸ ➜ kubectlポッドを取得する 名前準備完了ステータス再起動年齢 デモ1/1実行中0 81秒 ☸ ➜ kubectl get podデモ- oyaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 名前空間:デフォルト 仕様: コンテナ: -イメージ: nginx : 1.7.9 imagePullPolicy : IfNotPresent 名前:デモ ポート: -コンテナポート: 80 プロトコル: TCP ボリュームマウント: -マウントパス: /var/run/secrets/kubernetes.io/serviceaccount 名前: kube - api - access - 6 wmfb 読み取り専用: true # ...... 巻数: -名前: kube - API -アクセス- 6 wmfb 予測: デフォルトモード: 420 出典: -サービスアカウントトークン: 有効期限秒数: 3607 パス:トークン - configMap : アイテム: -キー: ca .クリティカル パス: ca.クリティカル 名前: kube - root - ca.crt -下向きAPI : アイテム: -フィールド参照: APIバージョン: v1 fieldPath :メタデータ。名前空間 パス:名前空間 Pod が作成され、対応するリソース オブジェクトを表示すると、以前のバージョンとは大きな違いがあることがわかります。自動的に作成されたシークレットは、コンテナの /var/run/secrets/kubernetes.io/serviceaccount ディレクトリにマウントされません。 Pod 内のトークン値をチェックして、シークレットに含まれるトークン値と比較することができます。 ☸ ➜ kubectl exec - itデモ-- cat / run / secrets / kubernetes .io / serviceaccount / token eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQ 。 eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA1MDI1NDU4LCJpYXQiOjE2NzM0ODk0NTgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiNzY1ODRmODAtZjU1My00Mzk2LWIxOTUtMDEwOTBhMzM4MWYyIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiMjdkYjQzYWMtN2NiMi00NDZiLTk3ZDUtZTQwZTM5ZGNlODhjIn0sIndhcm5hZnRlciI6MTY3MzQ5MzA2NX0sIm5iZiI6MTY3MzQ4OTQ1OCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9 - Las1giWK_bFuzCxiR10Lcgyd5N7VjB2WcT7K8rN7dAeUWgiH2s9lMOzoaIorUDXzlnSTcmxkhz1h7RXYKVGaqZBbd5wJsRnINZPGxqsS - wi21Aw2FFmIeeK8GGlnAqnS0f3VS1N2jm03gKPii - sMt0GARse4HsmhGAhyJnt9za6ZNpBgcybd7uEBjgIVrRFTkqBJOjPrAnMvRucVtwww Pod 内のトークン値が、自動的に作成されたシークレットのトークン値と異なることが明確にわかります。同様に、jwt.io でトークン値をデコードします。 トークン値のデコードされた PAYLOAD データには、さまざまなデータが含まれていることがわかります。 exp フィールドはトークンの有効期限(1 年)を示します。 ここでまとめると、K8s クラスター v1.21 から v1.23 では、ServiceAccount オブジェクトが作成されると、システムは引き続きシークレット オブジェクトを自動的に作成します。シークレット オブジェクトに含まれるトークンは期限切れになることはありませんが、シークレットのトークン値は Pod では使用されません。 上記の Pod リソース リストから、Pod を作成した後、Kubernetes コントロール プレーンによって投影されたボリュームが Pod に自動的に追加されることがわかります。このボリュームには、Kubernetes API にアクセスするためのトークンが含まれています。このマニフェスト スニペットは、次の 3 つのデータ ソースで構成される投影ボリュームを定義します。 - serviceAccountToken データ ソース: kubelet によって kube-apiserver から取得されたトークンが含まれます。 kubelet は TokenRequest API を使用して、時間制限のあるトークンを取得します。 TokenRequest を提供するこのトークンは、Pod が削除されるか、定義された有効期間 (デフォルトでは 1 時間) が経過すると期限切れになります。トークンは特定のポッドに関連付けられており、そのオーディエンスは kube-apiserver のオーディエンスと一致するように設定されています。このメカニズムは、Secret に基づいてボリュームを追加する以前のメカニズムに代わるものです。Secret は Pod の ServiceAccount を表しますが、有効期限は切れません。
- configMap データ ソース: ConfigMap には、Pod がクラスターの kube-apiserver (ミドルウェアや誤って誤って構成されたピアではない) に接続していることを確認するために使用できる一連の証明機関データが含まれています。
- 下向き API データ ソースは、Pod を含む名前空間の名前を検索し、その名前情報を Pod 内で実行されているアプリケーション コードで使用できるようにするために使用されます。
したがって、現在のバージョンの K8s クラスターによって作成された Pod に含まれるトークンは、ServiceAccount に自動的に関連付けられるシークレット オブジェクト内のトークンではないことを指定する必要があります。代わりに、kubelet は TokenRequest API にリクエストを送信して新しいトークンを申請し、それを Pod の /run/secrets/kubernetes.io/serviceaccount/token に配置します。 kubelet は 1 時間後に新しいトークンを申請します。そのため、1時間後に再度トークンを確認すると、トークンの内容が変更されていることがわかります。 Pod を削除して再作成すると、新しいトークンを申請することになり、削除された Pod 内のトークンは直ちに期限切れになります。 kubectl create token <sa> コマンドを手動で使用して ServiceAccount トークンを要求し、有効期間などを指定することもできます。 ☸ ➜ kubectlトークンを作成- h サービスアカウントトークンをリクエストします。
例: #現在の名前空間のサービスアカウント「myapp」としてkube - apiserverに認証するためのトークンを要求します kubectlトークンmyappを作成
#カスタム名前空間のサービスアカウントのトークンをリクエストする kubectlトークンmyappを作成--名前空間myns
#カスタム有効期限付きのトークンをリクエストする kubectlトークンmyappを作成--所要時間10分
#カスタムオーディエンスでトークンをリクエストする kubectlトークンmyappを作成--対象ユーザーhttps://example.com
# Secretオブジェクトのインスタンスにバインドされたトークンをリクエストする kubectl create token myapp --bound- object - kind Secret --bound - object - name mysecretでトークンを作成します。
#特定のuidを持つSecretオブジェクトのインスタンスにバインドされたトークンをリクエストします kubectlトークン作成myapp --バインドされたオブジェクトの種類Secret --バインドされたオブジェクトの名前mysecret --バインドされたオブジェクトの名前 0d4691ed - 659b - 4935 - a832-355f77ee47cc
オプション: # ...... >= バージョン 1.24ここで、バージョン v1.24 以降の K8s クラスターで ServiceAccount トークンがどのように機能するかを見てみましょう。ここでは kind を使用して、v1.25.3 クラスターをすばやく作成します。 ☸ ➜ kind create cluster -- name kind125 -- image kindest / node : v1 .25 .3 ☸ ➜ kubectlノードを取得する 名前ステータス役割年齢バージョン kind125 -コントロールプレーン準備完了コントロールプレーン、マスター115s v1 .25 .3 また、sa-demo という名前の ServiceAccount を作成します。 ☸ ➜ kubectl create sa sa -デモ ☸ ➜ kubectl saを取得する 名前秘密年齢 デフォルト0 39日 sa -デモ0 5秒 ☸ ➜ kubectlシークレットを取得する ns1名前空間にリソースが見つかりません ServiceAccount が作成された後、対応する Secret オブジェクトが作成されないことがわかります。次に、以下のように Pod を作成します。 #デモ- pod.yaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 仕様: サービスアカウント: sa -デモ コンテナ: -名前:デモ イメージ: nginx : 1.7.9 ポート: -コンテナポート: 80 上記の Pod を作成したら、詳細を表示します。 ☸ ➜ kubectl apply -fデモ- pod .yaml APIバージョン: v1 種類:ポッド メタデータ: 名前:デモ 名前空間:デフォルト 仕様: コンテナ: -イメージ: nginx : 1.7.9 imagePullPolicy : IfNotPresent 名前:デモ ポート: -コンテナポート: 80 プロトコル: TCP ボリュームマウント: -マウントパス: /var/run/secrets/kubernetes.io/serviceaccount 名前: kube - api - access - pftqd 読み取り専用: true # ...... 巻数: -名前: kube - API -アクセス- pftqd 予測: デフォルトモード: 420 出典: -サービスアカウントトークン: 有効期限秒数: 3607 パス:トークン -構成マップ: アイテム: -キー: ca .クリティカル パス: ca.クリティカル 名前: kube - root - ca.crt -下向きAPI : アイテム: -フィールド参照: APIバージョン: v1 fieldPath :メタデータ。名前空間 パス:名前空間 Pod を作成すると、投影されたボリュームが自動的に Pod に追加されることがわかります。このボリュームには、Kubernetes API にアクセスするためのトークンが含まれており、バージョン 1.21 以上 1.23 以下のパフォーマンスと一致しています。 Pod 内のトークン値を確認することでこれを確認することもできます。 ☸ ➜ kubectl exec - itデモ-- cat / run / secrets / kubernetes .io / serviceaccount / token eyJhbGciOiJSUzI1NiIsImtpZCI6IndnazJLZENQTktiZkxVejhnMnhmTHJYRTlkZ2ZnOHJGQmgwVW4td3BWd0kifQ 。 eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0ODg0MDg0LCJpYXQiOjE2NzMzNDgwODQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiMTY0ZTIwZTYtYjNjMi00ZmQ5LWI3ZTUtMDZjYTExZWIyOWM4In0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiYjJlNWM3ZmYtNjlhNy00NzYyLTkxMDctM2UxNzZhYmQ3NTdiIn0sIndhcm5hZnRlciI6MTY3MzM1MTY5MX0sIm5iZiI6MTY3MzM0ODA4NCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9 。 lhYscyn_d9Y3GZSipSqGj4Jtsu8qsIyz34L18lv37HxjjGU_bQmUFCXYf_CRom8DfadHppmlaskZS18KmyTV1Z09BeujJd8viUnnYCWb9K 6VJB5uPBYWLB0FETfgQy7Kqu8Gvk8qBKLjdCkl8U2vr2Oqd2qSEDyvqhNBQXnckQRH6wyypBUc7EXSGAJf6dPVE3c6XqnbXMJ7SRZb5svE - hv0lZKmJrouz9Ia4qxUXUtpzDlMPnHOym2x9d1TSSZ1Lp7BOsqTnxlUQVueh9w869jAajrP1G9e5zhZwZBfzRfARqCVqoLid_hOQP - mo4MLfHbn61SWItlCBd75nl2WLQ 上記のトークン値出力を jwt.io にコピーしてデコードすることができます。 上記のデータから、ここでのトークンの有効期間も 1 年であることがわかります。このトークンもポッド内で 1 時間ごとに更新されます。 Pod が削除されて再構築されると、新しいトークンが再適用され、削除された Pod 内のトークンは直ちに期限切れになります。 TokenRequest 経由で発行されたトークンを無効にする特別なメカニズムは存在しないことに注意してください。 Pod にバインドされた ServiceAccount トークンを信頼できなくなった場合は、Pod を削除すると、それにバインドされたトークンが期限切れになります。 要約するさまざまなバージョンの K8s クラスターで ServiceAccount トークンがどのように機能するかを簡単にまとめることができます。 - 1.20 より前のバージョン (1.20 を含む) では、sa の作成時にシークレットが自動的に作成され、このシークレットは投影されたボリュームを介してポッドにマウントされます。シークレットに含まれるトークンは永続的に有効です。
- バージョン 1.21 ~ 1.23 では、sa の作成時にシークレットが自動的に作成されますが、シークレット内のトークンはポッドでは使用されません。代わりに、kubelet は TokenRequest API を通じてトークンを申請します。トークンはデフォルトで 1 年間有効ですが、ポッドは 1 時間ごとにトークンを更新します。
- バージョン 1.24 以降では、sa の作成時にシークレットが自動的に作成されなくなり、kubelet のみが TokenRequest API を通じてトークンを申請できるようになりました。
もちろん、有効期限のないトークンが必要な場合など、ServiceAccount トークンを保存するための Secret を手動で作成することもできます。手動で Secret を作成し、それを ServiceAccount に関連付けると、Kubernetes コントロール プレーンによってトークンが Secret に自動的に入力されます。 長期間有効な ServiceAccount トークンを手動で作成するメカニズムはありますが、短期間有効な API アクセス トークンを取得するには TokenRequest を使用することをお勧めします。 |