GKE内のkubectlのコンテキスト(接続先情報)を整理する

GKE内のkubectlのコンテキスト(接続先情報)を整理する

はじめに

Google Cloud Platform内のKubernetes Engineを利用しています。
とある日に『kubectl config view』でkubectlのconfigを見てみると、ものすごいたくさんの情報があり、あれ?クラスタは1つしか利用していないのになんでだろうと思い、色々調べてみた事を忘れない様にメモしておきます。

コンテキストとkubectl config

※100%正しいかは分かっていないのでご注意ください。
kubectlコマンドで命令を出す先のクラスタ名とそのユーザー名やアクセストークンなどの情報の塊がコンテキストと思っています。
なので、クラスタが複数あればコンテキストも複数あるかと思います。
コマンド『kubectl config view』で見れる設定情報は、複数のコンテキストをまとめて確認する方法かと思われます。
コマンド『kubectl config view』は実行する度に複数あるコンテキストをその都度読み込んで表示しているかと思いきや違ったんです。

GCPウェブコンソールでクラスタを削除してから『kubectl config view』を再確認したところ、削除したはずのクラスタ名とそのユーザー名などが表示されました。
なので、GCPウェブコンソールでクラスタを削除したらkubectl config内も別で整理・削除しないといけないみたいです。

コンテキストとkubectl configの確認

コンテキストの確認


[root@sv01 ~]# kubectl config get-contexts
CURRENT   NAME                                                CLUSTER                                             AUTHINFO                                            NAMESPACE
*         gke_proj-honban_asia-northeast1-a_testcluster1124-03   gke_proj-honban_asia-northeast1-a_testcluster1124-03   gke_proj-honban_asia-northeast1-a_testcluster1124-03
          gke_proj-honban_asia-northeast1_honban1                gke_proj-honban_asia-northeast1_honban1                gke_proj-honban_asia-northeast1_honban1

現在クラスタ2つあるので、接続情報であるコンテキストも2行表示されました。

アスタリスク(*)が付いているのが現在設定されているコンテキストなので、kubectlコマンドで何か命令すると、それに紐づくクラスタで命令が実行されます。

kubectl configの確認

この2つのコンテキストをまとめてあるkubectl configを確認してみます。


[root@sv01 ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://34.84.44.100
  name: gke_proj-honban_asia-northeast1-a_testcluster1124-03
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://34.146.55.99
  name: gke_proj-honban_asia-northeast1_honban1
contexts:
- context:
    cluster: gke_proj-honban_asia-northeast1-a_testcluster1124-03
    user: gke_proj-honban_asia-northeast1-a_testcluster1124-03
  name: gke_proj-honban_asia-northeast1-a_testcluster1124-03
- context:
    cluster: gke_proj-honban_asia-northeast1_honban1
    user: gke_proj-honban_asia-northeast1_honban1
  name: gke_proj-honban_asia-northeast1_honban1
current-context: gke_proj-honban_asia-northeast1-a_testcluster1124-03
kind: Config
preferences: {}
users:
- name: gke_proj-honban_asia-northeast1-a_testcluster1124-03
  user:
    auth-provider:
      config:
        cmd-args: config config-helper --format=json
        cmd-path: /usr/lib64/google-cloud-sdk/bin/gcloud
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp
- name: gke_proj-honban_asia-northeast1_honban1
  user:
    auth-provider:
      config:
        access-token: ya29.c.aaaaaaaaaaaaaaaaaaaaaaaaaaausLdKGC93UcUseKXt_x6TRE0MjviG4LXILvLErq8Jyqfsig7f1zDIcurWaIZ7ToN7ct06Ud2bcnzRpbbbbbbbbbbbbbbbbbbbbbbbbbbbtGV9JgPELNamU2hJ9AouxiGww4LAzEeCyBbQ3Ul8NJ5FGEa3RCYvWZQjBSw5bTzdh1eh87wnB_PHugQ..............................................................................................................................
        cmd-args: config config-helper --format=json
        cmd-path: /usr/lib64/google-cloud-sdk/bin/gcloud
        expiry: "2022-11-24T07:55:27Z"
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp

という感じで、2つのコンテキスト情報をまとめて表示されています。

クラスタ削除してから再確認

クラスタ削除

テストで作成して不要になったクラスタ『testcluster1124-03』をGCPウェブコンソールで削除します。
削除方法は省きます。

コンテキストの再確認


[root@sv01 ~]# kubectl config get-contexts
CURRENT   NAME                                                CLUSTER                                             AUTHINFO                                            NAMESPACE
*         gke_proj-honban_asia-northeast1-a_testcluster1124-03   gke_proj-honban_asia-northeast1-a_testcluster1124-03   gke_proj-honban_asia-northeast1-a_testcluster1124-03
          gke_proj-honban_asia-northeast1_honban1                gke_proj-honban_asia-northeast1_honban1                gke_proj-honban_asia-northeast1_honban1

削除したクラスタのコンテキストが残っています。

kubectlコマンドで作成したクラスタを、kubectlコマンドで削除すれば、コンテキストもkubectl configも自動できれいに削除整理されます。

kubectl configの再確認

『kubectl config view』で確認したところ、クラスタ削除前と全く同じままでした。
内容が長いのでここでは省きます。

kubectl config内に残存するクラスタとユーザーも確認


[root@sv01 ~]# kubectl config get-clusters
NAME
gke_proj-honban_asia-northeast1-a_testcluster1124-03
gke_proj-honban_asia-northeast1_honban1
[root@sv01 ~]# kubectl config get-users
NAME
gke_proj-honban_asia-northeast1-a_testcluster1124-03
gke_proj-honban_asia-northeast1_honban1

kubectl config内には両方ともきっちり残っています。

コンテキストの削除

kubectl config内の削除整理

そもそもkubectlで作成したクラスタはkubectlコマンドで削除、ウェブコンソールで作成したクラスタはウェブコンソールで削除と一貫した作業を行えばいいのですが、やっちまったものはしょうがないので削除整理整理していきます。

kubectl config内のクラスタ名を削除

至って簡単なのですが『kubectl config delete-cluster クラスタ名』とするだけ


[root@sv01 ~]# kubectl config delete-cluster gke_proj-honban_asia-northeast1-a_testcluster1124-03
deleted cluster gke_proj-honban_asia-northeast1-a_testcluster1124-03 from /home/cloud_autokeiba_com/.kube/config

kubectl config内のユーザー名を削除

至って簡単なのですが『kubectl config delete-user ユーザー名』とするだけ


[root@sv01 ~]# kubectl config delete-user gke_proj-honban_asia-northeast1-a_testcluster1124-03
deleted user gke_proj-honban_asia-northeast1-a_testcluster1124-03 from /home/cloud_autokeiba_com/.kube/config

あれ?と思いますがクラスタ名もユーザー名も同じ『gke_proj-honban_asia-northeast1-a_testcluster1124-03』です。

kubectl config内のコンテキストを削除


[root@sv01 ~]# kubectl config delete-context gke_proj-honban_asia-northeast1-a_testcluster1124-03
warning: this removed your active context, use "kubectl config use-context" to select a different one
deleted context gke_proj-honban_asia-northeast1-a_testcluster1124-03 from /home/cloud_autokeiba_com/.kube/config

色々削除後にkubectl configを再確認


[root@sv01 ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://34.146.55.99
  name: gke_proj-honban_asia-northeast1_honban1
contexts:
- context:
    cluster: gke_proj-honban_asia-northeast1_honban1
    user: gke_proj-honban_asia-northeast1_honban1
  name: gke_proj-honban_asia-northeast1_honban1
current-context: gke_proj-honban_asia-northeast1-a_testcluster1124-03
kind: Config
preferences: {}
users:
- name: gke_proj-honban_asia-northeast1_honban1
  user:
    auth-provider:
      config:
        access-token: ya29.c.aaaaaaaaaaaaaaaaaaaaaaaaaaausLdKGC93UcUseKXt_x6TRE0MjviG4LXILvLErq8Jyqfsig7f1zDIcurWaIZ7ToN7ct06Ud2bcnzRpbbbbbbbbbbbbbbbbbbbbbbbbbbbtGV9JgPELNamU2hJ9AouxiGww4LAzEeCyBbQ3Ul8NJ5FGEa3RCYvWZQjBSw5bTzdh1eh87wnB_PHugQ..............................................................................................................................
        cmd-args: config config-helper --format=json
        cmd-path: /usr/lib64/google-cloud-sdk/bin/gcloud
        expiry: "2022-11-24T07:55:27Z"
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp

という感じで残したクラスタ『honban1』の情報だけがkubect configに残っていてきれいになりました。

まとめ

前述もしましたが、そもそもkubectlで作成したクラスタはkubectlコマンドで削除、ウェブコンソールで作成したクラスタはウェブコンソールで削除と一貫した作業を行えばこんな事は起こらないんですよね。

CURRENTに設定されているコンテキストのクラスタを削除した場合、設定中のコンテキストが無いのでkubectlコマンドは全てエラーとなります。
クラスタ削除後はコンテキストの選択設定を必ず行って下さい。
残存するコンテキストに自動切替などしてくれません。