CronJob は Google Kubernetes Engine(GKE)バージョン 1.21 以降(一般提供)で使用できます。このドキュメントでは、GKE で CronJob を実行する方法について説明します。CronJob は Kubernetes の組み込み機能です。詳細については、CronJob に関する Kubernetes のドキュメントをご覧ください。
概要
CronJob は、繰り返しのスケジュールで Kubernetes Job を作成します。CronJob を使用すると、バックアップ、レポート作成、メール送信、クリーンアップ タスクなどの定期的なタスクを自動化できます。
CronJob は、Job と同じ方法で作成、管理、スケーリング、削除されます。作成されるジョブ オブジェクトの正確な数は、いくつかの要因によって異なります。詳細については、CronJob の制限事項をご覧ください。
ジョブの詳細については、ジョブを実行するをご覧ください。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
CronJob を作成する
CronJob は、マニフェスト ファイルを使用して作成できます。たとえば、次の YAML マニフェストは、CronJob パラメータのデフォルト値を維持したまま、現在の時刻と文字列を 1 分ごとに出力します。
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello, World!"
restartPolicy: OnFailure
この CronJob を作成するには、YAML マニフェストをファイルに保存してクラスタに適用します。
kubectl apply -f PATH_TO_FILE
PATH_TO_FILE
は、YAML マニフェストへのパスに置き換えます。
CronJob を構成する
CronJob を作成するときに、次のパラメータを指定できます。
- CronJob を実行するタイミング
- CronJob の実行内容
- CronJob の開始期限
- CronJob に同時実行 Job を許可するかどうか
- 新しいジョブを一時停止するかどうか
- CronJob の履歴に保存する実行数
CronJob を実行するタイミングを指定する
spec.schedule
フィールドは、UNIX 標準の crontab
形式を使用して CronJob を実行する時間と間隔を定義します。すべての CronJob 時間は UTC で表示されます。スペースで区切られた 5 つのフィールドがあります。こうしたフィールドは、以下を表します。
- 分(0~59)
- 時間(0~23)
- 日(1~31)
- 月(1~12)
- 曜日(0~6、日曜日から始まります)
任意の spec.schedule
フィールドで次の特殊文字を使用できます。
?
は、単一の文字と一致するワイルドカード値です。*
は、ゼロ個以上の文字と一致するワイルドカード値です。/
を使用すると、フィールドの間隔を指定できます。たとえば、最初のフィールド(分フィールド)の値が*/5
の場合、「5 分ごと」を意味します。5 番目のフィールド(曜日フィールド)が0/5
に設定されている場合、「5 回目の日曜日ごと」を意味します。
CronJob の実行内容を指定する
spec.jobTemplate
は、コンテナの画像、コンテナが実行するコマンド、CronJob の再起動ポリシーなど、CronJob が実行する内容を記述します。spec.jobTemplate
に含める内容の詳細については、Kubernetes CronJob のドキュメントをご覧ください。
期限を指定する
省略可の startingDeadlineSeconds
フィールドは、なんらかの理由でスケジュールされた時刻に CronJob を実行できなかった場合に、CronJob を開始するまでの最大秒数を示します。実行しそこなった CronJob は失敗と見なされます。
期限を指定するには、マニフェスト ファイルで startingDeadlineSeconds
の値を CronJob の spec
フィールドに追加します。たとえば、次のマニフェストは、CronJob を 100 秒後に開始するように指定します。
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
jobTemplate:
spec:
...
同時実行ポリシーを指定する
省略可の spec.concurrencyPolicy
フィールドは、CronJob コントローラによって作成される 1 つのジョブの同時実行をどのように処理するかを指定します。値を設定しない場合、複数の同時実行ジョブがデフォルトで許可されます。
concurrencyPolicy
の値としては次を使用できます。
値 | 意味 |
---|---|
Allow |
同時実行ジョブを許可します。これがデフォルトです。 |
Forbid |
同時実行ジョブを禁止します。前のジョブが完了するかタイムアウトするまで、新しいジョブは開始できません。 |
Replace |
同時実行ジョブを禁止します。新しいジョブを優先し、古いジョブはキャンセルされます。 |
後続の実行を一時停止する
省略可の spec.suspend
フィールドを true
に設定すると、新しいジョブは実行されませんが、現在の実行の終了は許可されます。
履歴制限を指定する
CronJob は、実行するたびにポッドを作成します。最近実行した CronJob の終了ステータスと各ポッドのログの表示については、CronJob の履歴を表示するを参照してください。
保存される CronJob 実行の成功と失敗の回数は、spec.successfulJobsHistoryLimit
と spec.failedJobsHistoryLimit
の値を指定することで構成できます。デフォルトでは、successfulJobsHistoryLimit
は 3、failedJobsHistoryLimit
は 1 にそれぞれ設定されます。
たとえば、次のマニフェストは、最大 5 件の成功した CronJob 実行と最大 10 件の失敗した CronJob 実行を保存するように GKE に指示します。
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
CronJob の実行履歴の成否は、それぞれの値を 0
に設定することで無効にできます。履歴の保持を無効にすると、エラーのデバッグがより難しくなることがあります。たとえば、次のマニフェストは、失敗した CronJob 実行のみを保存するように GKE に指示します。
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
CronJob を検査する
CronJob の構成を確認するには、kubectl describe
を使用します。
kubectl describe cronjob CRONJOB_NAME
CRONJOB_NAME
は、検査する CronJob の名前に置き換えます。
CronJob の履歴を表示する
CronJob はポッド内で実行されます。Kubernetes がデフォルトで保持するログは、CronJob が正常に実行された最新の 3 件と失敗した最新のジョブ 1 件を表す終了したポッドのログです。これらのデフォルトは、CronJob の履歴制限を変更することで変更または無効にできます。
CronJob の履歴を表示するには、まずすべてのポッドを一覧表示します。完了した CronJob のステータスは Completed
で、失敗したジョブのステータスは RunContainerError
、CrashLoopBackOff
、あるいは失敗を示す別のステータスと表示されます。
NAME READY STATUS RESTARTS AGE
hello-1556555640-9bc5r 0/1 Completed 0 3m6s
hello-1556555700-cm6wk 0/1 Completed 0 2m6s
hello-1556555760-62wf5 0/1 Completed 0 66s
hello-1556555820-rl8kl 0/1 Completed 0 5s
hello-failed-1556555820-wrvt2 0/1 RunContainerError 1 5s
特定の CronJob のログを表示するには、次のコマンドを実行します。
kubectl logs POD_NAME
POD_NAME
は、検査する Pod の名前に置き換えます。
出力は次のようになります。
container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"
CronJob を削除する
CronJob を削除するには、次のコマンドを実行します。
kubectl delete cronjob CRONJOB_NAME
CronJob を削除すると、Kubernetes ガベージ コレクタが関連するジョブを削除し、新しいジョブは開始されません。