kubectlが捗りそうなkrewプラグイン試してみた

# はじめに
GKEの管理をしていて日々kubectlを打っているのですが、最近`krew`というツールの存在を知りました。
`krew`のプラグインを活用することで、kubectlをもっと便利に使えるようになります。

そこで本記事では、いくつかプラグインを触ってみて便利そうだなと思ったものをサンプルコマンドと共に紹介していきます。

# 前提
- krewのインストール手順は下記ドキュメントをご参照下さい。
https://krew.sigs.k8s.io/docs/user-guide/setup/install/

- kubectlはエイリアスを張っているので、本記事では全て`k`コマンドになっています。


# krewの基本的なコマンド
```zsh
# krewの更新（リストの更新）
$ k krew update
# インストール済みのプラグインの更新
$ k krew upgrade

# プラグインの検索
$ k krew search

# プラグインのインストール
$ k krew install {プラグイン名}
# プラグインのアンインストール
$ k krew uninstall {プラグイン名}

# インストール済みプラグインを一覧表示
$ k krew list
```


# 便利プラグイン紹介

※ 個人的に使う場面が多そうなプラグインです。便利なプラグインは他にも沢山あるのでぜひ探してみてください。
[krewプラグイン一覧](https://krew.sigs.k8s.io/plugins/)

```zsh
# 2023/06現在で200以上のプラグインがあります
$ k krew version      
OPTION            VALUE
GitTag            v0.4.3

$ k krew search |wc -l
     218
```

## ctx
[ctx](https://github.com/ahmetb/kubectx)

簡単にコンテキストを変えて、操作対象クラスタを切り替えできる。
日常的に操作するクラスターが複数あるときにかなり便利。
これまで`kubectx`使ってましたが、こっちでも良いなと思いました。

```zsh
# 対象のクラスタ確認
$ k ctx
# 切り替え
$ k ctx my-cluster-1
```


## ns
[ns](https://github.com/ahmetb/kubectx)

簡単にnamespaceを切り替えできる。クラスタ内で複数namespaceを操作するときに便利。

```zsh
# default名前空間に切り替え
$ k ns default

# kube-system名前空間に切り替え
$ k ns kube-system
Context "gke_xxx_my-cluster-1" modified.
Active namespace is "kube-system".

# 確認
$ k get deploy
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
event-exporter-gke      1/1     1            1           1d
kube-dns                2/2     2            2           1d
kube-dns-autoscaler     1/1     1            1           1d
```

## neat
[neat](https://github.com/itaysk/kubectl-neat)

既存リソースを`get -o yaml`で出力したマニフェストから、k8sが自動付与した冗長な記述を削ぎ落として表示してくれる。
マニフェストがかなり読みやすくなる。個人的にかなり好みです。
おそらく、getできれば何に対しても利用できると思います。

```zsh
$ k get po my-pod -o yaml | k neat

# もちろんdeploymentでも
$ k get deploy my-deploy -o yaml | k neat

# json表示も可能
$ k get deploy my-deploy -o yaml | k neat -o json
```


## stern
[stern](https://github.com/stern/stern)

k8sの複数のPodとコンテナをtailできる。色分け表示されるので分かりやすい。
`kubectl logs`をPodごとに実行しなくても良いので、デバッグ時等に大活躍します。
Pod名のクエリは正規表現で指定

```zsh
$ k stern {マッチするPod名}

#　全namespaceの全podのログ
$ k stern hello -A
```


## resource-capacity
[resource-capacity (kube-capacity)](https://github.com/robscott/kube-capacity)

Node・PodごとにResource Request/Limitを一覧表示してくれる。
従来なら`k describe node`の長ったらしい出力の中から見にいかないといけないのを、簡略化して表示してくれるので、個人的にすごく好みです。

```zsh
# ノードごとの使用率・合計使用量を表示
$ k resource-capacity
---
NODE         CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*            2237m (38%)    343m (5%)    3795Mi (20%)      5355Mi (29%)
gke-node-1   573m (29%)     100m (5%)    1250Mi (20%)      1610Mi (26%)
gke-node-2   1033m (53%)    100m (5%)    1200Mi (19%)      1780Mi (29%)
gke-node-3   631m (32%)     143m (7%)    1345Mi (22%)      1965Mi (32%)
---

# ノードごとの空き容量・合計空き容量を表示
$ k resource-capacity -a
---
NODE         CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*            3553m/5790m    5447m/5790m   14321Mi/18116Mi   12761Mi/18116Mi
gke-node-1   1357m/1930m    1830m/1930m   4789Mi/6039Mi     4429Mi/6039Mi
gke-node-2   897m/1930m     1830m/1930m   4839Mi/6039Mi     4259Mi/6039Mi
gke-node-3   1299m/1930m    1787m/1930m   4694Mi/6039Mi     4074Mi/6039Mi
---

# ノード別でPodごとの使用量を表示
$ k resource-capacity -p
---
NODE         NAMESPACE   POD       CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*            *           *         2237m (38%)    343m (5%)    3795Mi (20%)      5355Mi (29%)
                                              
gke-node-1   *           *         573m (29%)     100m (5%)    1250Mi (20%)      1610Mi (26%)
gke-node-1   default     my-pod-1  50m (2%)       0m (0%)      250Mi (4%)        250Mi (4%)
gke-node-1   default     my-pod-2  200m (10%)     0m (0%)      600Mi (9%)        600Mi (9%)
...
---

# namespaceを絞って表示
$ k resource-capacity -p -n default

# 並び替え表示（下記はCPU request値の降順）
$ k resource-capacity -p --sort cpu.request

# 実際の使用状況も表示
$ kube-capacity -u
```


## status
[status](https://github.com/bergerx/kubectl-status)

describeやgetよりも、リソースのステータスをわかりやすく表示してくれる。

```zsh
# 全Deploymentの詳細を表示
$ k status deploy
# 特定のものだけ
$ k status deploy my-deploy

# podやingress, service等も可能
```


## get-all
[get-all](https://github.com/corneliusweig/ketall)

従来の`k get all`では全てのリソースを表示してくれなかったのを、krewのget-allなら本当に全部表示してくれる（らしい）。
初見で全部のリソースを俯瞰したい時とか、変なリソース作られてないか確認したい時に役立ちそう。
GKEのカスタムリソースである`managedcertificate`なども出力してくれたので、結構イケてそうです。

```zsh
$ k get-all
## 大量に出力されるので、ファイルに書き出した方が良さそう
$ k get-all > get-all.txt

# namespace指定
$ k get-all --namespace=default
# scope指定
$ k get-all --only-scope=cluster
```


## images
[images](https://github.com/chenjiandongx/kubectl-images)

Podが使用しているコンテナイメージを一覧表示してくれる。

```zsh
# 表形式で表示（場合によっては体裁崩れて見づらい）
$ k images

# 箇条書き表示。個人的にこっちの方が見やすい
$ k images -oy
- pod: my-pod
  container: my-container
  image: gcr.io/my-project/example:sha

# 抜粋表示
$ k images -oy -c 1,3
- pod: my-pod
  image: gcr.io/my-project/example:sha
```


## tree
[tree](https://github.com/ahmetb/kubectl-tree)

リソースの関係をツリー表示してくれる。
初見のリソースについて把握したいときに便利そう。

```zsh
$ k tree deploy my-deploy
$ k tree svc my-service

## ingressはできないっぽい..
```


# 参考
- https://krew.sigs.k8s.io/plugins/
- https://techblog.yahoo.co.jp/entry/2020081830014718/
- https://zenn.dev/tmrekk/articles/580f2e2bb39d5f#stern
- https://blog.morihaya.tech/entry/2022/05/22/161747
- https://amateur-engineer-blog.com/kube-capacity/