第38章 Cron ジョブ

38.1. 概要

Cron ジョブ は、ジョブの実行スケジュールを指定できるようにすることで通常のジョブ に基づいてビルドされます。Cron ジョブは Kubernetes API の一部であり、他の オブジェクトタイプと同様に oc コマンドで管理できます。

警告

Cron ジョブはスケジュールの実行時間ごとに約 1 回ずつジョブオブジェクトを作成しますが、ジョブの作成に失敗したり、2 つのジョブが作成される可能性のある状況があります。そのためジョブはべき等である必要があり、履歴制限を設定する必要があります。

38.2. Cron ジョブの作成

以下は、CronJob リソースのサンプルです。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: pi
spec:
  schedule: "*/1 * * * *"       1
  concurrencyPolicy: "Replace"  2
  startingDeadlineSeconds: 200  3
  suspend: false                4
  successfulJobsHistoryLimit: 3 5
  failedJobsHistoryLimit: 1     6
  jobTemplate:                  7
    spec:
      template:
        metadata:
          labels:               8
            parent: "cronjobpi"
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: OnFailure 9
1 1
cron 形式で指定されたジョブのスケジュール。この例では、ジョブは毎分実行されます。
2 2
オプション: 同時実行ポリシーは、ジョブコントローラーが cron ジョブ内の同時実行ジョブを処理する方法を指定します。以下のポリシーのいずれか 1 つのみを指定できます。
  • Allow: ジョブの複数のインスタンスの同時実行を許可します。 Allow はデフォルトの値です。
  • Forbid: ジョブの複数のインスタンスの同時実行を禁止します。直前の実行が終了していない場合には、スケジュールされた実行は省略されます。
  • Replace: 現在実行中の ジョブをキャンセルし、ジョブを新規インスタンスに置き換えます。
3 3
オプション: 開始期限は、スケジュールされた実行が何らかの理由で実行されない場合のジョブの期限(秒単位)を指定します。期限を過ぎると、cron ジョブはジョブを開始しません。実行されなかったジョブの実行は、失敗したジョブとしてカウントされます。デフォルトでは、ジョブに期限はありません。このフィールドが設定されている場合、cron ジョブコントローラーは、期限の値と現時点の間に実行されなかったジョブの数をカウントすることに注意してください。たとえば、startingDeadlineSeconds200 に設定されている場合、コントローラーは過去 200 秒間に実行されなかったジョブの数をカウントします。詳細については、Kubernetes ドキュメントで cron ジョブの概念に関連して cron ジョブの制限について参照してください。
4 4
オプション: suspend フィールドは、cron ジョブの後続の実行を防ぐために使用されます。true に設定されると、後続のすべての実行が開始されなくなります。デフォルトでは、値は false であり、ジョブが実行されます。
5
オプション: 成功したジョブ履歴の制限では、保持する完了ジョブの数を指定します。デフォルトでは、3 つのジョブが保持されます。
6
オプション: 失敗したジョブ履歴の制限では、保持する失敗したジョブの数を指定します。デフォルトでは、1 つのジョブが保持されます。
7
ジョブテンプレートは実行するジョブを指定します。このフィールドは、ジョブのサンプルに似ています。
8
オプション: labels フィールドは、cron ジョブによって開始されるジョブに設定するラベルを指定します。この例では、ジョブはラベルparent=cronjobpi を受け取ります。
9
オプション: 実行を開始した Pod の 再起動ポリシー。このポリシーは、AlwaysOnFailure、または Never に設定できます。デフォルトでは、コンテナは常に再起動されます。このフィールドはジョブコントローラには適用されないことに注意してください。詳細については、「既知の制限」を参照してください。

CronJob 仕様の詳細については、Kubernetesのドキュメントで cron ジョブ仕様の作成 について参照してください。

注記

すべての cron ジョブ schedule の時間は、ジョブが実行されるマスターのタイムゾーンをベースとします。

oc run を使用して単一コマンドから cron ジョブを作成し、起動することもできます。以下のコマンドは直前の例で指定されている同じ cron ジョブを作成し、これを起動します。

$ oc run pi --image=perl --schedule='*/1 * * * *' \
    --restart=OnFailure --labels parent="cronjobpi" \
    --command -- perl -Mbignum=bpi -wle 'print bpi(2000)'

oc run で、--schedule オプションは cron 形式のスケジュールを受け入れます。

注記

Cron ジョブの作成時に、oc runNever または OnFailure 再起動ポリシー (--restart) のみをサポートします。

ヒント

必要なくなった Cron ジョブを削除します。

$ oc delete cronjob/<cron_job_name>

これを実行することで、不要なアーティファクトの生成を防げます。

38.3. Cron ジョブ後のクリーンアップ

.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit のフィールドはオプションです。これらのフィールドでは、完了したジョブと失敗したジョブのそれぞれを保存する数を指定します。デフォルトで、これらのジョブの保存数はそれぞれ 31 に設定されます。制限に 0 を設定すると、終了後に対応する種類のジョブのいずれも保持しません。

Cron ジョブはジョブや Pod などのアーティファクトリソースをそのままにすることがあります。ユーザーは履歴制限を設定して古いジョブとそれらの Pod が適切に消去されるようにすることが重要です。現時点で、これに対応する 2 つのフィールドが Cron ジョブ仕様にあります。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: pi
spec:
  successfulJobsHistoryLimit: 3 1
  failedJobsHistoryLimit: 1     2
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
  ...
1
保持する成功した完了ジョブの数。デフォルト値は 3 です。
2
保持する失敗した終了ジョブの数。デフォルト値は 1 です。