kubectl plugin 試してみた

# はじめに
```kubectl``` は Kubernetes を操作するクライアントツールです。
Pod などのオブジェクトの作成、情報参照などを行うことが可能です。
```kubectl``` にはプラグイン機能があり、```kubectl``` をサポートする機能があったので
今回はプラグイン導入して実際にいくつかのプラグインをお試ししてみました。

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

# 環境構成
minikube で動作検証をしました。

OS：Ubuntu 18.04.5 LTS
minikube：v1.17.0
Kubernetes：v1.20.2
kubectl：v1.20.2

# kubectl krew
```kubuectl``` のプラグインマネージャとして ```krew``` を利用します。
プラグインのインストールや削除などの管理を行う事ができます。
※```krew``` 自体も ```kubectl``` のプラグインとして実装されています。

```krew``` については以下を参照ください。
> https://krew.sigs.k8s.io/


早速 ```krew``` をインストールします。

```console
# git がインストールされていることを確認、なければインストールする
$ git version
git version 2.17.1

# 公式サイトにあるスクリプトを利用してインストールする
$ (
  set -x; cd "$(mktemp -d)" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
  tar zxvf krew.tar.gz &&
  KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')" &&
  "$KREW" install krew
)
↑ここまでコマンド
・・・
Installed plugin: krew
\
 | Use this plugin:
 |      kubectl krew
 | Documentation:
 |      https://krew.sigs.k8s.io/
 | Caveats:
 | \
 |  | krew is now installed! To start using kubectl plugins, you need to add
 |  | krew’s installation directory to your PATH:
 |  |
 |  |   * macOS/Linux:
 |  |     - Add the following to your ~/.bashrc or ~/.zshrc:
 |  |         export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
 |  |     - Restart your shell.
 |  |
 |  |   * Windows: Add %USERPROFILE%\.krew\bin to your PATH environment variable
 |  |
 |  | To list krew commands and to get help, run:
 |  |   $ kubectl krew
 |  | For a full list of available plugins, run:
 |  |   $ kubectl krew search
 |  |
 |  | You can find documentation at
 |  |   https://krew.sigs.k8s.io/docs/user-guide/quickstart/.
 | /
/

# コマンドのパスを環境変数に追加する
$ echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> .bashrc
$ source .bashrc

# 動作確認
$ kubectl krew version
OPTION            VALUE
GitTag            v0.4.0
・・・
```

プラグインマネージャの導入ができました。
実際のプラグインのインストールは以下で行います。

```bash
$ kubectl krew install <plugin name>
```

# プラグインのお試し
以降では実際に私が試して便利だったプラグインをご紹介します。

## kubeconfig
### ns

```namespace``` の切り替えを容易にしてくれるプラグインです。
```kubectl``` では ```kubectl config``` コマンドを使ってコンテキストの設定をしなければならないのですが、どうしてもコマンドが長くなってしまいます。
```ns``` を使うと現在のコンテキストの ```namespace``` を簡単に変更できます。
※類似プラグインとしてコンテキスト切り替えを容易にする ```ctx``` もあります

```bash
# サブコマンドが指定されないと namespace の一覧を表示
# （Qiita だと色が付かないですが、カレント namespace は色が付きます）
$ kubectl ns 
default
kube-node-lease
kube-public
kube-system

# 現在の namespace を確認 (-c / --current)
$ kubectl ns -c
default

# 現在のコンフィグを確認
$ kubectl config get-contexts 
CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube   default

# 現在の namespace 変更
$ kubectl ns kube-system
Context "minikube" modified.
Active namespace is "kube-system".

$ kubectl ns -c
kube-system

$ kubectl config get-contexts
CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube   kube-system
```

### fleet
fleet（艦隊）なクラスタ群を表示するプラグインです。
kubeconfig の内容とクラスタの情報出力をサポートします。
※複数クラスタ・コンテキストを管理している場合に便利

```bash
# コンテキスト内のクラスタ一覧を表示
$ kubectl fleet
CLUSTER  VERSION NODES NAMESPACES PROVIDER API
minikube v1.20.2 1/1   4          minikube https://192.168.49.2:8443

# クラスタ内のオブジェクトの一覧化
$ kubectl fleet details minikube
API server endpoint: https://192.168.49.2:8443

# namespace [default]
has no pods
has 1 service(s) overall:
- service [kubernetes] of type ClusterIP uses IP 10.96.0.1 and port(s) https TCP/443
--------------------------------------------------------------------------------

・・・
# namespace [kube-system]
has 7 pod(s) overall:
- pod [coredns-74ff55c5b-ph8rs] is running and uses image(s) k8s.gcr.io/coredns:1.7.0
- pod [etcd-minikube] is running and uses image(s) k8s.gcr.io/etcd:3.4.13-0
- pod [kube-apiserver-minikube] is running and uses image(s) k8s.gcr.io/kube-apiserver:v1.20.2
- pod [kube-controller-manager-minikube] is running and uses image(s) k8s.gcr.io/kube-controller-manager:v1.20.2
- pod [kube-proxy-th774] is running and uses image(s) k8s.gcr.io/kube-proxy:v1.20.2
- pod [kube-scheduler-minikube] is running and uses image(s) k8s.gcr.io/kube-scheduler:v1.20.2
- pod [storage-provisioner] is running and uses image(s) gcr.io/k8s-minikube/storage-provisioner:v4
has 1 service(s) overall:
- service [kube-dns] of type ClusterIP uses IP 10.96.0.10 and port(s) dns UDP/53 dns-tcp TCP/53 metrics TCP/9153
--------------------------------------------------------------------------------
```

### view-serviceaccount-kubeconfig
指定された ServiceAccount で ```kubectl``` を利用する際の kubeconfig を出力します。

```
# ServiceAccount：default のkubeconfig を出力
$ kubectl view-serviceaccount-kubeconfig default
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: ・・・
    server: https://192.168.49.2:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    namespace: kube-system
    user: default
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: default
  user:
    token: ・・・
```

## Pod
### images
```docker images``` の用に使っているイメージを一覧化して表示したい時に便利なプラグインです。
Pod / Container 名で絞り込むことも可能です。

```
# イメージを一覧化
$ kubectl images
[Summary]: 1 namespaces, 7 pods, 7 containers and 7 different images
+----------------------------------+-------------------------+--------------------------------------------+
|             PodName              |      ContainerName      |               ContainerImage               |
+----------------------------------+-------------------------+--------------------------------------------+
| coredns-74ff55c5b-ph8rs          | coredns                 | k8s.gcr.io/coredns:1.7.0                   |
+----------------------------------+-------------------------+--------------------------------------------+
| etcd-minikube                    | etcd                    | k8s.gcr.io/etcd:3.4.13-0                   |
+----------------------------------+-------------------------+--------------------------------------------+
| kube-apiserver-minikube          | kube-apiserver          | k8s.gcr.io/kube-apiserver:v1.20.2          |
+----------------------------------+-------------------------+--------------------------------------------+
| kube-controller-manager-minikube | kube-controller-manager | k8s.gcr.io/kube-controller-manager:v1.20.2 |
+----------------------------------+-------------------------+--------------------------------------------+
| kube-proxy-th774                 | kube-proxy              | k8s.gcr.io/kube-proxy:v1.20.2              |
+----------------------------------+-------------------------+--------------------------------------------+
| kube-scheduler-minikube          | kube-scheduler          | k8s.gcr.io/kube-scheduler:v1.20.2          |
+----------------------------------+-------------------------+--------------------------------------------+
| storage-provisioner              | storage-provisioner     | gcr.io/k8s-minikube/storage-provisioner:v4 |
+----------------------------------+-------------------------+--------------------------------------------+

# 特定の Pod で絞り込み（-c オプションでコンテナの指定も可）
$ kubectl images -n kube-system coredns
[Summary]: 1 namespaces, 1 pods, 1 containers and 1 different images
+-------------------------+---------------+--------------------------+
|         PodName         | ContainerName |      ContainerImage      |
+-------------------------+---------------+--------------------------+
| coredns-74ff55c5b-ph8rs | coredns       | k8s.gcr.io/coredns:1.7.0 |
+-------------------------+---------------+--------------------------+
```

### pod-dive
Pod の階層的な情報（どこのノード、どこの ```namespace```、どのオブジェクトタイプ）を出力します。
アラートから得られる情報が Pod 名の場合が多いことから作成されたプラグインのようです。
※↑ヘルプより。

```
# coredns の Pod 名を確認
$ kubectl get po -l k8s-app=kube-dns -n kube-system
NAME                      READY   STATUS    RESTARTS   AGE
coredns-74ff55c5b-ph8rs   1/1     Running   0          159m

# coredns の Pod 情報を出力
$ kubectl pod-dive coredns-74ff55c5b-ph8rs -n kube-system
[node]      minikube [ready]
[namespace]  ├─┬ kube-system
[type]       │ └─┬ replicaset [deployment]
[workload]   │   └─┬ coredns-74ff55c5b [1 replica]
[pod]        │     └─┬ coredns-74ff55c5b-ph8rs [running]
[containers] │       └── coredns [0 restarts]
            ...
```

### podevents
Pod のイベント情報を整形して出力します。
タイムスタンプで表示されることや時系列で整形されて表示されるので見やすいです。

```
# Pod のイベント情報を表示
$ kubectl podevents storage-provisioner
Events for 'storage-provisioner':
LAST SEEN                       TYPE    REASON          MESSAGE
2021-01-26 15:31:42 +0000 UTC   Normal  SandboxChanged  Pod sandbox changed, it will be killed and re-created.
2021-01-26 15:32:29 +0000 UTC   Normal  Pulled          Container image "gcr.io/k8s-minikube/storage-provisioner:v4" already present on machine
2021-01-26 15:32:29 +0000 UTC   Normal  Created         Created container storage-provisioner
2021-01-26 15:32:29 +0000 UTC   Normal  Started         Started container storage-provisioner
2021-01-26 15:32:14 +0000 UTC   Warning BackOff         Back-off restarting failed container
```

### sick-pods
障害が起きている Pod の状態やイベント情報をまとめて出力します。

```
# 障害が起きている Pod の情報を出力
# 今回は request memory のリソースを過剰に設定してからプラグインで出力させてみました
$ kubectl sick-pods nginx-54f8d64599-rz75g
'nginx-54f8d64599-rz75g' is not ready! Reason Provided: None
        Failed Pod Conditions:
                CONDITION       REASON          MESSAGE
                PodScheduled    Unschedulable   0/1 nodes are available: 1 Insufficient memory.

        Pod Events:
                LAST SEEN                       TYPE    REASON                  MESSAGE
                0001-01-01 00:00:00 +0000 UTC   Warning FailedScheduling        0/1 nodes are available: 1 Insufficient memory.
                0001-01-01 00:00:00 +0000 UTC   Warning FailedScheduling        0/1 nodes are available: 1 Insufficient memory.
```

## secret
### view-secret
Base64 でエンコードされた Secret の情報をデコードして出力します。
一々デコード処理のコマンドに渡す手間を省くことが出来て便利です。

```
# Secret のキー一覧を出力
$ kubectl view-secret default-token-tmdjk
Multiple sub keys found. Specify another argument, one of:
-> token
-> ca.crt
-> namespace

# Secret の情報をデコードして出力
$ kubectl view-secret default-token-tmdjk ca.crt
-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwptaW5p
・・・
1Kwm6cWEGMZh3w==
-----END CERTIFICATE-----

# Secret の全ての情報をデコードして出力
$ kubectl view-secret default-token-tmdjk -a
token=・・・

ca.crt=-----BEGIN CERTIFICATE-----
・・・
-----END CERTIFICATE-----

namespace=default
```

### modify-secret
Secret の情報を、```kubectl edit``` の用に編集することが出来ます。
Base64 のエンコードをすることなく Secret を編集することが出来て便利です。
※マニフェストファイルで管理している場合は逆効果・・・？

```
# Secret の編集
$ kubectl modify-secret XXXX
※エディタが開き編集可能になる
※表示は Base64 デコードされ、保存する際に再エンコードされる
```

### view-cert
Secret に格納している証明書情報を出力します。
Subject / Issuer / 期限情報を確認することが出来ます。

```
# Secret の格納している証明書情報を出力
# Secret 名 / key を指定
$ kubectl view-cert default-token-tmdjk ca.crt
[
    {
        "SecretName": "default-token-tmdjk",
        "Namespace": "default",
        "Version": 3,
        "SerialNumber": "1",
        "Issuer": "CN=minikubeCA",
        "Validity": {
            "NotBefore": "2021-01-24T15:12:52Z",
            "NotAfter": "2031-01-23T15:12:52Z"
        },
        "Subject": "CN=minikubeCA",
        "IsCA": true
    }
]
```

## resource
### resource-capacity
クラスタ内のResource Request/Limit を整形して出力してくれるプラグインです。
ソート機能や metrics-server が導入されている kubernetes であれば利用量も出力してくれるのが便利です。

```
# クラスタ内の Request / Limit の合計値を出力
$ kubectl resource-capacity
NODE       CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
minikube   750m (37%)     0m (0%)      170Mi (4%)        170Mi (4%)

# Request / Limit に加え、利用量を出力（前提：metrics-server）
$ kubectl resource-capacity -u
NODE       CPU REQUESTS   CPU LIMITS   CPU UTIL   MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
minikube   750m (37%)     0m (0%)      67m (3%)   170Mi (4%)        170Mi (4%)      579Mi (14%)

# Pod 毎で CPU の Request の降順に出力
$ kubectl resource-capacity --pods --sort cpu.request
NODE       NAMESPACE     POD                                CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS

minikube   *             *                                  750m (37%)     0m (0%)      170Mi (4%)        170Mi (4%)
minikube   kube-system   kube-apiserver-minikube            250m (12%)     0m (0%)      0Mi (0%)          0Mi (0%)
minikube   kube-system   kube-controller-manager-minikube   200m (10%)     0m (0%)      0Mi (0%)          0Mi (0%)
minikube   kube-system   etcd-minikube                      100m (5%)      0m (0%)      100Mi (2%)        0Mi (0%)
minikube   kube-system   kube-scheduler-minikube            100m (5%)      0m (0%)      0Mi (0%)          0Mi (0%)
・・・
```

### view-utilization
こちらもリソース情報を整形して出力してくれるプラグインです。
前述紹介したものよりシンプルなものになっています。

```
# クラスタ内のリソース情報を出力
$ kubectl view-utilization
Resource   Requests  %Requests     Limits  %Limits  Allocatable  Schedulable        Free
CPU             750         37          0        0         2002         1252        1252
Memory    178257920          4  178257920        4   4136144896   3957886976  3957886976

# namespace 毎の Request/Limit を出力
$ kubectl view-utilization namespace
Namespace    CPU Requests  CPU Limits  Memory Requests  Memory Limits
default                 0           0                0              0
kube-system           750           0        178257920      178257920

# Node 毎の Request/Limit を出力
$ kubectl view-utilization node
CPU   : ▁
Memory: ▁
           CPU                                   Memory
Node       Requests  %Requests  Limits  %Limits   Requests  %Requests     Limits  %Limits
minikube        750         37       0        0  178257920          4  178257920        4
```

### reap
クラスタ内で不要となったオブジェクト（Pod / ConfigMap など）を削除するプラグインです。
Dry-run で不要となっているオブジェクトを削除せずに一覧出力することも出来ます。

```
# 削除する内容はヘルプ参照
$ kubectl reap --help

Delete unused resources. Supported resources:

- Pods (whose status is not Running)
- ConfigMaps (not used in any Pods)
- Secrets (not used in any Pods or ServiceAccounts)
- PersistentVolumes (not satisfying any PersistentVolumeClaims)
- PersistentVolumeClaims (not used in any Pods)
- Jobs (completed)
- PodDisruptionBudgets (not targeting any Pods)
- HorizontalPodAutoscalers (not targeting any resources)

# 削除対象を一覧出力
$ kubectl reap cm --dry-run=client
configmap/test deleted (dry run)

# 不要なオブジェクトを削除
$ kubectl reap cm -n default
configmap/test deleted
```

## RBAC
### rbac-lookup
特定の Subject（ユーザやグループ、ServiceAccount）に割り振られている Role を一覧出力すること出来ます。

```
# default が含まれる Subject（ユーザやグループ、ServiceAccount）の Role 一覧を出力
$ kubectl rbac-lookup default
SUBJECT                                            SCOPE          ROLE
default                                            cluster-wide   ClusterRole/cluster-admin
system:bootstrappers:kubeadm:default-node-token    cluster-wide   ClusterRole/kubeadm:get-nodes
system:bootstrappers:kubeadm:default-node-token    cluster-wide   ClusterRole/system:node-bootstrapper
system:bootstrappers:kubeadm:default-node-token    cluster-wide   ClusterRole/system:certificates.k8s.io:certificatesigningrequests:nodeclient
system:bootstrappers:kubeadm:default-node-token    kube-system    Role/kube-proxy
system:bootstrappers:kubeadm:default-node-token    kube-system    Role/kubeadm:kubelet-config-1.20
system:bootstrappers:kubeadm:default-node-token    kube-system    Role/kubeadm:nodes-kubeadm-config

# coredns が含まれる Subject の Role 一覧を出力
$ kubectl rbac-lookup coredns
SUBJECT    SCOPE          ROLE
coredns    cluster-wide   ClusterRole/system:coredns
```

### rolesum
対象の Subject に割り振られている RBAC を整形して出力します。
リソース毎の可否をテーブルで表示し、Role や RoleBinding も合わせて出力されます。

```
# coredns の RBAC を出力
$ kubectl rolesum coredns
ServiceAccount: kube-system/coredns
Secrets:
• */coredns-token-z54xv

Policies:

• [CRB] */system:coredns ⟶  [CR] */system:coredns
  Resource    Name  Exclude  Verbs  G L W C U P D DC
  endpoints   [*]     [-]     [-]   ✖ ✔ ✔ ✖ ✖ ✖ ✖ ✖
  namespaces  [*]     [-]     [-]   ✖ ✔ ✔ ✖ ✖ ✖ ✖ ✖
  nodes       [*]     [-]     [-]   ✔ ✖ ✖ ✖ ✖ ✖ ✖ ✖
  pods        [*]     [-]     [-]   ✖ ✔ ✔ ✖ ✖ ✖ ✖ ✖
  services    [*]     [-]     [-]   ✖ ✔ ✔ ✖ ✖ ✖ ✖ ✖
```

## Security
### popeye
クラスタ内をスキャンし潜在的な問題を出力するプラグインです。
単体のソフトウェアとしても利用可能で、コンテナとして呼び出すことも出来ます。
セキュリティ製品というよりかは、クラスタ内の問題になりそうな箇所のチェックしたい場合に有効かと思います。

指標については公式サイトを参照ください。
> https://github.com/derailed/popeye

```
$ kubectl popeye

 ___     ___ _____   _____                                                      K          .-'-.
| _ \___| _ \ __\ \ / / __|                                                      8     __|      `\
|  _/ _ \  _/ _| \ V /| _|                                                        s   `-,-`--._   `\
|_| \___/_| |___| |_| |___|                                                      []  .->'  a     `|-'
  Biffs`em and Buffs`em!                                                          `=/ (__/_       /
                                                                                    \_,    `    _)
                                                                                       `----;  |


GENERAL [MINIKUBE]
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
  · Connectivity...................................................................................✅
  · MetricServer...................................................................................✅


CLUSTERS (1 SCANNED)                                                         💥 0 😱 0 🔊 0 ✅ 1 100٪
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
  · Version........................................................................................✅
    ✅ [POP-406] K8s version OK.

・・・

DEPLOYMENTS (3 SCANNED)                                                       💥 1 😱 1 🔊 1 ✅ 0 33٪
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
  · kube-system/coredns............................................................................🔊
    🔊 [POP-404] Deprecation check failed. Unable to assert resource version.
  · kube-system/metrics-server.....................................................................😱
    🐳 metrics-server
      😱 [POP-106] No resources requests/limits defined.
  · kube-system/nginx..............................................................................💥
    🔊 [POP-404] Deprecation check failed. Unable to assert resource version.
    🐳 nginx
      💥 [POP-100] Untagged docker image in use.
      😱 [POP-106] No resources requests/limits defined.

・・・

PODS (9 SCANNED)                                                               💥 1 😱 8 🔊 0 ✅ 0 0٪
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅

・・・

  · kube-system/nginx-6799fc88d8-ws5td.............................................................💥
    🔊 [POP-206] No PodDisruptionBudget defined.
    😱 [POP-300] Using "default" ServiceAccount.
    😱 [POP-301] Connects to API Server? ServiceAccount token is mounted.
    😱 [POP-302] Pod could be running as root user. Check SecurityContext/image.
    🐳 nginx
      😱 [POP-205] Pod was restarted (10) times.
      💥 [POP-100] Untagged docker image in use.
      😱 [POP-106] No resources requests/limits defined.
      😱 [POP-102] No probes defined.
      😱 [POP-306] Container could be running as root user. Check SecurityContext/Image.

・・・

ROLES (10 SCANNED)                                                          💥 0 😱 0 🔊 0 ✅ 10 100٪
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
  · kube-system/extension-apiserver-authentication-reader..........................................✅
  · kube-system/kube-proxy.........................................................................✅
  · kube-system/kubeadm:kubelet-config-1.20........................................................✅
  · kube-system/kubeadm:nodes-kubeadm-config.......................................................✅
  · kube-system/system::leader-locking-kube-controller-manager.....................................✅
  · kube-system/system::leader-locking-kube-scheduler..............................................✅
  · kube-system/system:controller:bootstrap-signer.................................................✅
  · kube-system/system:controller:cloud-provider...................................................✅
  · kube-system/system:controller:token-cleaner....................................................✅
  · kube-system/system:persistent-volume-provisioner...............................................✅

・・・

SUMMARY
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
Your cluster score: 87 -- B
                                                                                o          .-'-.
                                                                                 o     __| B    `\
                                                                                  o   `-,-`--._   `\
                                                                                 []  .->'  a     `|-'
                                                                                  `=/ (__/_       /
                                                                                    \_,    `    _)
                                                                                       `----;  |
```

### score
こちらも潜在的な問題を出力するプラグインです。
対象は yaml ファイルなので作成した yaml ファイルや ```get -o yaml``` を「|」（パイプ）で渡して利用することができます。

こちらも指標は公式サイトを参照ください。
> https://github.com/zegl/kube-score


```
$ kubectl get deploy nginx -o yaml | kubectl score -
apps/v1/Deployment nginx in kube-system                                       💥
    [CRITICAL] Container Security Context
        · nginx -> The pod has a container with a writable root filesystem
            Set securityContext.readOnlyRootFilesystem to true
        · nginx -> The container is running with a low user ID
            A userid above 10 000 is recommended to avoid conflicts with the
            host. Set securityContext.runAsUser to a value > 10000
        · nginx -> The container running with a low group ID
            A groupid above 10 000 is recommended to avoid conflicts with the
            host. Set securityContext.runAsGroup to a value > 10000
    [CRITICAL] Container Resources
        · nginx -> CPU limit is not set
            Resource limits are recommended to avoid resource DDOS. Set
            resources.limits.cpu
        · nginx -> Memory limit is not set
            Resource limits are recommended to avoid resource DDOS. Set
            resources.limits.memory
        · nginx -> CPU request is not set
            Resource requests are recommended to make sure that the application
            can start and run without crashing. Set resources.requests.cpu
        · nginx -> Memory request is not set
            Resource requests are recommended to make sure that the application
            can start and run without crashing. Set resources.requests.memory
    [CRITICAL] Container Image Tag
        · nginx -> Image with latest tag
            Using a fixed tag is recommended to avoid accidental upgrades
    [CRITICAL] Pod NetworkPolicy
        · The pod does not have a matching NetworkPolicy
            Create a NetworkPolicy that targets this pod to control who/what
            can communicate with this pod. Note, this feature needs to be
            supported by the CNI implementation used in the Kubernetes cluster
            to have an effect.
```

# おわりに
今回は ```kubectl``` のプラグインを試してみました。
主に表示系が多かったのですが、手軽に導入できて作業効率がアップできるのは良いと思いました。

プラグインの一覧は以下にまとめられています。
> https://krew.sigs.k8s.io/plugins/

また、プラグインの開発ガイドもあるのでご参考までに。
> https://krew.sigs.k8s.io/docs/developer-guide/