トラブルシューティング · Kubernetes
Kubernetes CronJob が動かない?素早く診断する
Kubernetes CronJob が動かない理由 — suspended、タイムゾーン、concurrencyPolicy、失敗した Pod、missed deadline — とそれぞれの修正方法。
Kubernetes の CronJob は通常の cron に加えて固有の障害モードがあります。順番に確認してください。
1. suspended になっていないか?
suspended の CronJob は Job を一切作成しません。
kubectl get cronjob my-job -o jsonpath='{.spec.suspend}' # true = suspended
kubectl patch cronjob my-job -p '{"spec":{"suspend":false}}'
2. スケジュールとタイムゾーンを確認
デフォルトでスケジュールは kube-controller-manager のタイムゾーン(従来は UTC)で評価されます。Kubernetes 1.27 以降は明示的に設定できます。
spec:
schedule: "0 2 * * *"
timeZone: "Asia/Tokyo"
3. 最近の Job とイベントを確認
kubectl get jobs --selector=job-name --sort-by=.metadata.creationTimestamp
kubectl describe cronjob my-job # イベント: "Created job"、"Missed schedule"
「Cannot determine if job needs to be started… missed start window」は問題4を示しています。
4. startingDeadlineSeconds と missed schedules
コントローラーが一時的にダウンして100以上のスケジュールが失われると、CronJob は修正するまでスケジューリングを完全に停止します。デッドラインを設定して、漏れたスロットをクリーンにスキップするようにしてください。
spec:
startingDeadlineSeconds: 200
concurrencyPolicy: Forbid # 重複する実行を積み重ねない
5. Pod が動いているが失敗する
エラーが発生した Job の Pod は常に明らかではありません。検査してください。
kubectl logs job/<job-name>
kubectl describe pod <pod> # イメージプルエラー、OOMKilled、設定の問題
失敗が保持されて見えるよう backoffLimit と failedJobsHistoryLimit を設定してください。
本当の問題: グリーンな CronJob でも何もしていない場合がある
kubectl get cronjob でジョブが表示されても作業が行われているとは限りません — Pod はサイレントに失敗し、デッドラインが逃され、悪いデプロイで suspended になる場合があります。クラスターレベルのノイズはこれらを埋めてしまいます。
ジョブのコンテナが成功したときにハートビートを ping するようにしてください。Job の完了が何らかの理由で停止した場合、ping が欠落してアラートが届きます — クラスター自身の監視とは独立して。
# コンテナコマンドの最後のステップ
curl -fsS https://ping.steadycron.com/<your-ping-token>