kubecolorでkubectlの出力に色を付ける

公開:2020/10/14
更新:2020/10/14
5 min読了の目安(約4900字TECH技術記事

1. はじめに

kubectlはKubernetesクラスタを操作するためのCLIクライアントです。
筆者は仕事でほぼ毎日kubectlを使用しますが、その使い勝手に対して一点改善したい点がありました。それは、 出力が一色のみで見辛い という点です。
この記事では、筆者が開発したkubectlの出力に色を付けるためのOSS "kubecolor" について紹介します。筆者はkubecolorは非常に便利で、もっと多くの人に使ってもらいたいと考えているため、この記事を書くことにしました。
次章からは、既存のkubectlに対して筆者が改善したいと感じていた点についてもう具体例を上げながら説明し、その後kubecolorではそれをどう改善できているのかを解説します。そして、kubecolorの使い方について説明します。

また本記事では、「見やすい」「見辛い」「わかりやすい」などの表現を使用しますが、筆者は色彩学やデザインの専門家では一切なく、単なる主観であることをご了承ください。

2. kubectlを改善したかった点

初めに、素のkubectlの出力を見てみます。(画像内で使用しているクラスタはテスト用のものです)

kubectlは出力に色を一切つけません。上の画像はまだ出力結果が十分に短いため視認性に大きな問題はありませんが、 "kubectl describe" や "kubectl get -o json" など、大きめの出力を行うコマンドは、次のように見えます。

出力が大きくなると、先程よりも「見辛く」感じないでしょうか。もちろん個人差があるとは思うのですが、筆者は欲しいデータがどこにあるかを瞬時に認識することが難しいなと以前から感じていました。これが、筆者がkubecolorを開発した理由です。
次章では、kubecolorがどのようなアプローチで「見やすさ」に貢献できるかを解説します。

3. kubecolorを使うと何が変わるか

kubecolorは筆者が開発したOSSで、以下のGitHubリポジトリで開発しています。

https://github.com/dty1er/kubecolor

ライセンスはMITです。

さて、冒頭の画像で既にお見せしてしまっていましたが改めて、kubecolorを使うとkubectlの出力は以下のように見えます。

  • kubectl get pods

  • kubectl describe pod

  • kubectl get pods -o json

  • kubectl get pods -o yaml

また、コマンドがエラーを出力した場合、kubecolorはそれを赤で出力することでエラーが起きたことをユーザーにわかりやすく伝えることもできます。

色がつくことで、かなり見やすくなったのではないでしょうか。筆者は元々の一色のみの出力よりも、目的のものが見つけやすくなったなと感じます。
次章では、kubecolorのインストール方法及び使い方などについて解説します。

4. kubecolorの使い方

本章の内容は、kubecolorの開発が進むにつれ最新の情報でなくなる可能性があります。

kubecolorは何をするのか

kubecolorはkubectlコマンドに渡すべきコマンドラインオプションを受け取り、内部でkubectlコマンドを実行し、帰ってきた出力に色付けしてその後出力します。色付け以外のことは何もしません。
kubecolorコマンドはまだ開発中であり、kubectlの全てのサブコマンドの出力に対して色付けをサポートしているわけではありません。また、出力に用いる色が今後変更される可能性もあります。サポートされている機能や今後実装されるものについて、READMEをご覧ください。

インストール

kubecolorはGoで実装されており、インストールにはgoコマンドを使用します。goコマンドがインストールされていない場合はまず公式ドキュメントなどを参考にインストールする必要があります。

インストールは次のコマンドで行うことができます。

go get github.com/dty1er/kubecolor/cmd/kubecolor

アップデートは次のコマンドで行うことができます。

go get -u  github.com/dty1er/kubecolor/cmd/kubecolor

(上記コマンドを実行してもkubecolorコマンドが実行できない場合、 $GOPATH/bin$PATH に入っていない、Go modulesが有効になっていて $GOPATH/bin にバイナリができていないなどの原因が考えられます。)

使い方

kubectlコマンドに渡したいコマンドをそのままkubecolorに渡すことで、出力が色付けされます。例えば、次のようなコマンドが考えられます。

kubecolor --context my-context get pods
kubecolor edit deployment
kubecolor exec -it pod-a bash

kubecolorはkubectlコマンドを完全に代替するものとして設計してあります。
これはすなわち、以下のようなaliasをシェルに設定しても機能するようになっていることを意味します。

alias kubectl=kubecolor

しかし、単にこれを設定するとkubectlのネイティブの補完機能が動作しなくなります。対処法は後述します。

有効なコマンドラインオプション

--plainで色をつけなくする

--plain フラグをkubecolorに渡すと、kubecolorは色をつけずに出力します。結果をファイルに書き込みたい時などに便利です。

--light-backgroundで使用する色を設定する

kubecolorが色付けに使用する色のプリセットは、デフォルトでは「背景が暗い色に設定してあるターミナルエミュレータ」上で見やすくなるように設定されています。これは逆に言えば、ターミナルの背景を白などの明るい色に設定している環境では、kubecolorの使う色が見えにくいと感じる可能性があります。 --light-background フラグをkubecolorに渡すことで、明るい背景に最適な色のプリセットを使って出力に色付けを行うようになります。
実際に背景色を白に設定したターミナルで、kubecolor describe podコマンドを実行します。 --light-background なしでは次のように見えます。

--light-background をつけると、次のように見えます。

白 -> 黒に、シアン -> 濃い青にそれぞれ変わったことで、読みやすくなります。

kubectlの自動補完機能と組み合わせる

kubectlにはネイティブに自動補完機能があります。これは、kubectlコマンドに対して補完を効かせるようになっているため、kubecolorコマンドでも同様に補完を効かせるためには次の設定が必要です。

complete -o default -F __start_kubectl kubecolor

また、もし k=kubecolor などのaliasを貼る場合は、次のようにする必要があります。

complete -o default -F __start_kubectl k

なお、この設定はbash上で期待通りに動作することを確認済みですが、fishなどでは事情が違います。kubectlの補完機能はfishをオフィシャルにサポートしていないためです。fish上での自動補完動作は調査中のステータスです。(fishに詳しい方がいれば、どうすれば補完可能か情報提供いただけると助かります!)

kubectlコマンドを指定する

kubecolorは内部でkubectlコマンドを実行しますが、そこで利用するコマンドを変更したいことがたまにあります。例えば、gcloudを使えばkubectlをバージョン違いでインストールできますが、(kubectl.1.18など) これをkubecolorに使わせたいときは、次のようにします。

KUBECTL_COMMAND="kubectl.1.18" kubecolor get pods

KUBECTL_COMMAND に何もセットしていない場合、kubecolorはデフォルトで kubectl を使用します。

おわりに

筆者が開発したOSS kubecolorについて紹介しました。色がつくとkubectlライフがより便利で、そして楽しくなりますね!ぜひ使ってみてください。
良さそうだなと思ってもらえたら、GitHub上でスターを付けてもらえると嬉しいです!また、issueやプルリクエストも歓迎です。
最後までお読みいただきありがとうございました。