k9s使い方まとめ

## k9sとは ##

k9sとは、kubernetesクラスタをリッチなターミナルUIで操作するためのソフトウェアになります。

```
 ____  __.________
|    |/ _/   __   \______
|      < \____    /  ___/
|    |  \   /    /\___ \
|____|__ \ /____//____  >
        \/            \/
```


https://github.com/derailed/k9s

ほんの一例ですが、以下のようなオペレーションを簡単に行うことができます。

* 特定podの状態を確認する
* エラーが発生しているコンテナのログを確認する
* 特定のpodを削除する
* Deploymentのmanifestを編集する
* 特定のワークロードをロールアウトリスタートする

あまりにも便利すぎて、素のkubectlコマンドの使い方を忘れるくらい素敵なツールとなっています。


本記事ではそんなk9sの基本的な使い方をまとめました。

利用しているk9sのバージョンは0.22.1です。
バージョンによっては紹介しているオペレーションができない可能性もありますのでご了承ください。


## k9sを起動する ##


[インストール方法はこちら](https://github.com/derailed/k9s#installation)

基本コマンド

```
$ k9s
```

context指定でk9sを起動

```
$ k9s --context xxxxx
```

namespaceを指定してk9sを起動

```
$ k9s -n xxxxx
```

readonlyでk9sを起動。オペレーションミスによる事故を防ぐことができます

```
$ k9s --readonly
```

## リソースのナビゲーション ##

k9sを立ち上げると以下のように、リソース一覧が表示されます。
![Screen Shot 2020-09-25 at 19.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/1fa64752-0603-d5ae-bf1d-51e4a6c2d891.png)


基本的な操作は、任意のリソースを検索し、調査や特定のオペレーションを行うといったことをするかと思います。`?`でヘルプが表示されますので、操作に迷った際はご利用ください。

`:`をタイプすると、検索窓のようなUIが表示されます。非表示にする場合は`ESC`をタイプします。
この検索窓にどういったリソース名をタイプできるかは`ctrl-a`で一覧表示することができます。

ほんの一部ですが、頻繁に選択するリソースを紹介します。

|コマンド|アクション|
|:--|:--|
|:context, :ctx|コンテキスト一覧を表示する|
|:node, :no|ノード一覧を表示する|
|:pod, :po|pod一覧を表示する|
|:deployment, :deploy|deployment一覧を表示する
|:namespace, :ns|namespace一覧を表示する|
|:service, :svc|service一覧を表示する|
|:statefulset, :sts|statefulset一覧を表示する|
|:daemonset, :ds|daemonset一覧を表示する|
|:hpa|hpaの一覧を表示する|

検索窓にキーワードを入力する際、リソースの後にnamespaceを入力する事で指定したnamespaceに紐づくリソースを表示することができます。つまりnamespaceとリソースの選択をまとめて行うことができます。例えば`:pod default`と打ち込むと、default namespaceのpod一覧が表示されることになります。


### リソースの選択 ###
一覧表示されるリソースは`j` `k`でカーソルを動かして選択ができます。
`Enter`を押すと、そのリソースに紐づく情報が表示されます。

例えば、namespace一覧に表示される特定のnamespaceを選択して`Enter`を押すと
そのnamespaceに紐づくpod一覧が表示されます。
さらにpod一覧から特定のpodを選択し`Enter`を押すと、そのpodに存在するコンテナが表示されるといった具合です。

最終的にはコンテナを選択することで、そのコンテナのログを表示することができます。

このようにリソースを選択・ドリルダウンを繰り返すことで目的となるオペレーションを実施していきます。
ドリルダウンした後、ひとつまえのリソース一覧に戻る場合は`ESC`を入力します。

|コマンド|アクション|
|:--|:--|
|j,k|カーソルを移動|
|Enter|選択肢したリソースに紐づく情報を表示する|
|ESC|ひとつ前のリソースに戻る|
|ctrl-w|表示するフィールドを増やす|

### リソースの絞り込み ###

リソース一覧に大量にリソースが表示される場合、`/`で表示される検索窓にキーワードを入力することで一致するリソースを絞り込むことができます。
![Screen Shot 2020-09-25 at 18.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/64405e03-4659-4e66-1b2c-70affe4a2d2d.png)
絞り込む対象は表示されているリソースの情報全てが対象になりますので、
リソースの名前で絞り込むのはもちろんですが、そのStatusや、IPアドレス、Node等で絞り込むことができます。

ラベルによる検索は`-l xxx=xxxxxx`と入力することで可能になります。
例えばappラベルがlifullのリソースを検索する場合は`-l app=lifull`と入力することになります。


`ctrl-z`を押すと、異常なリソースのみの表示に切り替えることができます。
![Screen Shot 2020-09-25 at 19.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/204548df-59f8-3703-c78d-c7e6c638c289.png)
`:pod all`と`ctrl-z`を組み合わせることで、異常なpodをすぐに発見できたりします。

|コマンド|アクション|
|:--|:--|
|/keyward|キーワードでリソースを絞り込む|
|/ -l xxx=xxxxx|ラベルでリソースを絞り込む|
|ctrl-z|異常なリソースのみ表示する|
|u|リソース(configmapやsecret)を使用しているリソースの検索|


### リソースの並び替え ###
リソース一覧では以下のショートカットキーにより、リソースをソートすることが可能です。
CPUやメモリを大量に消費しているPodを検索するときなどに便利です。

|コマンド|アクション|
|:---|:---|
|shift-n|名前でソート|
|shift-c|CPU使用量でソート|
|ctrl-x|CPU使用率(Limit)でソート|
|shift-x|CPU使用率(Request)でソート|
|shift-m|メモリ使用量でソート|
|ctrl-q|メモリ使用率(Limit)でソート|
|shift-z|メモリ使用率(Request)でソート|
|shift-a|Ageでソート|
|shift-s|Statusでソート|

その他IPアドレスやNodeなどでのソートも可能です。
詳しくは`?`で、確認してください。

## オペレーション ##

リソースを特定したら、対象に対して以下のようなオペレーションが実行可能です。
readonlyでk9sを起動した場合は、実行不可なオペレーションもありますのでご注意ください。

### ログの確認 ###

`l`でコンテナのログを確認します。
どのリソースを対象にするかでどの範囲のログが表示されるか変わります。
例えば、podに対して`l`を押すと、そのpodのすべてのコンテナのログが表示されます。
podからさらにドリルダウンして、コンテナを対象にした場合、そのコンテナのログだけを表示することができます。
deploymentやstatefulsetといったワークロード単位に紐づくコンテナのログを表示することも可能です。

ログを表示すると以下のような画面が表示されます。
![Screen Shot 2020-09-28 at 18.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/640ebfda-aba9-8463-c7d3-a1d624dcd1b0.png)


この画面では、`k` `l` `j` `h`で画面をスクロールさせてログを確認していくことになります。デフォルトでは新たなログがどんどん追加されていきますが、`s`でその挙動を停止できます。
ログをすばやく送りたい場合は、`ctrl-f` `ctrl-b`を利用すると良いでしょう。

特定のエラーを検索したい場合は`/`で表示される検索窓にキーワードを入力して検索してください。




`t`で左側にタイムスタンプを表示できるので、時間が書いてないようなログでは重宝します。
![Screen Shot 2020-09-28 at 18.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/d66da351-f3c0-4cd0-1a16-2ff54c0744e7.png)



|コマンド|アクション|
|:--|:--|
|s|新たなログの読み込みを停止する|
|w|画面から表示しきれないログを折り返して画面内に収める|
|t|ログのタイムスタンプを表示する|
|f|フルスクリーンでログを表示する|
|k, l, j, h |上、右、下、左にスクロール|
|ctrl-f|スクロールダウン|
|ctrl-b|スクロールアップ|
|g|最上部のログへジャンプ|
|G|最下部のログへジャンプ|
|/|検索モード|
|c|ログのコピー|
|space|マークをつける|

### リソースの確認・操作 ###

k9sでは特定のリソースやワークロードに対して様々な操作を実行できます。

`d`で、`kubectl describe`と同じ結果が表示されます。
![Screen Shot 2020-09-28 at 18.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/fcf974ae-35a2-b66a-d2e2-6d24dc2ce37a.png)


`y`により、そのリソースのマニフェストを参照することができます。

`ctrl-d`で選択したリソースを削除することができます。削除前にダイアログが表示されるため、間違ってリソースを削除するような事態にはなりません。
![Screen Shot 2020-09-28 at 18.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/18b035b4-8067-e7f4-76ac-d2199d50bbe3.png)

`ctrl-k`は問答無用でリソースをKillするコマンドになりますのでお気をつけください。

`e`は、選択したリソースのマニフェストを編集モードにより編集することができます。直接マニフェストを編集する行為は好ましくありませんが、一時的にマニフェストを手軽く書き変えたい場合などに役に立ちます。
![Screen Shot 2020-09-28 at 18.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/2ebd5c25-c30c-25e8-644d-3299c31200ec.png)


`ctrl-t`でワークロードのロールアウトリスタートを実行します。deploymentやstatefulsetなどのワークロードを選択している場合にのみ有効です。
![Screen Shot 2020-09-28 at 18.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/f74d38bd-9297-462e-46ea-22c224f0f56a.png)


以下、よく使うコマンドをまとめました。

|コマンド|アクション|
|:--|:--|
|d|リソースの詳細を表示(kubectl describe)|
|y|リソースのマニフェストを表示|
|e|マニフェストの編集(kubectl edit)|
|ctrl-d|リソースの削除|
|ctrl-t|ワークロードのロールアウトリスタート|
|l|ログを確認する(kubectl logs)|
|space|リソースを選択する(複数選択可能)|

### シェルの実行 ###

コンテナを選択し`s`を押すことでシェルを実行することができます。
これは`kubectl exec -it xxxx -c xxxx -- /bin/sh`のような操作ができると思ってください。


## k9sの終了 ##

`ctrl-c`もしくは`:quit`でk9sを終了します。


## その他 ##

### クラスタのダッシュボードを表示する ###

`:pulse`と入力すると、クラスターに関するダッシュボードが表示されます。
![Screen Shot 2020-09-28 at 18.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/c9eeb371-8768-749f-8d2a-658c5c13b3ea.png)


deploymentやstatefulsetなどのワークロードがいくつデプロイされているか、podは何台あるか、などの情報が一目でわかるようになっています。
タブでそれぞれの情報にフォーカスすることができますので、そのままドリルダウンでリソースの情報を掘り下げる事が可能です。

### 各リソースの依存関係を表示 ###

`:xray pods`により、リソースの依存関係を可視化する事ができます。
![Screen Shot 2020-09-28 at 18.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/54b86d90-fb23-c917-1c05-1d3cffc26dc7.png)


とあるpodは、どのようなPVがマウントされているのか、どのようなconfigmapを参照しているのか、といった情報を一気に確認できるでしょう。

### クラスタを検証する ###

`:popeye`を入力することで、k9sがクラスタをスキャンし潜在的な問題を報告し、スコアリングしてくれます。
![Screen Shot 2020-09-28 at 18.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/19ab1343-43ae-ee3a-7bf2-d7906360264f.png)


root権限でコンテナが実行されている、limitが指定されていないなど、設定の不備をレポートしてくれるので、クラスタの健全性を保持するのに役に立つでしょう。
![Screen Shot 2020-09-28 at 18.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/d4bc8a58-9214-2333-be7b-3001b8dc3d57.png)


## 最後に ##

本記事では、k9sの基本的な使い方、よくつかうであろうコマンドを紹介させたいただきました。
今回は紹介できませんでしたが、設定ファイルをカスタマイズしたりプラグインを導入することでさらにk9sを便利に使うことも可能ですので、ご興味のある方は本家のドキュメントをご参考ください。


## 参考 ##

https://github.com/derailed/k9s
https://k9scli.io/