第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 ジョブコントローラーは、期限の値と現時点の間に実行されなかったジョブの数をカウントすることに注意してください。たとえば、
startingDeadlineSeconds
が200
に設定されている場合、コントローラーは過去 200 秒間に実行されなかったジョブの数をカウントします。詳細については、Kubernetes ドキュメントで cron ジョブの概念に関連して cron ジョブの制限について参照してください。 - 4 4
- オプション: suspend フィールドは、cron ジョブの後続の実行を防ぐために使用されます。
true
に設定されると、後続のすべての実行が開始されなくなります。デフォルトでは、値はfalse
であり、ジョブが実行されます。 - 5
- オプション: 成功したジョブ履歴の制限では、保持する完了ジョブの数を指定します。デフォルトでは、3 つのジョブが保持されます。
- 6
- オプション: 失敗したジョブ履歴の制限では、保持する失敗したジョブの数を指定します。デフォルトでは、1 つのジョブが保持されます。
- 7
- ジョブテンプレートは実行するジョブを指定します。このフィールドは、ジョブのサンプルに似ています。
- 8
- オプション: labels フィールドは、cron ジョブによって開始されるジョブに設定するラベルを指定します。この例では、ジョブはラベル
parent=cronjobpi
を受け取ります。 - 9
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 run
は Never
または OnFailure
再起動ポリシー (--restart
) のみをサポートします。
必要なくなった Cron ジョブを削除します。
$ oc delete cronjob/<cron_job_name>
これを実行することで、不要なアーティファクトの生成を防げます。
38.3. Cron ジョブ後のクリーンアップ
.spec.successfulJobsHistoryLimit
と .spec.failedJobsHistoryLimit
のフィールドはオプションです。これらのフィールドでは、完了したジョブと失敗したジョブのそれぞれを保存する数を指定します。デフォルトで、これらのジョブの保存数はそれぞれ 3
と 1
に設定されます。制限に 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: ...