意外に知られていないかもしれないk9sの小技集

私が仕事でKubernetesの運用業務に携わり、k9sを使うようになって4年が経ちました。

Kubernetesクラスタを運用するにあたり、私にとってk9sはなくてはならない存在ですが、長年利用していく中で実はこんなこともできたんだ、という発見がいくつもあります。

本エントリーでは、意外に知られていなさそうなk9sの機能、小技などを紹介させていただきます。

k9s自体の説明や、基本操作に関しては以前書いた記事を参考にしてください。

https://qiita.com/t0m0ya/items/15ee4d43dcda4701946c

使用しているk9sのバージョンは、執筆時点で最新の0.32.7になります。

お使いのバージョンによっては、今回紹介する機能やオペレーションに対応していない可能性もありますのでご注意ください。

## 紹介する小技の早見表

まず、最初に本記事で紹介する内容のまとめを以下に書いておきます。
詳しく知りたい方は、後続の内容をご確認ください。

| やりたいこと | 操作 |
|:-:|:-:|
| 特定のnamespaceの特定のリソースを表示する  | `:リソース namespace名`  |
| 特定のリソースをすべて表示する  | `:リソース all`  |
| 異常なリソースだけを表示する  | `ctrl-z`  |
| コンテキストを切り替える  | `:ctx コンテキスト名`  |
| リソース名をクリップボードにコピーする  | `c`  |
| リソースのnamespaceをクリップボードにコピーする  | `n`  |
| リソースをソートする  | `shift-c` `shift-m` `shift-a`|
| PodがスケジュールされているNodeを見る | `o`  |
| ownerReferenceのリソースにジャンプする  | `shift-j`  |
| CronJobをすぐに実行する  | `t`  |
| CronJobをsuspendする  | `s`  |
| Logをコピペしやすくする  | `f`  |
| 特定のConfigMap/Secret/PVCを利用しているPodを見つける  | `u`  |
| Secertの内容を確認する  | `x`  |
| 表示している情報を保存する  | `ctrl-s`  |
| k9sのUIの崩れを直す  | `export LC_CTYPE="en_US.UTF-8"`  |


## 特定のnamespaceの特定のリソースを表示する

`:リソース namespace名`で可能です。

以下のようにリソースはなんでもOK。

`:dp namespace名`
`:sts namespace名`
`:svc namespace名`

重要なのは、リソースの後に限定したいnamespaceを打ち込むこと。

![スクリーンショット 2024-12-09 0.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/e240593c-82b0-b57a-f109-b4cc0d285429.png)

`:リソース namespace名 /検索文字`
で、さらに特定の文字で検索した状態にできます。

![スクリーンショット 2024-12-09 0.36.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/39cc01ef-fdd1-efce-bc3e-b27fcbc25dc1.png)


`:リソース namespace名 @context名`
で、コンテキストと組み合わせて指定することも可能です。

![スクリーンショット 2024-12-09 0.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/f18005f4-1881-08d3-76ea-3591c1590918.png)


ここまでやることはあまりないと思いますが、
`:リソース namespace名 /検索文字 @context名`
と打ち込むことも可能です。

![スクリーンショット 2024-12-09 0.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/ea710831-2034-9125-c8d1-059a7ca226dd.png)

## 特定リソースをすべて表示する

allを指定することですべてのnamespaceの特定のリソースを表示することができます。

例えば、クラスタ上に存在するすべてのPodを表示する場合は`:po all`と入力します。

![スクリーンショット 2024-12-09 0.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/2c188c06-41a5-2d28-35bd-584d0fd657e3.png)

リソース名わかるけどnamespaceがわからない場合などに`/検索文字`と組み合わせてよく使います。


## 異常なリソースだけを表示する

`ctrl-z`で異常なリソースのみの表示に切り替えることができます。
再度`ctrl-z`で通常の表示に戻ります。

![スクリーンショット 2024-12-09 1.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/33625189-6c80-22ec-a9bb-a8156331a02c.png)

![スクリーンショット 2024-12-09 1.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/56bb595f-79ca-8396-8f0c-fda57b80b059.png)

`:po all`ですべてのPodを表示して、`ctrl-z`で、クラスタ全体で異常なPodを瞬時に確認することができます。


## コンテキストを切り替える

`:ctx`でコンテキスト一覧を表示して、選択するでも良いですが

![スクリーンショット 2024-12-08 23.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/b2cf7784-6c6a-f680-afe0-6f045adaadd8.png)


`:ctx コンテキスト名`といった具合に、コンテキスト名を一緒に入力すると一手でコンテキストを切り替えられます。


## リソース名をクリップボードにコピーする

`c`でクリップボードにリソース名をコピーできます。

![スクリーンショット 2024-12-09 0.42.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/10bc8932-9894-a27e-0763-b0687aec3708.png)


わざわざ、マウスで選択してコピーする必要はありません。

## リソースのnamespaceをクリップボードにコピーする

`n`で選択したリソースのnamespace名をクリップボードにコピーできます。

![スクリーンショット 2024-12-09 0.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/1fbeaebb-2b97-f7f7-e3ef-6b0bc55c7bc3.png)


## リソースをソートする

shiftと組み合わせることでリソースを色々な要素でソートできます。
大抵の場合以下の3パターンを覚えておけばOKだと思います。

`shift-c` CPU使用量でソート
![スクリーンショット 2024-12-09 1.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/ccc6ee53-d3e9-af25-955a-4ef71243c069.png)

`shift-m` Memory使用量でソート
![スクリーンショット 2024-12-09 1.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/7595ee45-453e-c9d5-34c2-3cfc20d80751.png)

`shift-a` Ageでソート
![スクリーンショット 2024-12-09 1.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/82aca10c-527e-665f-be3d-db6adac27e59.png)

上記外は、`:?`でヘルプ画面を表示して確認してください。


## PodがスケジュールされているNodeを見る

Podの異常を調査しているときに、そのPodがスケジュールされているNodeの情報を調べるケースはよくあると思います。

対象のPodを選択した状態で`o`を打ち込むとそのPodがスケジュールされているNodeのみが表示された画面に遷移できます。

![スクリーンショット 2024-12-09 0.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/98610187-d736-ad03-638e-d87deb01feb2.png)

![スクリーンショット 2024-12-09 0.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/726cde99-6f29-ae2e-5203-8b5b0d8e41a0.png)


`:node`でNode一覧を選択し、Node名で検索するよりもこちらの方が早いです。


## ownerReferenceのリソースにジャンプする

Podの異常を検知して、そのPodに紐づくDeploymentの内容を確認したいとなった場合、どうしますか？Deploymentを表示するようにして、そこから検索文字で絞り込みますか？

そんな時は、`shift-j`で選択したリソースのownerReferenceを辿ることができます。

対象となるPodを選択して`shift-j`でReplicasetにジャンプ
さらに`shift-j`でDeploymentにジャンプできます。

![スクリーンショット 2024-12-09 1.13.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/02b857de-0672-4f83-50cd-b1562721b07e.png)

![スクリーンショット 2024-12-09 1.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/cd7f2e2d-e395-3a93-741a-8adbdf4d6535.png)

![スクリーンショット 2024-12-09 1.13.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/48868923-3ec0-fd1a-7e13-9a25969d9c15.png)

他にも、JobからCronJobに遡る時にも利用できますね。

## CronJobをすぐに実行する

CronJobを選択し、`t`でtriggerすることができます。

![スクリーンショット 2024-12-09 22.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/9cdd84cf-16b2-ecb2-9b19-f715db0aee62.png)

作成されるJob名は、cronjob名-manual-ランダム文字列になります。

![スクリーンショット 2024-12-09 22.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/e53ec56e-1f6c-bc79-63ff-9b63861cf99d.png)


## CronJobをsuspendする

任意のCronJobを選択し`s`でsuspendをtrueに切り替えることができます。

![スクリーンショット 2024-12-09 22.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/f7aa161b-a067-8015-e9ec-06b1255c002a.png)

suspendがtrueなCronJobの場合、`s`を押すとfalseに切り替えます。

![スクリーンショット 2024-12-09 22.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/d5e8439b-b73f-fe53-cb18-b20618f84d0c.png)

## Logをコピペしやすくする

k9sでログを表示して、そのログをコピペしてどこかに貼り付けることはよくあります。
k9sで表示するログは、枠で囲われているので素直にログをマウスで選択しようとするとその枠線まで選択してしまい余計な記号が入り込んでしまいます。

![スクリーンショット 2024-12-09 1.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/e358e483-ce0c-8677-9d98-bbaa6a8458e6.png)

`f`で、フルスクリーンでログを表示することができます。フルスクリーン状態では上記の枠線が取り除かれるため、矩形選択をせずともログを選択しやすくなります。

![スクリーンショット 2024-12-09 1.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/5d1e3a14-f35f-49ed-c6d8-6cc53d0c7b7e.png)

ちなみに、ログ全体をコピーしたい場合は、`c`を押すと、すべてのログをクリップボードにコピーすることができます。


## 特定のConfigMap/Secret/PVCを利用しているPodを見つける

`:cm`で対象となるConfigMapを選択して`u`で、そのConfigMapを利用しているPodを見つけることができます。

![スクリーンショット 2024-12-09 13.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/2d08b846-b62b-4f76-fd2f-90cb95ff21b2.png)

![スクリーンショット 2024-12-09 13.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/b9be3782-3a44-1ea6-42d4-ca353f4e8610.png)


ConfigMapだけでなく、SecretやPersistentVolumeClaimでも`u`は利用可能です。


## Secertの内容を確認する

Secretをの中身を確認する場合は、describeした状態で`x`を押すことで、　Base64デコードした状態の内容を確認することができます。

![スクリーンショット 2024-12-09 22.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/f4344fc2-6efb-d4cc-b554-9ecd8e491251.png)

![スクリーンショット 2024-12-09 22.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/92c9ab43-349b-e7fb-150b-37994074549a.png)

![スクリーンショット 2024-12-09 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/22203374-c7eb-8694-8250-2a34434d773c.png)


わざわざ文字列をコピーしてきて、手元でBase64デコードして内容を確認する手間が省けますね。


## 表示している情報を保存する

`ctrl-s`で表示している情報をcsv形式で保存できます。

![スクリーンショット 2024-12-09 13.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/3a46364e-9661-5ee4-8a34-91fb5552be28.png)

保存したファイルは`:sd`で確認できます。

![スクリーンショット 2024-12-09 13.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/4ebbd70d-d7a7-aad0-0045-21d035e39828.png)

`:sd`でファイルの一覧が表示されるので、ファイルを選択することで中身をかくにんすることができます。

![スクリーンショット 2024-12-09 13.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/e9be41dd-7b32-7fa6-a089-9b0411d68f8b.png)



## k9sのUIの崩れを直す

皆さんのk9sのUIがこんな感じで崩れていることないですか？

![スクリーンショット 2024-12-08 23.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/c5b44cc4-82e8-0c5b-f7ff-7883a398a185.png)

原因はお使いのPCのlocaleの設定です。
LC_CTYPE="ja_JP.UTF-8"に設定されていると、表示が崩れます。

表示が崩れていても、操作に大きな支障はありませんが、スタイリッシュな見た目で操作したい場合は、LC_CTYPE="en_US.UTF-8"などに設定してk9sを利用しましょう。

![スクリーンショット 2024-12-08 23.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/a206e736-5ccb-ee5f-ded8-09534efebe50.png)



# おまけ

使う機会はほとんどないですが、こんな機能も実はありますという紹介です。


### コンテナからファイルをダウンロードする

Pod一覧から任意のPodを選択し、`t`を押すと以下のダイアログが表示されます。

![スクリーンショット 2024-12-09 21.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/d0bb0e01-726b-ae80-9a9f-c7ec6410fcc0.png)

Fromにダウンロードしたいコンテナ上のファイルのパス
Toにローカルのファイルパスを入力することでファイルのダウンロードすることができます。

また、ローカルからPodのコンテナにファイルをアップロードすることも可能です。

![スクリーンショット 2024-12-09 21.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/8f0d7deb-9e1e-81c7-fd59-72a1cf1fc3b8.png)


### 不要なPodを一括で削除する

CompletedやerrorなstatusのPodを一括削除するのが`z`(Sanitize)です。

Pod一覧で`z`を押し、表示されるダイアログに「Yes Please!」と打ち込むと発動します。

![スクリーンショット 2024-12-09 22.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/9cafa44c-fc45-b64f-1eb5-bf82cda8fc2c.png)

![スクリーンショット 2024-12-09 22.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/1d81f68e-c93d-0c3f-5d1b-1ca9988e887d.png)

特定のnamespaceのPod一覧画面で実行した時は、そのnamespaceのPodのみが対象になります。

`:po all`でPodを表示している場合は、すべてのnamespaceのPodが対象になります。

### 牛にしゃべらせる

`:cow xxx`

で入力した文字列を牛がしゃべります。

![スクリーンショット 2024-12-09 23.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544882/2a064fdc-5551-ef42-3108-5e8967d215f9.png)



以上です。

今回の記事を通して、少しでも皆さんのお役に立てれば幸いです。