👀

こんなのあったのか!kubectl プラグインを漁る

2022/12/13に公開

3-shake Advent Calendar 2022の13日目です。
https://qiita.com/advent-calendar/2022/3-shake

はじめに

kubectlには、Kubernetesの日々の運用を楽にしてくれるプラグインが多くあります。
例えば、kubectxkubensといった定番プラグインを使用している人は多いのではないでしょうか。
最近、自分のkubernetes周りの環境を整備する機会があり、kubectlプラグインを漁っていました。
その中で初めて見るプラグイン、聞いたことあるけどよく知らないプラグインについてこの機会に少し調べたのでご紹介します。
「こんなのあるんだなぁ」程度でお楽しみ下さい。

※ここで紹介するプラグインたちはコミュニティ等のチェックは行われていないため、利用は自己責任でお願いします。

準備

Krew

Krewを使用することでプラグインを簡単にインストールできます。
Krewでインストール可能なプラグインはkrew-indexというGitHubリポジトリで管理されています。
インストール方法は以下を参考にしてください。
https://krew.sigs.k8s.io/docs/user-guide/setup/install/

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

$ kubectl krew install <plugin name>

プラグイン

ketall

Kubernetesクラスタの全リソースを出力するには、kubectl get all --all-namespacesだけでは不十分です。このプラグインは、クラスタが提供するすべてのリソースをリストアップします。
https://github.com/corneliusweig/ketall
インストール

$ kubectl krew install get-all

全リソース取得

$ kubectl get-all

kube-lineage

kube-lineageはKubernetesクラスタ内のオブジェクトのすべての依存関係または依存先を表示するCLIツールです。
https://github.com/tohjustin/kube-lineage

インストール

$ kubectl krew install lineage

サンプル

$ kubectl lineage pod coredns-5cc79d4bf5-xgvkc --dependencies
NAMESPACE     NAME                                                                   READY   STATUS         AGE
kube-system   Pod/coredns-5cc79d4bf5-xgvkc                                           1/1     Running        30m
              ├── Node/k3d-server                                                    True    KubeletReady   30m
              ├── PodSecurityPolicy/system-unrestricted-psp                          -                      30m
kube-system   ├── ConfigMap/coredns                                                  -                      30m
kube-system   ├── ReplicaSet/coredns-5cc79d4bf5                                      1/1                    30m
kube-system   │   └── Deployment/coredns                                             1/1                    30m
kube-system   ├── Secret/coredns-token-6vsx4                                         -                      30m
kube-system   │   └── ServiceAccount/coredns                                         -                      30m
              │       ├── ClusterRoleBinding/system:basic-user                       -                      30m
              │       │   └── ClusterRole/system:basic-user                          -                      30m
              │       ├── ClusterRoleBinding/system:coredns                          -                      30m
              │       │   └── ClusterRole/system:coredns                             -                      30m
              │       ├── ClusterRoleBinding/system:discovery                        -                      30m
              │       │   └── ClusterRole/system:discovery                           -                      30m
              │       ├── ClusterRoleBinding/system:public-info-viewer               -                      30m
              │       │   └── ClusterRole/system:public-info-viewer                  -                      30m
kube-system   │       └── RoleBinding/system-unrestricted-svc-acct-psp-rolebinding   -                      30m
              │           └── ClusterRole/system-unrestricted-psp-role               -                      30m
              │               └── PodSecurityPolicy/system-unrestricted-psp          -                      30m
kube-system   └── ServiceAccount/coredns                                             -                      30m

kube-capacity

Kubernetesクラスタにおけるリソースのrequests、limits、utilizationを提供するプラグインです。kubectl topkubectl describeの出力の良いところを組み合わせて、クラスタリソースに焦点を当てた使いやすいCLIにしようと試みているみたいです。
https://github.com/robscott/kube-capacity
インストール

$ kubectl krew install resource-capacity

podのrequests/limitsを一覧表示

$ kubectl resource-capacity --pods                                                                                                       
NODE                 NAMESPACE            POD                                          CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS

kind-control-plane   *                    *                                            950m (23%)     100m (2%)    290Mi (3%)        390Mi (4%)
kind-control-plane   kube-system          coredns-565d847f94-s6dvm                     100m (2%)      0Mi (0%)     70Mi (0%)         170Mi (2%)
kind-control-plane   kube-system          coredns-565d847f94-t9r49                     100m (2%)      0Mi (0%)     70Mi (0%)         170Mi (2%)
kind-control-plane   kube-system          etcd-kind-control-plane                      100m (2%)      0Mi (0%)     100Mi (1%)        0Mi (0%)
kind-control-plane   kube-system          kindnet-xp5pp                                100m (2%)      100m (2%)    50Mi (0%)         50Mi (0%)
kind-control-plane   kube-system          kube-apiserver-kind-control-plane            250m (6%)      0Mi (0%)     0Mi (0%)          0Mi (0%)
kind-control-plane   kube-system          kube-controller-manager-kind-control-plane   200m (5%)      0Mi (0%)     0Mi (0%)          0Mi (0%)
kind-control-plane   kube-system          kube-proxy-9wvcd                             0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
kind-control-plane   kube-system          kube-scheduler-kind-control-plane            100m (2%)      0Mi (0%)     0Mi (0%)          0Mi (0%)

kubectl-blame

与えられたリソースのYAMLの各行に対して、誰が最後にそのフィールドを変更したかを出力します。

https://github.com/knight42/kubectl-blame
インストール

$ kubectl krew install blame

Podの変更を表示する

# Blame pod 'foo' in default namespace
$ kubectl blame pods foo
サンプル
$ kubectl blame pods coredns-565d847f94-s6dvm -n kube-system
                                               apiVersion: v1
                                               kind: Pod
                                               metadata:
                                                 creationTimestamp: "2022-12-11T06:34:34Z"
kube-controller-manager (Update 5 minutes ago)   generateName: coredns-565d847f94-
kube-controller-manager (Update 5 minutes ago)   labels:
kube-controller-manager (Update 5 minutes ago)     k8s-app: kube-dns
kube-controller-manager (Update 5 minutes ago)     pod-template-hash: 565d847f94
                                                 name: coredns-565d847f94-s6dvm
                                                 namespace: kube-system
kube-controller-manager (Update 5 minutes ago)   ownerReferences:
kube-controller-manager (Update 5 minutes ago)   - apiVersion: apps/v1
kube-controller-manager (Update 5 minutes ago)     blockOwnerDeletion: true
kube-controller-manager (Update 5 minutes ago)     controller: true
kube-controller-manager (Update 5 minutes ago)     kind: ReplicaSet
kube-controller-manager (Update 5 minutes ago)     name: coredns-565d847f94
kube-controller-manager (Update 5 minutes ago)     uid: c1ac029e-f629-47a9-9e86-e82d61f9aeb9
                                                 resourceVersion: "458"
                                                 uid: b3be5c2e-c2b8-4051-834c-c0bc5d77aad0
                                               spec:
kube-controller-manager (Update 5 minutes ago)   affinity:
kube-controller-manager (Update 5 minutes ago)     podAntiAffinity:
kube-controller-manager (Update 5 minutes ago)       preferredDuringSchedulingIgnoredDuringExecution:
kube-controller-manager (Update 5 minutes ago)       - podAffinityTerm:
kube-controller-manager (Update 5 minutes ago)           labelSelector:
kube-controller-manager (Update 5 minutes ago)             matchExpressions:
kube-controller-manager (Update 5 minutes ago)             - key: k8s-app
kube-controller-manager (Update 5 minutes ago)               operator: In
kube-controller-manager (Update 5 minutes ago)               values:
kube-controller-manager (Update 5 minutes ago)               - kube-dns
kube-controller-manager (Update 5 minutes ago)           topologyKey: kubernetes.io/hostname
kube-controller-manager (Update 5 minutes ago)         weight: 100

~以下省略~

outdated

Kubernetesクラスタで動作しているすべての古いイメージを表示するkubectlプラグインです。
現在は、メンテナンスされていなさそうです。
https://github.com/replicatedhq/outdated
インストール

$ kubectl krew install outdated

出力

$ kubectl outdated

古いnginxイメージを使用している場合

kube-iexec

実行中のPodにexecするためのインタラクティブなセレクタを提供するプラグインです。
検索フィルタに対して、マッチするPodやコンテナのリストを返し、その中のPodやコンテナに対してkubectl execを実行するプラグインです。
Pod名やコンテナ名を把握することなくexecすることができます。
https://github.com/gabeduke/kubectl-iexec

インストール

$ kubectl krew install iexec

default内のpodにexecする
Namespaceを指定することでNamespace内のpodがリストで表示され、execするpodを選択する。

kubectl-view-secret

kubectl-view-secretを使用すれば、簡単にシークレットを解読することができます。
以下のような手順を踏まずにシークレットの中身を見たい場合に便利です。

  1. kubectl get secret <secret> -o yaml
  2. Copy base64 encoded secret
  3. echo "b64string" | base64 -d

https://github.com/elsesiy/kubectl-view-secret

インストール

$ kubectl krew install view-secret

secretの中身を出力する

# print secret keys
kubectl view-secret <secret>

まとめ

いくつかプラグインをご紹介しました。
この他にも、まだまだプラグインはたくさん開発されていますので、色々探してみてはいかがでしょうか。
また、プラグインのインストールで使用した、Krewでは自作プラグインを公開することが可能になっています。
日々の運用で非効率的だなと思うことがあれば、自分で開発するのも良いかもしれません。
developer-guide

Discussion