zaki work log

作業ログやら生活ログやらなんやら

ラベルとjsonpathを使ったkubectl/ocの出力のフィルタリング

grepawkが便利なのでそれ使うのもいいけど…

確認した環境はOpenShift 3.11(OKD)上で、kubectl使用。ocでも動きは同じ。

custom-columnsを使った例はこちら

zaki-hmkc.hatenablog.com

ラベル

ラベルはKubernetesリソースに付与された分類情報。
指定することで出力時にフィルタできる。

詳しくはラベル(Labels)とセレクター(Selectors) - Kubernetes

ラベル一覧を表示する

--show-labelsを付与する。

[zaki@okd-master ~]$ kubectl get pod --show-labels
NAME                      READY     STATUS      RESTARTS   AGE       LABELS
javaee-memoapp2-1-build   0/1       Completed   0          17h       openshift.io/build.name=javaee-memoapp2-1
javaee-memoapp2-1-nwg62   1/1       Running     0          12m       app=javaee-memoapp2,deployment=javaee-memoapp2-1,deploymentconfig=javaee-memoapp2
javaee-memoapp2-1-w9cwt   1/1       Running     0          17h       app=javaee-memoapp2,deployment=javaee-memoapp2-1,deploymentconfig=javaee-memoapp2
memoapp-db-1-5ssgg        1/1       Running     0          17h       app=mysql-ephemeral,deployment=memoapp-db-1,deploymentconfig=memoapp-db,name=memoapp-db

app=javaee-memoapp2app=mysql-ephemeralなどのラベルが付与されているのが確認できる。 podの設定としてはこのmetadataの部分

[zaki@okd-master ~]$ kubectl get pod memoapp-db-1-5ssgg -o yaml 
apiVersion: v1
kind: Pod
metadata:
  annotations:
    openshift.io/deployment-config.latest-version: "1"
    openshift.io/deployment-config.name: memoapp-db
    openshift.io/deployment.name: memoapp-db-1
    openshift.io/generated-by: OpenShiftNewApp
    openshift.io/scc: restricted
  creationTimestamp: 2019-12-29T06:47:39Z
  generateName: memoapp-db-1-
  labels:
    app: mysql-ephemeral
    deployment: memoapp-db-1
    deploymentconfig: memoapp-db
    name: memoapp-db
  name: memoapp-db-1-5ssgg
:
:

指定ラベルを出力カラムの一つとして表示する

-Lでラベルのキー名を指定する。複数可。

[zaki@okd-master ~]$ kubectl get pod -L app,deployment
NAME                      READY     STATUS      RESTARTS   AGE       APP               DEPLOYMENT
javaee-memoapp2-1-build   0/1       Completed   0          17h                         
javaee-memoapp2-1-nwg62   1/1       Running     0          13m       javaee-memoapp2   javaee-memoapp2-1
javaee-memoapp2-1-w9cwt   1/1       Running     0          17h       javaee-memoapp2   javaee-memoapp2-1
memoapp-db-1-5ssgg        1/1       Running     0          17h       mysql-ephemeral   memoapp-db-1

指定ラベルを持つリソース(今回はpod)のみ表示する

-lでキー=値を指定する。複数可。

[zaki@okd-master ~]$ kubectl get pod -l app=javaee-memoapp2
NAME                      READY     STATUS    RESTARTS   AGE
javaee-memoapp2-1-nwg62   1/1       Running   0          13m
javaee-memoapp2-1-w9cwt   1/1       Running   0          17h

jsonpath

-o yamlで全量を出力するかわりに、JSON形式のパス情報を指定することで特定項目のみを出力できる。
kubectl get ***の整形でなく、-o jsonの中から任意のものをピックアップできるので自由度が高い。
(というよりは、kubectl getがRESTの応答から既定の値のみをピックアップ・表示してるだけという話なんだけど)

詳しくはJSONPath Support - Kubernetes

特定リソースの指定項目を表示

[zaki@okd-master ~]$ kubectl get pod javaee-memoapp2-1-nwg62 -o jsonpath='{.metadata.uid}{"\n"}'
c19df08a-2a95-11ea-89f0-000c29f44d7c

podのIPアドレスとデプロイしているノード名

[zaki@okd-master ~]$ kubectl get pod -o wide
NAME                      READY     STATUS      RESTARTS   AGE       IP            NODE                     NOMINATED NODE
javaee-memoapp2-1-build   0/1       Completed   0          17h       10.130.0.50   okd-node2.esxi.jp-z.jp   <none>
javaee-memoapp2-1-nwg62   1/1       Running     0          57m       10.129.0.51   okd-node1.esxi.jp-z.jp   <none>
javaee-memoapp2-1-w9cwt   1/1       Running     0          17h       10.130.0.51   okd-node2.esxi.jp-z.jp   <none>
memoapp-db-1-5ssgg        1/1       Running     0          17h       10.130.0.49   okd-node2.esxi.jp-z.jp   <none>
[zaki@okd-master ~]$ 
[zaki@okd-master ~]$ kubectl get pod javaee-memoapp2-1-nwg62 -o jsonpath='{.status.podIP}{"\t"}{.spec.nodeName}{"\n"}'
10.129.0.51     okd-node1.esxi.jp-z.jp

ラベルにヒットした全リソースの指定項目

[zaki@okd-master ~]$ kubectl get pod -l app=javaee-memoapp2 -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'
javaee-memoapp2-1-nwg62
javaee-memoapp2-1-w9cwt

複数の項目

pod名と1つ目のコンテナのレジストリパスをtab区切りで。

[zaki@okd-master ~]$ kubectl get pod -l app=javaee-memoapp2 -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
javaee-memoapp2-1-nwg62 docker-registry.default.svc:5000/sampleapp/javaee-memoapp2@sha256:018f927757e9faade7432091c61772afa176e08b902ac6aae58d0e8fd766421f
javaee-memoapp2-1-w9cwt docker-registry.default.svc:5000/sampleapp/javaee-memoapp2@sha256:018f927757e9faade7432091c61772afa176e08b902ac6aae58d0e8fd766421f

コンテナ一覧

[zaki@okd-master ~]$ kubectl get pod -n openshift-monitoring prometheus-k8s-1 -o jsonpath='{.spec.containers[*].name}{"\n"}'
prometheus prometheus-config-reloader prometheus-proxy rules-configmap-reloader

rangeを使って改行付き

[zaki@okd-master ~]$ kubectl get pod -n openshift-monitoring prometheus-k8s-1 -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'
prometheus
prometheus-config-reloader
prometheus-proxy
rules-configmap-reloader

jsonpathでフィルター

別記事を作成しました

zaki-hmkc.hatenablog.com