【Kubernetes】Jobの結果をコマンドで取得する

KubernetesのJobのうち、backOffLimit を超えてしまい失敗したもののみを抽出して削除したいときがあった。Jobの結果は type フィールドに入っており、値は CompleteFailed のいずれか。また、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の方が良いのかもしれない。

jamesdefabia.github.io