本文へスキップ
cron.surf

Kubernetes CronJob を毎日 9 時に実行する

Kubernetes で「毎日 9 時」を表す式は 0 9 * * * です。以下に、そのまま使える設定、次回の実行時刻、注意点をまとめます。 Kubernetes の CronJob は spec.schedule で 5 フィールドの cron を読み、実行ごとに Job を作ります。

0 9 * * *ツールで開く

“毎日 09:00”

CronJob マニフェスト

daily-at-9am.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-at-9am
spec:
  schedule: "0 9 * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 300
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.37
              command: ["sh", "-c", "echo running daily-at-9am"]

Kubernetes の注意点

曜日は 0〜6パーサーの上限は 6 です。日曜日は 0 と書きます。7 はエラーです。
取りこぼしが多すぎると止まるCronJob が 100 回以上起動を逃すと、コントローラーは起動しなくなります。startingDeadlineSeconds を設定して古い取りこぼしを数えないようにします。
実行が重なるconcurrencyPolicy の既定は Allow なので、遅い Job が次の回と重なることがあります。Forbid か Replace を使います。
日付フィールドの */n は「指定あり」制限なしと見なされるのは * か ? だけです。0 0 */2 * 1 は奇数日または月曜日に実行されますが、Vixie cron では奇数日かつ月曜日と解釈されます。

よくある質問

Kubernetes で「毎日 9 時」を表す cron 式は?

0 9 * * * です。意味:毎日 09:00

Kubernetes のスケジュールはどのタイムゾーンで動きますか?

spec.timeZone がなければ kube-controller-manager のローカルタイムゾーン(多くは UTC)です。spec.timeZone(Kubernetes 1.27 で安定版)に IANA 名を設定します。schedule 内の CRON_TZ や TZ は拒否されます。

CronJob は @daily に対応していますか?

対応しています。spec.schedule で @yearly、@monthly、@weekly、@daily、@hourly が使えます。

CronJob が 2 回動いた、または動かなかったのはなぜですか?

CronJob は予定時刻ごとにおおよそ 1 つの Job を作るもので、ちょうど 1 回は保証しません。Job を繰り返しても安全にし、startingDeadlineSeconds と concurrencyPolicy を確認してください。