KubernetsにはJobというコマンドを実行したら終了するPodを管理するオブジェクトがあります。このJobですが気づいたら大量にPodが残っている状態になることが多くあります。今回は、このJobを削除する方法について紹介します。
ttlSecondsAfterFinishedを使う
Jobのspec内にttlSecondsAfterFinishedプロパティを使う方法があります。この設定を有効にすると成功、失敗したJobがその後設定した秒数後に削除されます。下記に設定例を示します。
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
ttlSecondsAfterFinished: 30
template:
spec:
containers:
- name: busybox
image: busybox
command: ["date"]
env:
- name: TZ
value: "JST-9"
restartPolicy: Never
この機能は、タイトルに記載した通りですが、v1.21からBeta版となっています。ローカルで利用してDocker for Desktopでは、v1.21になっていたので、利用できました。ただ、GEKのkubernetes serverのバージョンは、v1.19なので、こちらは、Alpha版の状態になっているので、注意が必要です。alpha版の場合には、--feature-gates
で”ttlSecondsAfterFinished”を有効にする必要があるので、注意が必要です。
kubectlで削除する場合
kubectlを使って終わったJobを消すこともできます。下記のフィルターを使って削除するパターンが多いかと思います。
# 成功したJobの名前を取得する
$ kubectl get job -o jsonpath='{.items[?(@.status.succeeded)].metadata.name}'
# 失敗したJobの名前を取得する
$ kubectl get job -o jsonpath='{.items[?(@.status.failed)].metadata.name}'
これで得られたjob名(xxxx)に対して、削除するには下記のコマンドを実行します。
$ kubectl delete job xxxxx
まとめ
長い間、alpha版だったttlSecondsAfterFinished機能が気づいたらベータ版になっていました。デフォルトで利用できるようになったのは嬉しいです。お疲れ様でした。