schedule フィールド
spec.schedule には 5 フィールドの Cron 式を指定します。たとえば "0 */6 * * *" は 6 時間ごとです。Kubernetes は @hourly、@daily、@weekly、@monthly、@yearly などのマクロにも対応しています。アスタリスクが誤解釈されないよう、YAML では値を引用符で囲みましょう。
spec.timeZone によるタイムゾーン指定
タイムゾーンを指定しない場合、スケジュールは kube-controller-manager のタイムゾーン(通常は UTC)で解釈されます。Kubernetes 1.27 以降は spec.timeZone に Asia/Tokyo のような IANA 名を設定できます。ツールで同じタイムゾーンを選ぶと、夏時間の切り替えも含めて正確な作成時刻をプレビューできます。
実行の取りこぼしと同時実行
コントローラーが予定時刻を逃した場合、startingDeadlineSeconds によって Job がどれだけ遅れて開始できるかが決まります。concurrencyPolicy は前回の実行がまだ動いているときの動作(Allow、Forbid、Replace)を制御します。毎分のような高頻度のスケジュールでは特に注意しましょう。
テスト中は kubectl create job --from=cronjob/<name> <job-name> ですぐに 1 回実行でき、kubectl get cronjob で LAST SCHEDULE と ACTIVE の列を確認できます。CronJob オブジェクトのイベントを見ると、予定時刻がスキップされた理由や Job の起動に失敗した理由が分かります。
最小限のマニフェスト
CronJob は apiVersion batch/v1、kind CronJob を使い、spec.schedule、任意の spec.timeZone、実行する Pod を記述する jobTemplate を持ちます。suspend: true を設定すると削除せずにスケジュールを一時停止でき、successfulJobsHistoryLimit と failedJobsHistoryLimit でデバッグ用に残す完了済み Job の数を調整できます。
よくある質問
- Kubernetes CronJob は秒に対応していますか?
- いいえ。スケジュールは 5 フィールドなので、最短間隔は 1 分です。
- スケジュールに CRON_TZ は使えますか?
- 使えません。TZ や CRON_TZ の接頭辞はサポートされていないので、spec.timeZone フィールドを使ってください。
- 0 */6 * * * はどういう意味ですか?
- 6 時間ごとの正時、つまり 00:00、06:00、12:00、18:00 に実行されます。
- CronJob が 2 回実行された、または実行されなかったのはなぜ?
- startingDeadlineSeconds と concurrencyPolicy、そしてコントローラーが停止していなかったかを確認してください。CronJob は予定時刻ごとにおおむね 1 つの Job を作成しますが、保証はされません。