はじめに
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
コマンドでは表示されない情報を抜き出すことができます。今回はこれらの方法を確認したいと思います。
ソート
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を書くのが難しいですが、この辺もまとめられればと思います。