こんなのあったのか!kubectl プラグインを漁る
3-shake Advent Calendar 2022の13日目です。
はじめに
kubectlには、Kubernetesの日々の運用を楽にしてくれるプラグインが多くあります。
例えば、kubectxやkubensといった定番プラグインを使用している人は多いのではないでしょうか。
最近、自分のkubernetes周りの環境を整備する機会があり、kubectlプラグインを漁っていました。
その中で初めて見るプラグイン、聞いたことあるけどよく知らないプラグインについてこの機会に少し調べたのでご紹介します。
「こんなのあるんだなぁ」程度でお楽しみ下さい。
※ここで紹介するプラグインたちはコミュニティ等のチェックは行われていないため、利用は自己責任でお願いします。
準備
Krew
Krewを使用することでプラグインを簡単にインストールできます。
Krewでインストール可能なプラグインはkrew-indexというGitHubリポジトリで管理されています。
インストール方法は以下を参考にしてください。
プラグインのインストール
$ kubectl krew install <plugin name>
プラグイン
ketall
Kubernetesクラスタの全リソースを出力するには、kubectl get all --all-namespaces
だけでは不十分です。このプラグインは、クラスタが提供するすべてのリソースをリストアップします。
インストール
$ kubectl krew install get-all
全リソース取得
$ kubectl get-all
kube-lineage
kube-lineageはKubernetesクラスタ内のオブジェクトのすべての依存関係または依存先を表示するCLIツールです。
インストール
$ 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 top
とkubectl describe
の出力の良いところを組み合わせて、クラスタリソースに焦点を当てた使いやすいCLIにしようと試みているみたいです。
インストール
$ 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の各行に対して、誰が最後にそのフィールドを変更したかを出力します。
インストール
$ 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プラグインです。
現在は、メンテナンスされていなさそうです。
インストール
$ kubectl krew install outdated
出力
$ kubectl outdated
古いnginxイメージを使用している場合
kube-iexec
実行中のPodにexecするためのインタラクティブなセレクタを提供するプラグインです。
検索フィルタに対して、マッチするPodやコンテナのリストを返し、その中のPodやコンテナに対してkubectl execを実行するプラグインです。
Pod名やコンテナ名を把握することなくexecすることができます。
インストール
$ kubectl krew install iexec
default内のpodにexecする
Namespaceを指定することでNamespace内のpodがリストで表示され、execするpodを選択する。
kubectl-view-secret
kubectl-view-secretを使用すれば、簡単にシークレットを解読することができます。
以下のような手順を踏まずにシークレットの中身を見たい場合に便利です。
kubectl get secret <secret> -o yaml
- Copy base64 encoded secret
echo "b64string" | base64 -d
インストール
$ kubectl krew install view-secret
secretの中身を出力する
# print secret keys
kubectl view-secret <secret>
まとめ
いくつかプラグインをご紹介しました。
この他にも、まだまだプラグインはたくさん開発されていますので、色々探してみてはいかがでしょうか。
また、プラグインのインストールで使用した、Krewでは自作プラグインを公開することが可能になっています。
日々の運用で非効率的だなと思うことがあれば、自分で開発するのも良いかもしれません。
developer-guide
Discussion