🦑

[Kubernetes] kubectl-clusterでcontext管理を楽にする

2023/01/06に公開約3,300字

はじめに

kubectl-clusterというcontext管理のためのkubectl custom pluginを作ったので、背景やuse caseについて簡単に紹介します。
リポジトリはこちら: https://github.com/sp-yduck/kubectl-cluster

context管理どうしてる?

kubernetesにおけるcontextはkubeconfig内のcurrent-context fieldによって管理されています。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://kubernetes.docker.internal:6443
  name: docker-desktop
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
current-context: docker-desktop  ########## ここ ##########
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

contextを切り替えるにはkubectl config use-context <context>によってcurrent-contextを設定することができます。その他kubectx(https://github.com/ahmetb/kubectx)などの外部プラグインなどによっても切り替えることができます。(筆者はこれを使っていました)
基本的にkubernetesにおけるcontext管理ではこれらの方法によるcontext切り替えでほとんど問題無いと思います。一方でこれらの方法でcontext管理するのが少し面倒なケースがいくつか考えられます。
1.contextの名前が長い/覚えられないなどの理由で指定しにくい
2. contextの数が多すぎる

contextの名前が長い

kubeconfig内のcontext fieldを見ていただくと分かるように一つのcontextはcluster,namespace,userなどのいくつかのfieldを持つ可能性があります。これらの情報をcontextの名前に入れている場合contextの名前はとても長くなります(e.g. <user name>-<namespace>@<cluster name>)。contextの名前が長いと、当然ですがいちいち指定するのが結構面倒くさいです。名前が長いと誤字が多くなるし再度打ち直すのも面倒です。
kubectxのようにインタラクティブにfuzzy searchingできるものもありますがcontextの命名規則に前述の例の<user name>-<namespace>@<cluster name>のようなものを採用していると<user name>-<namespace>@まで打っても一意に定まらないことがあるので依然として指定しなくてはいけない文字量が多いままです。(一意に定まらなくて良い場合でもいちいちfuzzy searchingするのが面倒だったりする)

contextの数が多すぎる

前述のように一つのcontextはcluster,namespace,userなどのfieldを持つ可能性がありこれはclusterとcontextの関係は基本的に一対多の関係であることを意味しています。kubernetesの管理者としてuserを切り替えて使う必要がある場合やシンプルにnamespaceの切り替え、あるいは複数のkubernetes clusterを管理している場合などではcontextの数がとても多くなることが予想されます。このような場合でもcontextを一意に定めるための文字数が多くなることが予想されるのでなかなか面倒です

kubectl-clusterとは

上記の理由でcontextをそのままで指定するのが面倒でとりあえず指定したclusterにアクセスできればいい時、cluster名の指定のみで適当にcotnextを切り替えてくれます。
筆者はcontainer platformの開発チームに所属していて数十のkubernetesクラスタを管理しています。userは基本固定でnamespaceはなんでもいいからとりあえずクラスタにアクセスしたい時(namespacedでないnodeなどのresourceにアクセスするとき)が無限にやってきます。kubectxはかなり便利ですが毎回fuzzy searchingするのもちょっと面倒になってきました。そこでcluster名の指定のみで適当にcotnextを切り替えてくれるpluginを作りました。
使い方はシンプルにkubectl clusterでKUBECONFIG内のclusterを出力

kubectl cluster use <cluster>でcontext切り替えです。

指定されたclusterを使用しているcontextのうち、最新のものをcurrent-contextに設定するような仕組みになっていますがcontextのfilter機能(defaultのuser,namespaceを指定できるとか)とか今後追加しても良いかなと思ってます。
気が向いたときに開発続けていくと思うので詳しくはリポジトリのREADMEを見ていただけたらと思います。
現段階で考えてる機能は

  • clusterの(KUBECOMFIGからの)削除
  • fuzzy searching
  • -n でnamespaceも一緒に切り替え
  • cluster nameとnamespaceを表示するps1のconfiguration機能
    ps1のconfigurationをするアプリケーションとしてはkube-ps1が有名かと思いますがkube-ps1ではcontextとnamespaceしか表示できない(clusterを表示するためのPRが無視され続けており今後もmergeされないと思われます)ため、筆者はこれをforkしてclusterを表示するようにカスタマイズしていますがどうせなら作り直しても良いかなと思ってます
  • 複数クラスタに同一作業を行う機能
    仕事では複数クラスタに対して同じ作業を繰り返すことはよくあります。そういう時に複数クラスタにまとめて同一動作したりdiff取れたりしたら便利だよなあと思ってます。kubectl cluster exec/diff -c clusterA,clutserB,clusterC -- <command>みたいな?

おわりに

contextの切り替えで困っている人なんてほとんどいないような気もしますが、気に入ってくれる人がいれば幸いです。もし周りに筆者のように複数のkubernetes clusterを管理している人/チームがいたら是非共有してみてください。kubectl-cluster自体に大した機能が無いのでほとんど内容が無い記事ですがこれで終わりです。以上

Discussion

ログインするとコメントできます