地球上の Kubernetes ユーザーは絶対使うべきツールたちを紹介するよ

# これはなに？

これは [Ubie アドベントカレンダー 2019](https://qiita.com/advent-calendar/2019/ubie) の6日目の記事です。
今日は SRE の @kamina_zzz が担当します :muscle: 


## こんな方を想定してます

- Kubernetes(k8s) を使っている初心者から玄人まで
- CUI がお好き
- Lazy

また、筆者の環境はこんな感じですので異なる部分は適宜吸収してください :pray: 

- iOS
- Kubernetes v1.14.7

# はじめに

k8s ユーザはみんな一度は使ったことがあるはず、 `kubectl` コマンド。

- k8s cluster 内部の状態を見たり操作する
- Operations, Resource types, Output options を組み合わせてつかう

って感じのコマンドなんですが、具体的にはこんな感じで使いますよね。

```sh
$ kubectl get pods
$ kubectl describe deployments my-app-name -n my-app-namespace
```

みなさん「あぁ、せやな」って感じだと思うんですが、実はこの `kubectl` 、デフォルトのままだといろいろと不便ですよね？

なので今回は **Kubernetes 界隈のみんなが使っているツールたち** を紹介していきます！ [^1]

[^1]: 筆者の独断です。みんながやってるかは知りません。ごめん。あと別にデフォルトで不満ないならそれで全然良いと思う。

※ ちなみに判断基準は概ね GitHub star です。

# 言うほど不便か…？

まあそうなんですよね。別に必要なことはできるし。だけど毎日触ってるとこんな気持ちになってくるんです。

- 複数のクラスタを管理してるとクラスタの切り替えを頻繁にやらなきゃだけどめんどくさい
- コマンドが長い
    - `kubectl describe deployments my-app-name -n my-app-namespace` って毎回打つの？無理、たすけて
- `namespace` って毎回指定します？ `deployments` 見て `pods` 見て、って時に毎回？？キツくない？
- etc etc...

てな感じでもっと便利にできそうなところです。便利にしていこう。

# krew

この手の話でよくある流れっちゃそうなんですが、例によって `kubectl` も **plugin で好きなようにカスタマイズ** することができます。
そして `krew` という名前の、まあ Homebrew の `kubectl` バージョンみたいなパッケージマネージャがあり、それを使うのが便利です。

インストールの手順などは [krew の repo](https://github.com/kubernetes-sigs/krew/) を見てもらうとして、こんな感じで使うツールです。
試しに [`kail` という LinkedIn の CTO の方が公開しているツール](https://github.com/boz/kail)をインストールしてみましょう :wrench: 

```bash
$ kubectl krew search
$ kubectl krew install tail # krew には tail という名前で公開されている
```

brew コマンドと同じですね。
こうしてインストールすると `kubectl` のサブコマンドとしてプラグインを実行できます。

```bash
$ kubectl tail --ns my-app-ns --deploy my-app
```

簡単ですね！これで便利なものをどんどん入れて使いやすくしましょう :muscle: 

# kubectx

複数クラスタを管理するときの context 切り替えが便利になります。

```bash
$ kubectl krew install ctx
$ kubectl ctx
#=> credentials に基づいて選べる context 一覧が表示される
```

さらに、[`fzf` コマンド](https://github.com/junegunn/fzf) がインストールされていると fuzzy/incremental search ができて、 CUI 上で選択して切り替えられるので、めちゃ早くておすすめです :boom: 

例えば
- もともと `test` context にいる
- `coffee` context へ切り替え
- `get pods` すると `coffee` のものが表示される
- `kubectx -` で一つ前の `test` context へ戻る
- `get pods` すると `test` のものが表示される
というケースではこんな感じに動きます。
![kubectx-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39318/5a3f41d0-3ac0-d3a3-3235-dfbe44142d7c.gif) [^2]

[^2]: [公式 README](https://github.com/ahmetb/kubectx/) から拝借

ご覧のように `kubectx` は plugin としてではなく、普通のツールとして Homebrew 等を経由してインストールできます。
そのため上のように公式の README では `kubectx` コマンドを実行したサンプルが用意されています。

# kubens

`namespace` をいちいち指定するの大変ですよね。これは `namespace` の指定をしなかった場合にデフォルトの `namespace` を予めセットしてくれるツールです。

同様に `kubectl krew install ns` すると、`kubectx` と同じように使えるようになります。
また、こちらも `fzf` 対応、単独インストール可能です。

例によって `default` ns -> `kube-system` ns -> `default` ns への遷移はこんな感じでできます。
![kubens-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39318/c9145ef5-2291-756b-b13d-81273a601ec5.gif)
[^2]

# kube-aliases

そもそも `kubectl get pods[po]` って打つの大変なので alias とか作ろうという気持ちになります。
ですが `kubectl` の特性上、よくやるコマンドは大枠あっても微妙に resource が違ったり output が違ったりして都度 alias を作るのは大変です。
これをあるパターンにそってガッと生成してくれたセットを **kubectx, kubens と同じ作者の方が公開されています** :tada: 
パターン化されているので alias 自体も覚えやすく、かなり良いです。

インストール方法は [公式の README](https://github.com/ahmetb/kubectl-aliases) を見てもらうことにしますが、シンプルに alias がたくさん書かれたファイルを bash/zsh の config で読み込むだけです。

いくつかの alias を見てみましょう。

```bash
$ alias k
#=> k=kubectl
$ alias kgpo
#=> kgpo='kubectl get pods'
$ alias kddep
#=> kddep='kubectl describe deployment'
$ alias ka
#=> ka='kubectl apply --recursive -f'
$ alias krm
#=> krm='kubectl delete'
```

これで長々したコマンドはもう打たずに済みそうです :tada: 

# おわりに

終わってみれば

- パッケージマネージャをつかって便利にカスタマイズ
- alias 貼ってコマンドの簡素化

という、こういうツール系にありがちな流れではありますが、なんだか kubectl 周りについてはあまり知られてないような気がしたので書いてみました。
(もしかするとみんな既に知ってるだけの可能性がありますが気にしないことにします。)

みなさんも便利そうなプラグインを探してみて下さい :mag: 
ありがとうございました！