異なる Kubernetes バージョンでの ServiceAccount トークンの使用

異なる Kubernetes バージョンでの ServiceAccount トークンの使用

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
名前空間:デフォルト
ラベル: <なし>
注釈: kubernetesio /サービスアカウント名前: sa - demo
Kubernetesio /サービスアカウント uid : 1 ae8eea9 - acc6 - 4e3 d - b378 - 07f eb9146ac4

タイプ: kubernetes .io /サービス-アカウント-トークン

データ
====
. crt : 1066バイト
名前空間: 7バイト
トークン: eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQeyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY 2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZ CI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQj0DQmzTesfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4L 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
eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQeyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi a3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY 2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZ CI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQj0DQmzTesfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4L 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
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQeyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwi 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
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQeyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA1MDI1NDU4LCJpYXQiOjE2NzM0ODk0NTgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiNzY1ODRmODAtZjU1My00Mzk2LWIxOTUtMDEwOTBhMzM4MWYyIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiMjdkYjQzYWMtN2NiMi00NDZiLTk3ZDUtZTQwZTM5ZGNlODhjIn0sIndhcm5hZnRlciI6MTY3MzQ5MzA2NX0sIm5iZiI6MTY3MzQ4OTQ1OCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9 - ​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
eyJhbGciOiJSUzI1NiIsImtpZCI6IndnazJLZENQTktiZkxVejhnMnhmTHJYRTlkZ2ZnOHJGQmgwVW4td3BWd0kifQeyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0ODg0MDg0LCJpYXQiOjE2NzMzNDgwODQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiMTY0ZTIwZTYtYjNjMi00ZmQ5LWI3ZTUtMDZjYTExZWIyOWM4In0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiYjJlNWM3ZmYtNjlhNy00NzYyLTkxMDctM2UxNzZhYmQ3NTdiIn0sIndhcm5hZnRlciI6MTY3MzM1MTY5MX0sIm5iZiI6MTY3MzM0ODA4NCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9lhYscyn_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 を使用することをお勧めします。

<<:  Kubernetes オンライン学習: Cilium と eBPF

>>:  サーバーレス時代が本格的に到来し、その創始者である Amazon Web Services は他を大きくリードしています。

推薦する

SEOキーワード戦略キーワード選択

ウェブサイトの最適化のためのキーワードの選択方法に関する前回の記事に続き、ここでは、さまざまな期間に...

360 と Baidu の戦いの長所と短所の分析 360 百科事典

360とBaiduの間の「3B戦争」はようやく沈静化したが、現在再燃の兆しを見せている。 1月5日、...

iniz-バレンタインデーVPSプロモーション/年間わずか8ドル

iniz はバレンタインデー前に VPS プロモーションを開始しました。iniz はまだ新製品を発表...

クラウドにおけるアプリケーションの依存関係の管理: 戦略とベスト プラクティス

アプリケーション依存関係マッピングの基礎、クラウド コンピューティング環境におけるアプリケーション依...

SEO担当者はホームページとコラムページの重みを合理的に分析する必要がある

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO プ...

検索エンジン マーケティングは始めるのは簡単ですが、習得するのは困難です。中小企業は創意工夫を凝らす必要があります。

新興のオンライン マーケティング手法の 1 つとして、検索エンジン マーケティング (SEM) は現...

ショックホスティングはどうですか?東海岸のニュージャージーVPSの簡単なレビュー

ショックホスティングはどうですか?ニュージャージーでショックホスティングはいかがですか?中国人は西海...

オンラインプロモーション:Weiboの使い方Weiboプロモーション手法の簡単な分析

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスはじめに:トラフィックが...

美団が実店舗共同購入サイト「Mengmai.com」を買収、商品共同購入に回復のチャンス

原題: Meituan が実店舗グループ購入サイト Mengmai.com を買収北京ビジネスデイリ...

SEO で収益を上げることを考えたことはありますか?

SEO に関して言えば、一部のウェブマスターはランキングについて考えるでしょうが、より多くのウェブマ...

BoyaとIntelが協力し、Analytics Zoo Cluster Servingをサポートする自動分散型スケーラブル推論プラットフォームを構築

概要データの豊富な固有情報のマイニング、フィッティング機能、データのスケーラビリティなどの利点により...

クラウドコンピューティングとエッジコンピューティング

クラウド コンピューティングでは、ストレージやコンピューティング能力などのコンピューティング サービ...

SEO 情報は乱雑でわかりにくいため、初心者は「自分で解決」する必要があります。

10月20日、国平氏は光年フォーラムを閉会した。国平氏自身は、その理由として3つの点を挙げた。第一に...

オンラインとオフラインのブランドのための 5 つのマーケティング戦略

さまざまなタイプのブランドが、さまざまな形態のストリートファイトを行っています。 01 2012年か...