異なる 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 は他を大きくリードしています。

推薦する

フォーチュン500企業であるマースクがエッジコンピューティングを活用してサプライチェーンに革命を起こした方法

デンマークの海運大手マースクの子会社であるAPMターミナルズは、プライベート5G、AI強化IoTデバ...

WeChatパブリックアカウントの運用とプロモーションスキル!

WeChatパブリックプラットフォームの運営を例にとると、プラットフォーム運営は外部レイアウト、コン...

百度の最近のアルゴリズムアップデートからまとめたSEO戦略

中国のネットユーザー数が増え続けるにつれ、インターネットコンテンツの品質に対する要求も高まっている。...

IXWebHostingの高品質なアメリカの仮想ホスティングサービスはユーザーエクスペリエンスを向上させます

中国市場に参入した多くのアメリカの仮想ホストの中で、IXWebHosting仮想ホストは比較的人気が...

聖パトリックの日 - tinykvm 128M メモリ KVM 年間支払い 20 ドル

聖パトリックデーを記念して、tinykvm は最小限のメモリを搭載した KVM を年間 20 ドルで...

中小企業は戦略を考える必要はない。最も重要なのは、自ら豆腐を挽くことだ

多くの企業は生き残ることがますます困難になっていると感じています。彼らはもはや消費者を理解しておらず...

urpad のメンテナンスとシアトル データセンターへの近日導入

urpad から公式メールを受け取りましたが、注目すべき点がいくつかあります。シカゴとバッファローの...

クラウド コンピューティング契約に署名する際に注意すべき 5 つの原則

Forrester Research の調査によると、クラウド コンピューティング市場は年間 22%...

クラウドでオープンソースを活用する3つの方法

多くのパブリック クラウド サービスは、少なくとも部分的にはオープン ソース プラットフォームまたは...

エッジコンピューティングがデータ処理と IoT インフラストラクチャに与える影響

エッジ コンピューティングは、モノのインターネット (IoT) の変革をもたらすテクノロジーとなり、...

bkns: ベトナム クラスター VPS、月額 25 ドル、3G メモリ/3 コア/50g SSD/100M 帯域幅 (トラフィック無制限)/5 IPv4

bkns.vn は 2010 年に設立されました。登録番号 0104850587 のベトナム企業です...

クラウドコンピューティングにおけるアプリケーションマッピングの重要性

クラウド アプリケーション マッピングとは、一般的に、従来のオンプレミス サーバー環境からクラウド ...

SEOの開発とソリューションに立ち向かう

私が初めて SEO に触れたのは 2002 年です。SEO に携わる人なら、2003 年の中国の S...