【Kubernetes】Jobの結果をコマンドで取得する
KubernetesのJobのうち、backOffLimit
を超えてしまい失敗したもののみを抽出して削除したいときがあった。Jobの結果は type
フィールドに入っており、値は Complete
か Failed
のいずれか。また、Jobが実行中の場合 type
フィールド自体が存在しない。
kubectl get job <job_name> -o json { "apiVersion": "batch/v1", "kind": "Job", ... "status": { "completionTime": "2020-09-27T03:20:54Z", "conditions": [ { "lastProbeTime": "2020-09-27T03:20:54Z", "lastTransitionTime": "2020-09-27T03:20:54Z", "status": "True", "type": "Complete" # Job結果 } ], "startTime": "2020-09-27T03:20:17Z", "succeeded": 1 } }
このJob結果をコマンドで取りたいと思い、jsonpathでがんばってみた。
kubectl get job $job_name -n $NAMESPACE -o jsonpath='{.status.conditions[].type}'
しかし、これだとtypeフィールドがない場合に対応できない。調べてみたが、jsonpathでは「フィールドがない場合は空の値を返す」という挙動はできないようだ。
最終的にjqコマンドに切り替えて、以下のように実現した。 []?
を指定することで、そのフィールドが存在しない場合はnullが返ってくる。
kubectl get job pi -o json | jq '.status.conditions[]?.type'
Kubectl Cheat Sheetには、jqの方がjsonpathよりも複雑なことができると書いてある。普段使いの場合はjqの方が良いのかもしれない。