koukiblog

たぶんweb系の話題

Kubernetesで完了済みのJobをまとめて削除する

Kubernetesの完了済みJobリソースをまとめて削除するには、field-selectorに"status.successful=1"を指定することで削除できます。

kubectl delete jobs  --field-selector status.successful=1

field-selector に指定できるフィールドはリソース毎に定義されていて、Jobの場合は、metadataまたは、 status.successfulのみが指定できます。どこにもドキュメンテーションされていないようです。

指定できるフィールドは、kubernetesのコード内で見ることができます。 kubectl get で取得しても、status.successfulというフィールドは存在しないのでかなりわかりにくいですね。。

func addConversionFuncs(scheme *runtime.Scheme) error {
    return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Job"),
        func(label, value string) (string, string, error) {
            switch label {
            case "metadata.name", "metadata.namespace", "status.successful":
                return label, value, nil
            default:
                return "", "", fmt.Errorf("field label %q not supported for batchv1.Job", label)
            }
        },
    )
}

https://github.com/kubernetes/kubernetes/blob/master/pkg/apis/batch/v1/conversion.go#L34

完了済みジョブを削除するときの条件が複雑な場合は、go-clientを利用したプログラミングが必要になりますが、大量に完了済みのジョブが残っているのが気になるくらいであれば、kubectl delete で解決してしまうのもよいんじゃないかなと思います。(まだAlphaですがTTLコントローラを利用する方法もあります )

1日1回CronJobを利用して完了済みのジョブを削除するだけであれば、下記のようにシンプルに済ませることができます。

Delete complete k8s jobs everyday · GitHub

備考

status.successfulはこの投稿で知りました

kubernetes - How can I find the list of field selectors supported by kubectl for a given resource type? - Stack Overflow