🛠️

kubectl explain にあいまい検索(fuzzy-find)機能を追加したプラグイン kubectl-explore を作った

2022/01/22に公開

kubectl のプラグイン kubectl-explore を作成しました。ぜひ使って下さい。この投稿は、機能の紹介、作成の動機、どうやって作ったかを書きます。
kubectl プラグインシステムについては、ご存知の方も多いかと思いますが、說明は公式ドキュメント "Extend kubectl with plugins" を紹介しておきます。

kubectl explain とは何か

kubectl explain は Kubernetes 上のリソース、そのリソースのフィールドの Description を表示させるコマンドです。

Kubernetes Manifest を書いているときに、「この field って何?」「この Resource の spec って何があるんだっけ?」「この field の型は何?」と思うときに使えます。自分は CRD(Custom Resource Definition) の yaml を書くときにこの状況によく遭遇しています。

これだけでも便利なのですが、もっと便利にしたのが kubectl-explore です。

kubectl-explore とは何か

Kubernetes の Resource や特定の Resource の field(spec, status, etc) を あいまい検索する kubectl のプラグインです。あいまい検索で選択した Resource の field の Description を標準出力します。

$ kubectl explore
$ kubectl explore pod.spec
$ kubectl explore --context=onecluster

上記のように使い勝手が kubectl explain と変わらないように意識して作りました。

なぜ作ったか

  • kubectl explain で Description を得るには事前に field までの完全なパスを知る必要がある。知らないことの方が多かったので、"pod.spec" → "pod.spec.affinity" → "pod.spec.affinity.nodeAffinity" ... といちいちコマンドを実行して探すのが面倒だった。
  • kubectl explain は正確に取得したい field までのパスを入力する必要があり面倒だし、タイポしやすかった。

インストール方法

krew を使っている方なら以下のコマンドでインストール可能です。

kubectl krew install explore

他の方は GitHub Release からダウンロードできます。README に Install コマンド掲載しているので参照して下さい。

どうやって作ったか

作り方を学ぶ

Extend kubectl with plugins は公式の kubectl プラグインの作成ガイドです。これを参考にしました。あとは、スターが多い既存の kubectl プラグインを探してコードを読みました。

実装例を探す

kubernetes/kubectl は kubectl コマンド作りのお手本になります。今回作りたかったコマンドは、kubectl explain の拡張版なので、pkg/cmd/explain/explain.go, kubectl/pkg/explain pkg/cmd/cmd.go のソースコードを読みました。structのデザイン、関数名などを真似しました。特に Unit Test の書き方が非常に参考になりました。
また、あいまい検索(fuzzy-find)機能を追加した kubectl コマンドの d-kuro/kubectl-fuzzy を発見し、それが ktr0731/go-fuzzyfinder を使っていることを見つけました。これは fzf ライクな Go ライブラリで、自分のプロジェクトに使うことにしました。
残念ながら、fzf は Go ライブラリとしては使えません。メンテナがやりたくないので仕方がない🥲

Reddit でフィードバックをもらう

初回リリースをした後に Reddit に投稿しました。
https://www.reddit.com/r/kubernetes/comments/rwnqqi/kubectl_explore_a_better_kubectl_explain/
たくさん UpVote をもらうことができて、フィードバックももらえました。krew によるインストールのサポートや kubectl のグローバルオプションをサポートのアイデアは Reddit でもらいました。感謝しています🙏
"Introduction to plugin development" を読んで krew のサポートを実装しました。これを通じて他の kubectl プラグインを知ることになり勉強になりました。krew-index をご参照下さい。

さいごに

Open Source の数々の作品に感謝です。私はプラグインを作る過程がとても楽しかったです。このプラグインを使って機能要望やトラブルがありましたらご気軽に keisku/kubectl-explre までご連絡下さい。Star してくれたり Issue 作ってもらえると嬉しいです👌

Discussion