トラブルシューティング · 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、設定の問題

失敗が保持されて見えるよう backoffLimitfailedJobsHistoryLimit を設定してください。

本当の問題: グリーンな CronJob でも何もしていない場合がある

kubectl get cronjob でジョブが表示されても作業が行われているとは限りません — Pod はサイレントに失敗し、デッドラインが逃され、悪いデプロイで suspended になる場合があります。クラスターレベルのノイズはこれらを埋めてしまいます。

ジョブのコンテナが成功したときにハートビートを ping するようにしてください。Job の完了が何らかの理由で停止した場合、ping が欠落してアラートが届きます — クラスター自身の監視とは独立して。

# コンテナコマンドの最後のステップ
curl -fsS https://ping.steadycron.com/<your-ping-token>