Kubernetes CronJobのschedule書き方 — timeZone指定と多重起動対策

KubernetesのCronJobは標準的な5フィールドのcron式で指定します。v1.27以降は .spec.timeZone が安定版になり、【Asia/Tokyoを指定すれば日本時間のまま】書けるのが大きな利点です。

書式の要点(標準cronとの違い)

  • フィールドは標準の5つ(分 時 日 月 曜日)。
  • .spec.timeZone: "Asia/Tokyo" でタイムゾーン指定(v1.27+で安定)。未指定時はkube-controller-managerのタイムゾーン(通常UTC)。
  • concurrencyPolicy で多重起動を制御(Allow=許可/Forbid=スキップ/Replace=置き換え)。
  • @daily などのマクロも使えます。

日本時間(JST)で指定するには

timeZone: Asia/Tokyo を指定すれば、cron式を日本時間のまま書けます。古いクラスタ(1.26以前)では未対応のことがあるため、その場合はUTCで9時間引いて指定します。

コピペで使える設定例

平日9時(日本時間のまま指定)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: weekday-report
spec:
  schedule: "0 9 * * 1-5"
  timeZone: "Asia/Tokyo"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: job
              image: busybox
              command: ["sh", "-c", "echo run"]
          restartPolicy: OnFailure

つまずきポイント

  • concurrencyPolicy未設定(既定Allow)だと、前回ジョブが長引いた場合に多重起動します。バッチ処理は原則Forbidを検討。
  • スケジュールの取りこぼしが100回を超えると、そのCronJobはエラーになり実行されなくなります。startingDeadlineSecondsの設定に注意。
  • timeZoneのスペルはIANA形式(Asia/Tokyo)。JSTのような略称は使えません。

式を検証する(標準cron形式)

下のツールで式の意味と次回実行時刻を確認できます。サーバーのタイムゾーンに合わせて切り替えられます。

次に実行される時刻

※ 時刻はお使いの端末のローカルタイムで計算しています。

公式ドキュメント

Kubernetes公式: CronJob