[Kubernetes]Kubectlのリソース表示（応用編）

#はじめに
Kubenetesのリソース表示には`kubectl get`コマンドを多く利用すると思います。

`kubectl get`コマンドを実行すると、APIサーバからJSON形式で結果が返ってきて、それを人が見やすい形式にして画面に表示します。その際、全ての情報ではなく一部の情報のみが表示されます。
-o wideオプションや-Lオプションを付けると表示される情報は増えますが、JSONで表示される情報はもっとあります。

例えば`kubectl get pod`コマンドで表示される情報はこれだけですが、

```
$ kubectl get pod nginx1
NAME     READY   STATUS    RESTARTS   AGE
nginx1   1/1     Running   2          5d1h
```
JSON形式で表示するとこんな感じです。

```
$ kubectl get pod nginx1 -o json
{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "annotations": {
            "cni.projectcalico.org/podIP": "192.168.69.195/32",
            "cni.projectcalico.org/podIPs": "192.168.69.195/32"
        },
        "creationTimestamp": "2020-07-26T12:16:29Z",
        "labels": {
            "run": "nginx1"
        },
        "managedFields": [
            {
                "apiVersion": "v1",
                "fieldsType": "FieldsV1",
                "fieldsV1": {
                    "f:metadata": {
                        "f:labels": {
                            ".": {},
                            "f:run": {}
・・・省略・・・
```

kubectlコマンドではJSON Pathを指定することにより、`kubectl get`コマンドでは表示されない情報を抜き出すことができます。今回はこれらの方法を確認したいと思います。

[JSONPath Support](https://kubernetes.io/docs/reference/kubectl/jsonpath/)

##ソート
`kubectl get`コマンドの出力を指定したJSON Pathの項目でソートすることができます。

これはソートオプションなしです。

```
$ kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dep-7d7d744c9-gk78k   1/1     Running   2          4d23h
nginx-dep-7d7d744c9-mzb9g   1/1     Running   2          4d23h
nginx1                      1/1     Running   2          5d
nginx2                      1/1     Running   2          5d
sample-web1                 1/1     Running   1          46h
```

これをPod名（.metadata.name）でソートするとこうなります。

```
$ kubectl get pod --sort-by=.metadata.name
NAME                        READY   STATUS    RESTARTS   AGE
nginx1                      1/1     Running   2          5d
nginx2                      1/1     Running   2          5d
nginx-dep-7d7d744c9-gk78k   1/1     Running   2          4d23h
nginx-dep-7d7d744c9-mzb9g   1/1     Running   2          4d23h
sample-web1                 1/1     Running   1          46h
```

##カスタムカラム
指定した項目を自分で指定したカラムで出力することができます。
この例は、各ノードのCPU数、メモリ容量を表示しています。各項目は「カラム名:JSON Path」で指定します。カラム名は任意で設定できます。
また、--sort-byオプションと組み合わせて使うこともできます。

```
$ kubectl get node -o custom-columns=NAME:.metadata.name,CPU:.status.capacity.cpu,MEM:.status.capacity.memory 
NAME           CPU   MEM
k8s-master     2     2914176Ki
k8s-worker01   2     2914176Ki
k8s-worker02   2     2914176Ki
```

##JSON Path

全てのPod名を表示します。

```
$ kubectl get pods -o jsonpath='{.items[*].metadata.name}'
nginx-dep-7d7d744c9-gk78k nginx-dep-7d7d744c9-mzb9g nginx1 nginx2 sample-web1
```
これもソートできます。

```
$ kubectl get pods -o jsonpath='{.items[*].metadata.name}' --sort-by=.metadata.name
nginx1 nginx2 nginx-dep-7d7d744c9-gk78k nginx-dep-7d7d744c9-mzb9g sample-web1
```

.item[*]の数字を指定することで、その順番のPod名のみを表示します。

```
$ kubectl get pods -o jsonpath='{.items[3].metadata.name}'
nginx2
```

全てのノード名とCPU数を一行で表示します。

```
$ kubectl get node -o jsonpath='{.items[*].metadata.name}{.items[*].status.capacity.cpu}'
k8s-master k8s-worker01 k8s-worker022 2 2
```

全てのノード名とCPU数の間に改行を入れて表示します。"\n"が改行を表します。

```
$ kubectl get node -o jsonpath='{.items[*].metadata.name}{"\n"}{.items[*].status.capacity.cpu}'
k8s-master k8s-worker01 k8s-worker02
2 2 2
```

全てのノード名をタブ区切りで表示します。"\t"がタブを表します。

```
$ kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{end}'
k8s-master      k8s-worker01    k8s-worker02
```

各ノード名とCPU数をタブ区切りで表示し、改行を入れてすべてのノード名を表示します。

```
$ kubectl get node -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.capacity.cpu}{"\
n"}{end}'
k8s-master      2
k8s-worker01    2
k8s-worker02    2
```

#まとめ
JSON Pathを活用すると、必要な情報だけをピンポイントで抜き出したり、スクリプトで活用できたりしますね。
各リソースに対応するJSON Pathを書くのが難しいですが、この辺もまとめられればと思います。