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機能が気づいたらベータ版になっていました。デフォルトで利用できるようになったのは嬉しいです。お疲れ様でした。