kubectl explain にあいまい検索(fuzzy-find)機能を追加したプラグイン kubectl-explore を作った
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 ライブラリとしては使えません。メンテナがやりたくないので仕方がない🥲
- https://github.com/junegunn/fzf/pull/1053#issuecomment-330024275
- https://github.com/junegunn/fzf/issues/2097#issuecomment-650682010
Reddit でフィードバックをもらう
初回リリースをした後に Reddit に投稿しました。krew
によるインストールのサポートや kubectl
のグローバルオプションをサポートのアイデアは Reddit でもらいました。感謝しています🙏
"Introduction to plugin development" を読んで krew
のサポートを実装しました。これを通じて他の kubectl プラグインを知ることになり勉強になりました。krew-index をご参照下さい。
さいごに
Open Source の数々の作品に感謝です。私はプラグインを作る過程がとても楽しかったです。このプラグインを使って機能要望やトラブルがありましたらご気軽に keisku/kubectl-explre までご連絡下さい。Star してくれたり Issue 作ってもらえると嬉しいです👌
Discussion