Save 37% off PRO during our Black Friday Sale! »

CronJobがschedule通りにJobを生成しない時

 CronJobがschedule通りにJobを生成しない時

Kubernetes Novice Tokyo #14 のLT枠の登壇資料です。

491bde095856f2097f08f8034dabd998?s=128

TajimaTheMemer

October 19, 2021
Tweet

Transcript

  1. CronJobがschedule通りに
 Jobを生成しない時
 Kubernetes Novice Tokyo #14 2021/10/19 
 
 株式会社ZOZO


    技術本部 データシステム部
 MLOpsブロック
 田島 太一 Copyright © ZOZO, Inc.
  2. © ZOZO, Inc. 株式会社ZOZO
 技術本部 データシステム部
 MLOpsブロック 田島 太一
 Kubernetes(GKE)歴:

    1.5年
 
 Twitter: @tap1ma
 GitHub: TajimaTheMemer
 
 
 2
  3. © ZOZO, Inc. https://zozo.jp/
 3 • ファッション通販サイト
 • 1,400以上のショップ、8,400以上のブランドの取り扱い
 •

    常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商 品を掲載(2021年6月末時点)
 • ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など

  4. © ZOZO, Inc. https://wear.jp/
 4 • ファッションコーディネートアプリ
 • 1,500万ダウンロード突破、コーディネート投稿総数は1,000万件以上 (2021年6月末時点)


    • ピックアップタグから最新のトレンドをチェック
 • コーディネート着用アイテムをブランド公式サイトで購入可能
 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加

  5. © ZOZO, Inc. CronJobがschedule通りにJobを 生成しない時
 5

  6. © ZOZO, Inc. 本日は...
 CronJob運用時のschedule周りのハマり
 どころをお話します
 
 6

  7. © ZOZO, Inc. 突然ですが、
 皆さんはCronJobを運用していますか?
 
 7

  8. © ZOZO, Inc. 
 CronJobとは
 8

  9. © ZOZO, Inc. CronJobとは
 定期実行するバッチ処理を制御するKubernetesの リソース
 
 9

  10. © ZOZO, Inc. CronJobとは
 CronJob Jobを定期的に生成するリソース
 ↪ Job バッチ処理をPodとして実行するリソース
 ↪

    Pod
 
 
 10
  11. © ZOZO, Inc. CronJobとは
 11

  12. © ZOZO, Inc. CronJobの概要はこんなところで。
 では、本題に戻ります。
 
 12

  13. © ZOZO, Inc. 本日は
 CronJobのschedule周りのハマりどころについて説 明します
 
 13

  14. © ZOZO, Inc. 具体的には、以下について解説します。
 • schedule指定の時刻じゃないのにJobを生成してしまう
 ケース(2つ)
 • schedule指定の時刻になってもJobを生成しないケース(1つ)
 


    
 14
  15. © ZOZO, Inc. 
 schedule指定の時刻じゃないのに
 Jobを生成してしまうケース
 
 15

  16. © ZOZO, Inc. 
 schedule指定の時刻じゃないのに
 Jobを生成してしまうケース
 1つ目
 16

  17. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース①
 scheduleを変更した際に以下の時系列の順序が成り立ってい ると即座にJobが生成される。
 
 lastScheduleTimeの日時
 ↓
 変更前のscheduleの次回予定日時


    ↓
 変更後のscheduleの次回予定日時
 17
  18. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース①
 lastScheduleTimeとは...
 CronJobが直近でJobを生成した日時のこと。
 
 
 18

  19. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース①
 具体例
 • 毎日8:00(UTC)に実行されるscheduleに設定していた。
 • 10/18 6:00(UTC)

    に、scheduleを毎日8:00(UTC) → 毎日9:00(UTC)実行に変更し kubectl applyした。すると、即座にJobが生成された。
 
 lastScheduleTimeの日時(10/17 8:00)
 ↓
 変更前のscheduleの次回予定日時(10/18 8:00)
 ↓
 変更後のscheduleの次回予定日時(10/18 9:00)
 19
  20. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース①
 なぜ...? CronJobの仕様です。
 ただし、Kubernetes 1.20からalphaで使用できるCronJob Controller v2ではこの

    挙動は発生しません。※alphaなのでご注意 
 
 
 20 参考: https://github.com/kubernetes/kubernetes/issues/65457#issuecomment-400984574
  21. © ZOZO, Inc. 
 schedule指定の時刻じゃないのに
 Jobを生成してしまうケース
 21

  22. © ZOZO, Inc. 
 schedule指定の時刻じゃないのに
 Jobを生成してしまうケース
 2つ目
 22

  23. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース②
 CronJobのsuspendをtrue → falseに変更した時、
 scheduleで指定した時刻からstartingDeadlineSecondsの時間内であると、即 座にJobが生成される。
 


    
 
 23
  24. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース②
 startingDeadlineSecondsとは...
 CronJobのoptionalな設定値の1つ。
 開始時刻が遅れた場合に許容できる秒数を指定できる。
 
 
 


    
 24
  25. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース②
 具体例
 • 8:00〜9:00は開始時刻として許容する設定になっていた。
 ◦ 毎日8:00(UTC)に実行されるscheduleを設定していた。
 ◦

    startingDeadlineSecondsに3600秒(=1時間)を設定していた。
 • ある日の8:30にsuspend: true → falseに変更しkubectl applyした。するとJobが即 座に生成された。
 
 
 25
  26. © ZOZO, Inc. schedule指定の時刻じゃないのにJobを生成してしまうケース②
 なぜ...? これもCronJobの仕様です。
 suspend: true → falseに変更する際はその時刻と

    startingDeadlineSecondsの設定値に気を配りましょう。
 
 
 
 26
  27. © ZOZO, Inc. 
 schedule指定の時刻になっても
 Jobを生成しないケース
 
 27

  28. © ZOZO, Inc. schedule指定の時刻になってもJobを生成しないケース
 以下の設定でscheduleに指定した時刻を100回以上迎えると、その後 suspend: true → falseへ変更後にscheduleの時刻を迎えてもJobが生成され なくなってしまう。


    • startingDeadlineSecondsが未設定
 • CronJobがsuspend: trueの設定
 
 
 28
  29. © ZOZO, Inc. schedule指定の時刻になってもJobを生成しないケース
 具体例
 • startingDeadlineSecondsが未設定だった。毎分実行されるschedule設定にしてい た。
 • 10:00(UTC)にsuspend:trueにし、それから2時間後の12:00(UTC)にsuspend:

    false に戻した。 (=120回スキップ)
 • 12:01(UTC)にJobが生成されると思いきや、生成されない。
 
 
 
 29
  30. © ZOZO, Inc. schedule指定の時刻になってもJobを生成しないケース
 なぜ...? これまたCronJobの仕様です。
 CronJobは100回連続で失敗するとJobを生成しなくなる。 (suspend: true時のスケジュール実行は内部的には失敗としてカウントさ れている)


    
 
 
 
 30
  31. © ZOZO, Inc. schedule指定の時刻になってもJobを生成しないケース
 回避策 「startingDeadlineSecondsを適切に設定する」
 startingDeadlineSecondsを設定すると...
 「100回連続の失敗すると」ではなく「scheduleに指定した時刻から startingDeadlineSecondsの設定した秒数の間に連続して100回失敗すると」 Jobを生成しなくなる。


    
 
 
 31
  32. © ZOZO, Inc. 
 まとめ
 32

  33. © ZOZO, Inc. まとめ
 scheduleやsuspendの設定値を変更する際は
 変更するタイミングやstartingDeadlineSecondsの設定値に気をつけま しょう
 
 
 33

  34. © ZOZO, Inc. 参考
 • Kubernetes公式ドキュメント: CronJob • CronJob v2

    ControllerのPull Request • mercari engineering: Kubernetes CronJobと仲良くなりたい
 34
  35. None