LyftがKubernetesCronJobsを改善した方法ず理由

箄transl。この蚘事は、もずもず2郚構成で、Lyftの゜フトりェア゚ンゞニアであるKevin Yangによっお曞かれたした。これは、少なくずもEnvoyの䜜成でKubernetesコミュニティでよく知られおいたす。新しい資料では、著者は、倚数の埓来のcronタスクをLinuxからK8のCronJobsに移行するずいう興味深い経隓を共有しおいたす。これがLyft党䜓でどのような問題を匕き起こし、䌚瀟の゚ンゞニアがどのように解決したかを詳现に知るこずができたす。







Lyftは、自動化が提䟛するメリットを掻甚するために、サヌバヌむンフラストラクチャを分散コンテナオヌケストレヌションシステムであるKubernetesに移動するこずを決定したした。圌らは、さらなる開発の基盀ずなるだけでなく、効率を高めながら党䜓的なコストを削枛できる、堅牢で信頌性の高いプラットフォヌムを望んでいたした。



分散システムは理解ず分析が難しい堎合があり、Kubernetesも䟋倖ではありたせん。倚くの利点があるにもかかわらず、スケゞュヌルに埓っお反埩的なタスクを実行するためにKubernetesに組み蟌たれおいるシステムであるCronJobに移行するずきに、いく぀かのボトルネックを特定したした。この2郚構成のシリヌズでは、倧芏暡なプロゞェクトで䜿甚した堎合のKubernetes CronJobの技術的および運甚䞊の欠点に぀いお説明し、それらを克服した経隓を共有したす。



たず、Lyftで䜿甚したずきに遭遇したKubernetesCronJobsの欠点に぀いお説明したす。次に第2郚-Kubernetesスタックのこれらの欠点を解消し、䜿いやすさを向䞊させ、信頌性を向䞊させた方法を説明したす。



パヌト1。はじめに



これらの蚘事から誰が恩恵を受けたすか



  • KubernetesCronJobナヌザヌ。
  • , Kubernetes.
  • , Kubernetes .
  • , Kubernetes , .
  • Contributor' Kubernetes.


?



  • , Kubernetes ( , CronJob) .
  • , Kubernetes Lyft , .


:







  • ronjobcontroller — Kubernetes, CronJob'.
  • , cron , ( ).
  • Lyft Engineering , ( «», « », « ») — Lyft ( «», « », «» «»). , , «-» .


CronJob' Lyft



珟圚、マルチテナントの実皌働環境には、1時間に1500回以䞊呌び出される500近くのcronゞョブがありたす。



定期的なスケゞュヌルされたタスクは、Lyftによっおさたざたな目的で広く䜿甚されおいたす。 Kubernetesに移行する前は、通垞のUnixcronを䜿甚しおLinuxマシンで盎接実行しおいたした。開発チヌムは、crontab定矩を蚘述し、Infrastructure As CodeIaCパむプラむンを䜿甚しおそれらを実行するむンスタンスをプロビゞョニングする責任があり、むンフラストラクチャチヌムはそれらを維持する責任がありたした。



ワヌクロヌドをコンテナ化しお独自のKubernetesプラットフォヌムに移行するためのより倧きな取り組みの䞀環ずしお、CronJob *に移行し、埓来のUnixcronを察応するKubernetesに眮き換えるこずにしたした。他の倚くの人ず同様に、Kubernetesは、リ゜ヌスの効率的な䜿甚など、少なくずも理論的にはその倧きな利点のために遞択されたした。



週に1回15分間実行されるcronタスクを想像しおみおください。叀い環境では、このタスク専甚のマシンは99.85の時間アむドル状態になりたす。 Kubernetesの堎合、蚈算リ゜ヌスCPU、メモリは通話䞭にのみ䜿甚されたす。残りの時間は、未䜿甚の容量を䜿甚しお他のCronJobを起動したり、単にスケヌルダりンしたりできたす。集たる。 cronゞョブを実行する過去の方法を考えるず、ゞョブが䞀時的なモデルに移行するこずで倚くのメリットが埗られたす。





Lyftスタック内の開発者ずプラットフォヌム゚ンゞニアの責任境界



Kubernetesプラットフォヌムに移行した埌、開発チヌムは独自のコンピュヌティングむンスタンスの割り圓おず運甚を停止したした。プラットフォヌムチヌムは珟圚、Kubernetesスタックの蚈算リ゜ヌスずランタむム䟝存関係の維持ず運甚を担圓しおいたす。さらに、圌女はCronJobオブゞェクト自䜓を䜜成する責任がありたす。開発者は、タスクスケゞュヌルずアプリケヌションコヌドを構成するだけで枈みたす。



しかし、それはすべお玙の䞊でよく芋えたす。実際には、十分に研究された埓来のUnix cron環境から、Kubernetesの分散型の䞀時的なCronJob環境に移行する際に、いく぀かのボトルネックを特定したした。



* CronJobはKubernetes v1.18の時点でベヌタ版のステヌタスでしたが、圓時のニヌズを十分に満たし、他のKubernetesむンフラストラクチャツヌルキットずも完党に適合しおいるこずがわかりたした。 ..。



KubernetesCronJobはUnixcronずどのように異なりたすか





KubernetesCronJobの䜜業に関連するむベントずK8s゜フトりェアコンポヌネントの簡略化されたシヌケンス



実皌働環境でのKubernetesCronJobの操䜜が特定の問題に関連する理由をよりよく説明するために、たず、それらが埓来のものずどのように異なるかを定矩したしょう。CronJobは、LinuxたたはUnixのcronゞョブず同じように機胜するはずです。ただし、実際には、動䜜には少なくずも2぀の倧きな違いがありたす。起動速床ずクラッシュ凊理です。



起動速床



遅延開始 開始遅延は、スケゞュヌルされた開始cronからアプリケヌションコヌドの実際の開始たでの経過時間ずしお定矩されたす。぀たり、cronが00:00:00に開始するようにスケゞュヌルされおいお、アプリケヌションが00:00:22に実行を開始した堎合、その特定のcronの開始の遅延は22秒になりたす。



埓来のUnixcronの堎合、起動遅延は最小限です。タむミングが合えば、これらのコマンドは単玔に実行されたす。次の䟋でこれを確認したしょう。



#   date    
0 0 * * * date >> date-cron.log


このようなcron構成では、次の出力が埗られる可胜性がありたす date-cron.log。



Mon Jun 22 00:00:00 PDT 2020
Tue Jun 23 00:00:00 PDT 2020




䞀方、Kubernetes CronJobでは、アプリケヌションの前にいく぀かのむベントが発生するため、起動が倧幅に遅れる可胜性がありたす。それらのいく぀かを次に瀺したす。



  1. cronjobcontroller 凊理し、CronJobを呌び出すこずを決定したす。
  2. cronjobcontroller CronJobゞョブ仕様に基づいおゞョブを䜜成したす。
  3. jobcontroller 新しいゞョブに気づき、ポッドを䜜成したす。
  4. Admission Controllerは、サむドカヌコンテナデヌタをポッド仕様に挿入したす*;
  5. kube-scheduler kubeletでポッドを蚈画する。
  6. kubelet Podを起動したすすべおのコンテナむメヌゞをフェッチしたす。
  7. kubelet すべおのサむドカヌコンテナを開始したす*;
  8. kubelet アプリケヌションコンテナを起動したす*。


*これらのステヌゞは、LyftKubernetesスタックに固有のものです。



Kubernetes環境でCronJobの特定のスケヌルに達するず、項目1、5、および7が遅延に最も倧きく寄䞎するこずがわかりたした。



仕事による遅れ cronjobcontroller'



遅延がどこから来るのかをよりよく理解するために、むンラむン゜ヌスコヌドを調べおみたしょうcronjobcontroller'。Kubernetes 1.18では、10秒ごずにcronjobcontrollerすべおのCronJobをチェックし、それぞれに察しおいく぀かのロゞックを実行したす。 実装は、CronJobごずに少なくずも1぀の远加のAPI呌び出しを行うこずにより、これを同期的に実行したす。CronJobの数が特定の数を超えるず、これらのAPI呌び出しはクラむアント偎の制玄を受け始めたす。 10秒のポヌリングサむクルずクラむアント偎のAPI呌び出しにより、CronJobの起動遅延が倧幅に増加したす。



cronjobcontroller'







cronを䜿甚したポッドのスケゞュヌリング



cronスケゞュヌルの性質䞊、それらのほずんどは分の始めに実行されたすXXYY00。たずえば、@hourly毎時cronは010000、020000などに実行されたす。 1時間ごず、15分ごず、5分ごずなど、倚数のcronが実行されおいるマルチテナントcronプラットフォヌムの堎合、耇数のcronが開始されるずボトルネック ホットスポットが発生したす。同時に。 Lyftの私たちは、そのような堎所の1぀が時間の始たりXX0000であるこずに気づきたした。これらのホットスポットは、次のようなcronゞョブの実行に関わる制埡局のコンポヌネントで芁求の頻床を制限する远加の負荷や鉛、䜜成kube-schedulerおよびkube-apiserver、スタヌトアップ遅延の顕著な増加に぀ながるし。



さらに、ピヌク負荷の凊理胜力をプロビゞョニングせずおよび/たたはクラりドサヌビスのコンピュヌティングむンスタンスを䜿甚、代わりにクラスタヌ自動スケヌリングメカニズムを䜿甚しおノヌドを動的にスケヌリングする堎合、ノヌドの起動にかかる時間は起動埅ち時間にさらに寄䞎したす。ポッドCronJob。



ポッドの起動ヘルパヌコンテナ



CronJobポッドが正垞にスケゞュヌルされるkubeletず、埌者はすべおのサむドカヌずアプリケヌション自䜓のコンテナむメヌゞをフェッチしお実行する必芁がありたす。Lyftでのコンテナの起動の詳现サむドカヌコンテナはアプリケヌションコンテナの前に起動したすにより、サむドカヌの起動の遅延は必然的に結果に圱響を䞎え、タスクの開始がさらに遅延したす。



したがっお、必芁なアプリケヌションコヌドを実行する前の起動時の遅延は、マルチテナント環境での倚数のCronJobず盞たっお、目立っお予枬できない起動遅延に぀ながりたす。少し埌で説明したすが、実際には、このような遅延はCronJobの動䜜に悪圱響を及がし、起動を逃す恐れがありたす。



コンテナのクラッシュ凊理



䞀般に、cronの動䜜に泚意を払うこずをお勧めしたす。 Unixシステムの堎合、これはかなり簡単です。 Unixクロヌンは、指定されたシェルを䜿甚しお指定されたコマンドを解釈し$SHELL、コマンドが終了した埌成功したかどうかに関係なく、その特定の呌び出しは完了したず芋なされたす。次のような簡単なスクリプトを䜿甚しお、Unixでのcronの実行を远跡できたす。



#!/bin/sh

my-cron-command
exitcode=$?

if [[ $exitcode -ne 0 ]]; then
    # stat-and-log is pseudocode for emitting metrics and logs
    stat-and-log "failure"
else
    stat-and-log "success"
fi

exit $exitcode


Unixの堎合、cronstat-and-logは、$exitcode。に関係なく、cron呌び出しごずに1回だけ実行されたす。したがっお、これらのメトリックを䜿甚しお、倱敗した呌び出しに関する最も単玔な通知を敎理できたす。



倱敗に察する再詊行がデフォルトで定矩されおおり、倱敗自䜓がさたざたな理由ゞョブの倱敗たたはコンテナヌの倱敗によっお匕き起こされる可胜性があるCronJob Kubernetesの堎合、監芖はそれほど単玔で単玔ではありたせん。



倱敗時に再起動するように構成されたこずが到達するたでアプリケヌションコンテナにし、ゞョブず同様のスクリプトを䜿甚するず、cronゞョブは、プロセスでのメトリックずログを生成し、倱敗したずきにタスクを実行しようずBackoffLimitを最倧再詊行回数。したがっお、問題の原因を特定しようずする開発者は、倚くの䞍芁な「ゎミ」を敎理する必芁がありたす。さらに、最初の倱敗に応答するシェルスクリプトからのアラヌトは、アプリケヌションコンテナがそれ自䜓でタスクを回埩しお正垞に完了するこずができるため、それ以䞊のアクションに基づくこずができない通垞のノむズである可胜性もありたす。



アラヌトは、アプリケヌションコンテナレベルではなく、ゞョブレベルで実装できたす。このために、kube_job_status_failedからなど、ゞョブの倱敗に関するAPIレベルのメトリックを䜿甚できたすkube-state-metrics。このアプロヌチの欠点は、ゞョブが「最終的な障害段階」に達しお制限BackoffLimitに達した埌にのみ、圓盎の゚ンゞニアが問題に気付くずいうこずです。これは、アプリケヌションコンテナの最初の障害よりもはるかに遅く発生する可胜性がありたす。



CronJob'



倧幅な開始遅延ず再起動サむクルにより、远加の遅延が発生し、KubernetesCronJobの再実行が劚げられる可胜性がありたす。頻繁に呌び出されるCronJobの堎合、たたは実行時間がアむドル時間よりも倧幅に長いCronJobの堎合、この远加の遅延により、次にスケゞュヌルされた呌び出しで問題が発生する可胜性がありたす。 CronJobに同時実行ConcurrencyPolicy: Forbidを犁止するポリシヌがある堎合、遅延により、将来の呌び出しが時間どおりに完了せず、遅延したす。





特定の1時間ごずのCronJobでstartingDeadlineSecondsを超えるタむムラむンの䟋cronjobcontrollerの芳点からスケゞュヌルされた開始をスキップし、次のスケゞュヌルされた時間たで呌び出されたせん



CronJobが呌び出しを完党にスキップできるため、より䞍快なシナリオもありたすLyftで発生したしたstartingDeadlineSeconds。これは、CronJobがむンストヌルされおいる堎合です。このシナリオでは、起動遅延がを超えるstartingDeadlineSecondsず、CronJobは完党に起動をスキップしたす。



さらに、ConcurrencyPolicyCronJobがに蚭定されおいる堎合Forbid、前の呌び出しのrestart-on-failure-cycleも次のCronJob呌び出しに干枉する可胜性がありたす。



実䞖界の条件でKubernetesCronJobを操䜜する際の問題



繰り返しのカレンダヌタスクをKubernetesに移行し始めお以来、CronJobメカニズムを倉曎せずに䜿甚するず、開発者の芳点からもプラットフォヌムチヌムの芳点からも、䞍快な瞬間が発生するこずがわかっおいたす。残念ながら、圌らは私たちが最初にKubernetesCronJobを遞んだ利点ず利点を吊定し始めたした。開発者もプラットフォヌムチヌムも、CronJobを掻甚し、耇雑なラむフサむクルを理解するために必芁なツヌルを自由に䜿甚できないこずにすぐに気付きたした。



開発者はCronJobを利甚しお構成しようずしたしたが、その結果、次のような倚くの苊情や質問が寄せられたした。



  • cronが機胜しないのはなぜですか
  • cronが機胜しなくなったようです。実際に実行されおいるこずをどのように確認できたすか
  • cronが機胜しおいないこずを知らなかったので、すべお問題ないず思いたした。
  • 欠萜しおいるcronを「修正」するにはどうすればよいですかSSHログむンだけでコマンドを自分で実行するこずはできたせん。
  • このcronがXからYたでの耇数の実行を芋逃したように芋える理由を教えおください。
  • X倚数のcronがあり、それぞれに独自の通知があり、それらすべおを維持するのはかなり面倒で困難になりたす。
  • ポッド、ゞョブ、サむドカヌ-これはどのようなナンセンスですか


プラットフォヌムチヌムずしお、次のような質問に答えるこずができたせんでした。



  • Kubernetes cronプラットフォヌムのパフォヌマンスを定量化する方法は
  • 远加のCronJobを有効にするず、Kubernetes環境にどのような圱響がありたすか
  • Kubernetes CronJob' ( multi-tenant) single-tenant cron' Unix?
  • Service-Level-Objectives (SLOs — ) ?
  • , , , ?


CronJobのクラッシュのデバッグは簡単な䜜業ではありたせん。障害が発生する堎所ず蚌拠を探す堎所を理解するには、倚くの堎合、盎感が必芁です。これらの手がかりを取埗するのが非垞に難しい堎合がありたす。たずえば、cronjobcontroller'高レベルの詳现が有効になっおいる堎合にのみ蚘録されるログなどです。さらに、トレヌスは䞀定期間埌に単玔に消えるこずがありたす。これにより、デバッグはゲヌム「Kick a mol」これに぀いお-箄Transl。ず同様になりたす。たずえば、CronJob'ov、Job'ov、Pod'ovのKubernetesむベントデフォルトでは1時間だけ保持されたす。これらの方法はどれも䜿いやすく、プラットフォヌム䞊のCronJobの数が増えるに぀れお、サポヌトの面でうたく拡匵できるものはありたせん。



たた、時々Kubernetesだけ実行を逃した回数が倚すぎるず、CronJobの実行を停止したす。この堎合、手動で再起動する必芁がありたす。では実際の生掻、これは、はるかに頻繁にあなたが想像するかもしれないより発生し、手動で問題を毎回修正する必芁性が非垞に苊しくなりたす。



これで、忙しいプロゞェクトでKubernetesCronJobを䜿甚したずきに発生した技術的および運甚䞊の問題に぀いお詳しく説明したした。第2郚では、スタック内のKubernetesを排陀し、䜿いやすさを向䞊させ、CronJobの信頌性を向䞊させた方法に぀いお説明したす。



パヌト2。はじめに



Kubernetes CronJobは、倉曎されおいないので、Unixの察応するものの単玔で䟿利な代替品にはなり埗ないこずが明らかになりたした。すべおのクロヌンを自信を持っおKubernetesに転送するには、CronJobの技術的な欠点を取り陀くだけでなく、それらの䜿いやすさを向䞊させる必芁がありたした。すなわち



1。開発者の話を聞いお、圌らが最も心配しおいるクロヌンに぀いおの質問に察する答えを理解したす。䟋私のcronは開始されたしたかアプリケヌションコヌドは実行されたしたか起動は成功したしたか cronはどのくらい実行されたしたか アプリケヌションコヌドにはどのくらい時間がかかりたしたか 2。CronJobをより理解しやすくし、ラむフサむクルをより透過的にし、プラットフォヌムずアプリケヌションの境界を明確にするこずで、



プラットフォヌムのメンテナンスを簡玠化したす。



3.プラットフォヌムに暙準のメトリックずアラヌトを远加しお、カスタムアラヌト構成の量を枛らし、開発者が䜜成および維持する必芁のある重耇するcronバむンディングの数を枛らしたす。



4.簡単なクラッシュリカバリず新しいCronJob構成のテストのためのツヌルを開発したす。



5.修正するために手動の介入を必芁ずし、1぀の重倧な障害シナリオstartingDeadlineSecondsが蚭定されおいない堎合でクラッシュを匕き起こすTooManyMissedStartsバグなど、Kubernetesの長幎の技術的問題を修正したす。



決定



これらすべおの問題を次のように解決したした。



  1. (observability). CronJob', (Service Level Objectives, SLOs) .
  2. CronJob' « » Kubernetes.
  3. Kubernetes.


CronJob'





特定のcronゞョブ監芖するためのプラットフォヌムによっお生成されたダッシュボヌドの䟋



私たちはKubernetesスタックに次のメトリックを远加したが圌らはLyft内のすべおのcronゞョブのために定矩されおいる



1 started.count-このカりンタはされcronゞョブが呌び出されたずきにアプリケヌションコンテナが最初に起動したずきにむンクリメント。 「アプリケヌションコヌドは実行されたしたか」ずいう質問に答えるのに圹立ちたす。 "。



2. {success, failure}.count-これらのカりンタがされおいる特定のcronゞョブコヌルが到達したずきにむンクリメント、端末の状態をであるこず、仕事をその仕事しお、終了したjobcontrollerこずを実行するために、もはや詊行を。圌らは質問に答えたす。「打ち䞊げは成功したしたか "。



3.-scheduling-decision.{invoke, skip}.countこれらのカりンタヌcronjobcontrollerCronJobを呌び出すずきに行われる決定に぀いお知るこずができたす。特に、次skip.countの質問に答えるのに圹立ちたす。「なぜ私のcronが機胜しないのですか"。次のラベルはそのパラメヌタずしお機胜したすreason。



  • reason = concurrencyPolicy-cronjobcontrollerそれ以倖の堎合は、それを砎るため、cronゞョブぞの呌び出しを逃したしたConcurrencyPolicy。
  • reason = missedDeadline-cronjobcontroller指定された呌び出しりィンドりを芋逃したため、CronJobの呌び出しを拒吊したした.spec.startingDeadlineSeconds。
  • reason = error CronJobを呌び出そうずしたずきに発生する他のすべおの゚ラヌに共通のパラメヌタヌです。


4.-app-container-duration.secondsこのタむマヌは、アプリケヌションコンテナの寿呜を枬定したす。これは、次の質問に答えるのに圹立ちたす。「アプリケヌションコヌドはどのくらい実行されたしたか "。このタむマヌでは、ポッドのスケゞュヌリング、サむドカヌコンテナの起動などに必芁な時間は、プラットフォヌムチヌムの責任であり、起動遅延に含たれおいるため、意図的に含めおいたせん。



5.-start-delay.secondsこのタむマヌは開始遅延を枬定したす。このメトリックをプラットフォヌム党䜓で集蚈するず、それを維持する゚ンゞニアは、プラットフォヌムのパフォヌマンスを評䟡、監芖、調敎するだけでなく、起動遅延や最倧cronスケゞュヌル頻床などのパラメヌタヌのSLOを決定するための基瀎ずしおも機胜したす。



これらの指暙に基づいお、デフォルトのアラヌトを䜜成したした。次の堎合に開発者に通知したす。



  • 圌らのCronJobはスケゞュヌルどおりに開始されたせんでしたrate(scheduling-decision.skip.count) > 0;
  • 圌らのCronJobは倱敗したしたrate(failure.count) > 0。


開発者は、Kubernetesのクロヌンに察しお独自のアラヌトずメトリックを定矩する必芁がなくなりたした。プラットフォヌムは既補の察応物を提䟛したす。



必芁に応じおcronを実行する



kubectl create job test-job --from=cronjob/<your-cronjob>内郚CLIツヌルに 適合させたした。Lyftの゚ンゞニアは、これを䜿甚しおKubernetesのサヌビスず察話し、必芁に応じおCronJobを呌び出したす。



  • 断続的なCronJobクラッシュからの回埩。
  • runtime- , 3:00 ( , CronJob', Job' Pod' ), — , ;
  • runtime- CronJob' Unix cron', , .


TooManyMissedStarts



TooManyMissedStartsのバグ を修正し、 100回連続しお開始を逃した埌にCronJobが「ハング」しないようにしたした。このパッチを䜿甚するず、手動で介入する必芁がなくなるだけでなく、時間を超えたずきに実際に远跡するこずもできたす。おかげVallery Lancey蚭蚈、このパッチ、構築するためのトムWanielistaアルゎリズムの蚭蚈を支揎するために。このパッチをメむンのKubernetesブランチに提䟛するためにPRを開始したしたただし、採甚されるこずはなく、非アクティブのために終了したした-箄Transl。。startingDeadlineSeconds



cronモニタリングの実装





Kubernetes CronJobのラむフサむクルのどの段階で、メトリックを゚クスポヌトするためのメカニズムを远加したした



cronスケゞュヌルに䟝存しないアラヌト



逃したcron呌び出し通知を実装する䞊で最も難しい郚分は、スケゞュヌルを凊理するこずですcrontab.guruはそれらを解読するのに圹立ちたした。たずえば、次のスケゞュヌルに぀いお考えおみたす。



#   5 
*/5 * * * *


このcronのカりンタヌは、終了するたびにむンクリメントできたすたたはcronバむンディングを䜿甚したす。次に、通知システムで、「過去60分間を芋お、カりンタヌの増加が12未満かどうかを知らせおください」ずいう圢匏の条件匏を蚘述できたす。問題は解決したしたよね



しかし、スケゞュヌルが次のようになっおいる堎合はどうなりたすか。



#       9  17
#        .
#  ,    (9-17, -)
0 9–17 * * 1–5


この堎合、条件をいじくり回す必芁がありたすただし、システムに営業時間のみの通知機胜がある堎合もありたすか。ずはいえ、これらの䟋は、通知をcronスケゞュヌルにバむンドするこずにはいく぀かの欠点があるこずを瀺しおいたす。



  1. スケゞュヌルを倉曎する堎合は、通知ロゞックを倉曎する必芁がありたす。
  2. 䞀郚のcronスケゞュヌルでは、時系列を䜿甚しお耇補するために非垞に耇雑なク゚リが必芁です。
  3. 誀怜知を最小限に抑えるために、正確に時間内に䜜業を開始しないクロヌンには、ある皮の「埅機期間」が必芁です。


ステップ2だけでは、プラットフォヌム䞊のすべおのクロヌンに察しおデフォルトで通知を生成するこずは非垞に困難なタスクになりたす。ステップ3は、起動遅延が重芁な芁玠であるKubernetesCronJobのような分散プラットフォヌムに特に関係がありたす。さらに、「デッドマンスむッチ」を䜿甚する゜リュヌションがありたす。これにより、通知をcronのスケゞュヌルにバむンドする必芁がありたす。たた、異垞怜出アルゎリズムでは、トレヌニングが必芁で、新しいCronJobやその倉曎に察しおすぐには機胜したせん。タむムテヌブル。



問題を調べる別の方法は、自分自身に問いかけるこずです。cronが開始されるべきだったのに、開始されなかったずはどういう意味ですか



Kubernetesでは、バグを忘れた堎合cronjobcontroller'たたは、コントロヌルプレヌン自䜓の萜䞋の可胜性ただし、クラスタヌの状態を正しく远跡するずすぐに確認できたす-これはcronjobcontroller、CronJobがcronのスケゞュヌルに埓っお呌び出す必芁があるこずを評䟡および決定したこずを意味したすが、䜕らかの理由で故意にしないこずにした理由で。



おなじみのように聞こえたすかこれはたさに私たちのメトリックが行うこずscheduling-decision.skip.countですここで、倉曎を远跡しrate(scheduling-decision.skip.count)お、CronJobがトリガヌされるべきであるこずをナヌザヌに通知する必芁がありたすが、トリガヌされたせんでした。



この゜リュヌションは、cronスケゞュヌルを通知自䜓から切り離し、いく぀かの利点を提䟛したす。



  • これで、スケゞュヌルを倉曎するずきにアラヌトを再構成する必芁がなくなりたした。
  • 耇雑な時間の芁求や条件は必芁ありたせん。
  • プラットフォヌム䞊のすべおのCronJobのデフォルトアラヌトを簡単に生成できたす。


これを、前述の他の時系列およびアラヌトず組み合わせるず、CronJobの状態のより完党で理解しやすい図を䜜成するのに圹立ちたす。



開始遅延タむマヌの実装



CronJobのラむフサむクルは耇雑であるため、このメトリックを確実か぀正確に枬定するには、スタック䞊のツヌルキットの配眮の特定のポむントを慎重に怜蚎する必芁がありたした。その結果、すべおは2぀の時点を修正するこずになりたした。



  • T1cronをい぀開始する必芁があるかスケゞュヌルに埓っお。
  • T2アプリケヌションコヌドが実際に実行を開始したずき。


この堎合start delay開始遅延= 2 — 1。瞬間T1を修正するために、のcron呌び出しロゞックにコヌドを含めたしたcronjobcontroller'。CronJobが呌び出されたずき.metadata.Annotationにcronjobcontroller䜜成するJobオブゞェクトのように、予想される開始時間を蚘録したす。通垞のリク゚ストを䜿甚しお、任意のAPIクラむアントを䜿甚しお取埗できるようになりたしたGET Job。



T2ではすべおがより耇雑であるこずが刀明したした。倀をできるだけ実際に近づける必芁があるため、T2は、アプリケヌションを含むコンテナヌが初めお起動された瞬間ず䞀臎する必芁がありたす。いずれかでT2を撃った堎合コンテナの起動時再起動を含む、この堎合の起動の遅延には、アプリケヌション自䜓の実行時間が含たれたす。したがっお、.metadata.Annotation特定のゞョブのアプリケヌションコンテナが最初にステヌタスを受け取ったこずがわかったずきはい぀でも、別のゞョブオブゞェクトを割り圓おるこずにしたしたRunning。したがっお、本質的に、分散ロックが䜜成され、このゞョブのアプリケヌションコンテナの将来の開始は無芖されたした最初の開始の瞬間のみが保存されたした。



結果



新しい機胜を展開しおバグを修正した埌、開発者から倚くの肯定的なフィヌドバックを受け取りたした。珟圚、開発者はKubernetesCronJobプラットフォヌムを䜿甚しおいたす。



  • 独自の監芖ツヌルやアラヌトに぀いお困惑する必芁がなくなりたした。
  • , CronJob' , .. alert' , ;
  • CronJob' , CronJob' « »;
  • ( app-container-duration.seconds).


さらに、プラットフォヌムメンテナンス゚ンゞニアは、ナヌザヌ゚クスペリ゚ンスずプラットフォヌムパフォヌマンスを枬定するための新しいパラメヌタ開始遅延を利甚できるようになりたした。



最埌にそしおおそらく私たちの最倧の勝利、CronJobおよびその状態をより透過的で远跡可胜にするこずで、開発者ずプラットフォヌム゚ンゞニアのデバッグプロセスを倧幅に簡玠化したした。同じデヌタを䜿甚しお䞀緒にデバッグできるようになったため、開発者が自分で問題を芋぀け、プラットフォヌムが提䟛するツヌルを䜿甚しお問題を解決するこずがよくありたす。



結論



分散されたスケゞュヌルされたタスクの調敎は簡単ではありたせん。CronJob Kubernetesは、それを敎理する1぀の方法にすぎたせん。CronJobは理想からはほど遠いものの、グロヌバルプロゞェクトで䜜業する胜力は十分にありたす。もちろん、芳察可胜性の向䞊、障害の原因ず詳现の理解、䜿いやすさを向䞊させるツヌルの远加など、時間ず劎力をかけお改善する準備ができおいる堎合です。



泚CronJobの欠点を修正し、曎新されたバヌゞョンをGAに倉換するためのオヌプンなKubernetes拡匵提案KEPがありたす。この䞀連の蚘事のレビュヌに協力しお



くれたRithuJohn、Scott Lau、Scarlett Perry、Julien Silland、TomWanielistaに感謝したす。



翻蚳者からのPS



私たちのブログも読んでください






All Articles