🦔

Kubernetesを使う上で知っておきたいツールやプラグイン

2021/12/10に公開
4

本記事では、普段Kubernetesを触っている中で便利に感じたツールやコマンドをざっくばらんに紹介します。
Kubernetes初心者からベテランまで幅広く楽しんでいただければ幸いです。

krew

krewでは、kubectlのプラグイン管理を行います。
これ以降、本記事で紹介するプラグインは全てkrew経由でインストールが可能です。
https://github.com/kubernetes-sigs/krew/

インストール

brew install krew

インストール可能なプラグイン一覧

kubectl krew search

プラグインのインストール・アンインストール

kubectl krew install <plugin name>

kubectl krew uninstall <plugin name>

インストール済みのプラグイン一覧

kubectl krew list

では、早速kubectlプラグインを紹介していきます!

stern

sternとは、Kubernetes上の複数のPodと、Pod内の複数のコンテナをtailすることができます。
また、各Podは色分けされているのでデバッグがとても捗ります。
sternを使わない場合、Pod名を検索して、kubectl logs ~と実行する必要がありますが、sternを使うことでそれらを省略することができとても便利です。
https://github.com/stern/stern

インストール

kubectl krew install stern

特に、自分がよく使うコマンドを紹介します。

基本

stern nginx-deployment

ラベルでフィルタリング

stern -l run=nginx-deployment

jqを使って整形

stern nginx-deployment --output json | jq .

ログの行数を指定

stern nginx-deployment --tail 1

kube-iexec

kubectl-iexec は、実行中のPodにexecするためのインタラクティブなセレクタを提供するプラグインです。
Pod名やPod内のコンテナ名を把握することなくkubectl execすることができます。
https://github.com/gabeduke/kubectl-iexec
インストール

kubectl krew install iexec

基本

kubectl iexec nginx

Namespace内のPodにexecする

kubectl iexec -n default

kubectl-view-allocations

kubectl-view-allocationsは、Nodeや実行中のPodのマニフェストに定義されているリソースの割り当てを一覧表示します
https://github.com/davidB/kubectl-view-allocations
インストール

kubectl krew install view-allocations

基本

❯ kubectl-view-allocations
 Resource                                              Requested         Limit  Allocatable    Free
  cpu                                               (16%) 950.0m   (2%) 100.0m          6.0     5.0
  └─ kind-control-plane                             (16%) 950.0m   (2%) 100.0m          6.0     5.0
     ├─ coredns-558bd4d5db-8sk5w                          100.0m            __           __      __
     ├─ coredns-558bd4d5db-l4c4f                          100.0m            __           __      __
     ├─ etcd-kind-control-plane                           100.0m            __           __      __
     ├─ kindnet-nrmss                                     100.0m        100.0m           __      __
     ├─ kube-apiserver-kind-control-plane                 250.0m            __           __      __
     ├─ kube-controller-manager-kind-control-plane        200.0m            __           __      __
     └─ kube-scheduler-kind-control-plane                 100.0m            __           __      __
  ephemeral-storage                                 (0%) 100.0Mi            __       58.4Gi  58.3Gi
  └─ kind-control-plane                             (0%) 100.0Mi            __       58.4Gi  58.3Gi
     └─ etcd-kind-control-plane                          100.0Mi            __           __      __
  memory                                            (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi   7.4Gi
  └─ kind-control-plane                             (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi   7.4Gi
     ├─ coredns-558bd4d5db-8sk5w                          70.0Mi       170.0Mi           __      __
     ├─ coredns-558bd4d5db-l4c4f                          70.0Mi       170.0Mi           __      __
     ├─ etcd-kind-control-plane                          100.0Mi            __           __      __
     └─ kindnet-nrmss                                     50.0Mi        50.0Mi           __      __
  pods                                                (14%) 15.0    (14%) 15.0        110.0    95.0
  └─ kind-control-plane                               (14%) 15.0    (14%) 15.0        110.0    9

Memory割り当て表示

❯ kubectl-view-allocations -r memory
 Resource                            Requested         Limit  Allocatable   Free
  memory                          (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi  7.4Gi
  └─ kind-control-plane           (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi  7.4Gi
     ├─ coredns-558bd4d5db-8sk5w        70.0Mi       170.0Mi           __     __
     ├─ coredns-558bd4d5db-l4c4f        70.0Mi       170.0Mi           __     __
     ├─ etcd-kind-control-plane        100.0Mi            __           __     __
     └─ kindnet-nrmss                   50.0Mi        50.0Mi           __     __

CPU割り当て表示

❯ kubectl-view-allocations -r cpu
 Resource                                              Requested        Limit  Allocatable  Free
  cpu                                               (16%) 950.0m  (2%) 100.0m          6.0   5.0
  └─ kind-control-plane                             (16%) 950.0m  (2%) 100.0m          6.0   5.0
     ├─ coredns-558bd4d5db-8sk5w                          100.0m           __           __    __
     ├─ coredns-558bd4d5db-l4c4f                          100.0m           __           __    __
     ├─ etcd-kind-control-plane                           100.0m           __           __    __
     ├─ kindnet-nrmss                                     100.0m       100.0m           __    __
     ├─ kube-apiserver-kind-control-plane                 250.0m           __           __    __
     ├─ kube-controller-manager-kind-control-plane        200.0m           __           __    __
     └─ kube-scheduler-kind-control-plane                 100.0m           __           __    __

NodeごとにCPU/Memory表示

❯ kubectl-view-allocations -g node -r cpu
 Resource                   Requested        Limit  Allocatable  Free
  cpu                    (16%) 950.0m  (2%) 100.0m          6.0   5.0
  └─ kind-control-plane  (16%) 950.0m  (2%) 100.0m          6.0   5.0

❯ kubectl-view-allocations -g node -r memory
 Resource                   Requested         Limit  Allocatable   Free
  memory                 (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi  7.4Gi
  └─ kind-control-plane  (4%) 290.0Mi  (5%) 390.0Mi        7.8Gi  7.4Gi

似たようなプラグインとして、kube-capacityもあります。
こちらは、CPU/Memory使用量でのSortなどが可能になっています。
https://github.com/robscott/kube-capacity

その他のおすすめkubectlプラグイン

プラグイン 内容
kubectl-images Podが使用しているImageを一覧表示
ksniff tcpdump と Wireshark を利用して、任意のPodのリモートキャプチャを開始する
kubie 複数のシェルで異なるコンテキストを扱える。多くのクラスタの操作が必要な場合に重宝する
kubectl-tree ownerReferencesを通して、オブジェクト間の所有関係を調べる。Custom Operatorの開発に役立つかも
kube-capacity Kubernetesクラスタのリソース要求、制限、および利用の概要を提供する

ここでは全ては書ききれませんが、GitHubにてkubectlトピックを眺めてみると自分に合ったプラグインがきっと見つかります!
https://github.com/topics/kubectl

k9s

k9sとは、kubernetesクラスタとやりとりするためのターミナルUIです。

https://k9scli.io/

インストール

brew install k9s

特に、自分がよく使うコマンドを紹介します。

リソース一覧

コマンド 内容
:ns Namespace一覧を表示
:no Node一覧を表示
:deploy Deployment一覧を表示
:po Pod一覧を表示
:hpa HPA一覧を表示
:poddisruptionbudget PodDisruptionBudget一覧を表示

リソース選択

コマンド 内容
ctrl-f 1ページ下に移動
ctrl-b 1ページ上に移動
g 先頭に移動
G 末尾に移動
ESC 1つ前のリソースに戻る
/ 検索

リソースのソート

コマンド 内容
shift-c CPU使用量でソート
shift-m Memory使用量でソート
shift-s Statusでソート
ctrl-z 異常なStatusでソート

ログ

コマンド 内容
f フルスクリーンで表示
w ログを画面内に収める
s Auto Scroll
c Copy
shift-c Clear

その他

Node関連

コマンド 内容
r drain
u uncordon

Deployment関連

コマンド 内容
ctrl-t rollout restart
s replica数変更
i image変更
c Deployment名をcopy

Pod関連

コマンド 内容
ctrl-d delete
i image変更
c Pod名をcopy

その他

コマンド 内容
:pop popeyeの実行結果を確認

リソース全般の設定の問題点などを検出してScoreを出してくれます。
https://popeyecli.io/


コマンド 内容
:xray [RESOURCE] クラスタリソースの依存関係を確認

Lens

Kubernetesクラスタのリソースのモニタリング・デプロイを行うことのできるデスクトップアプリケーションです。
https://k8slens.dev/

kind

kindは、Dockerコンテナのノードを使ってローカルのKubernetesクラスタを実行することが可能です。
Kubernetesを使った検証を行う場合にとても便利です。
本記事での動作確認もkindを使用しています。
https://kind.sigs.k8s.io/

EKS関連

EKSクラスターのkubeconfigを作成する

aws eks --region <region-code> update-kubeconfig --name <cluster_name>

インスタンスタイプ一覧を参照

kubectl get node -L node.kubernetes.io/instance-type
NAME        STATUS   ROLES    AGE     VERSION   INSTANCE-TYPE
test-node   Ready    <none>   6d10h   v1.21.1   m5.xlarge

Region/Zone一覧を参照

❯ kubectl get node -L topology.kubernetes.io/region
NAME        STATUS   ROLES    AGE     VERSION   REGION
test-node   Ready    <none>   6d10h   v1.21.1   ap-northeast-1

❯ kubectl get node -L topology.kubernetes.io/zone
NAME        STATUS   ROLES    AGE     VERSION   ZONE
test-node   Ready    <none>   6d11h   v1.21.1   ap-northeast-1a

Nodegroup一覧を参照

kubectl get node -L nodegroup-name

NAME       STATUS   ROLES    AGE     VERSION    NODEGROUP-NAME
test-node  Ready    <none>   6d10h   v1.21.1    test-nodegroup-name

kubectl-topologyを使ってTopology一覧を参照
kubectl-topologyは、KubernetesクラスタのTopologyを出力します。
TopologySpreadConstraintsの検証時によく使用します。
https://github.com/bmcustodio/kubectl-topology

インストール

kubectl krew install topology

基本

❯ k topology node
NAME            REGION           ZONE
sample-node-1   ap-northeast-1   ap-northeast-1a
sample-node-2   ap-northeast-1   ap-northeast-1a
sample-node-3   ap-northeast-1   ap-northeast-1c
sample-node-4   ap-northeast-1   ap-northeast-1c
sample-node-5   ap-northeast-1   ap-northeast-1c
sample-node-6   ap-northeast-1   ap-northeast-1c
sample-node-7   ap-northeast-1   ap-northeast-1c
sample-node-8   ap-northeast-1   ap-northeast-1d
sample-node-9   ap-northeast-1   ap-northeast-1d

Zoneでフィルタリング

❯ k topology node --zone ap-northeast-1a
NAME            REGION           ZONE
sample-node-1   ap-northeast-1   ap-northeast-1a
sample-node-2   ap-northeast-1   ap-northeast-1a

Alias設定

自分が設定しているエイリアスを紹介します。
もっとカスタマイズしたい気もしますが、とりあえず参考までに。

alias k='kubectl'
alias kc='kubectx | peco | xargs kubectx'
alias kn='kubens | peco | xargs kubens'

kubectlkにエイリアスを貼っています。
コンテキストの切り替えにはkubectxを使っています。
現在のコンテキストの確認は、starshipを使って設定しています。

[kubernetes]
format = 'on [⛵ $context \($namespace\)]($style) '
style = "bold green"
disabled = false

tmuxを使っている方は、kube-tmuxを使ってtmuxのステータスラインにコンテキストを表示させることも可能です。

まとめ

いかがだったでしょうか?
振り返ってみると結構な数のプラグイン・ツールを使っていることに気づきました。
Kubernetesの運用方法次第で必要になってくるプラグインやツールも大きく変わってくると思うので是非自分に合ったプラグインを見つけて下さい!
そして、おすすめのプラグインあれば是非教えて下さい!

皆さんの快適なKubernetesライフの助けになれば幸いです。

Discussion