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形式)
下のツールで式の意味と次回実行時刻を確認できます。サーバーのタイムゾーンに合わせて切り替えられます。
ドロップダウンで組み立てる(クリックだけでcron式を作成)
各項目を選ぶと、上の式が自動で更新されます。「毎」のままの項目は現在の式を維持します。
次に実行される時刻
※ 時刻はお使いの端末のローカルタイムで計算しています。