猫でもわかる Scheduling Framework #k8sjp / Kubernetes Meetup Tokyo 16th

332f89cc697355902a817506b6995f2b?s=47 y_taka_23
February 19, 2019

猫でもわかる Scheduling Framework #k8sjp / Kubernetes Meetup Tokyo 16th

Kubernetes Meetup Tokyo #16 で使用したスライドです。

Kubernetes を目的特化したユースケースで使用する場合、デフォルトの Scheduler の挙動を変更したくなることはしばしばあります。一方、kube-scheduler の実装は歴史的事情から抽象度が比較的低く、拡張性にも限界が見えてきています。

この問題を解決するために Kubernetes 開発チーム Scheduling SIG では、より柔軟な拡張を可能とする Scheduling Framework が提案されています。本スライドでは、Scheduler の拡張手法として以前から提供されていた Extender Webhook と 新しい Scheduling Framework を比較し、その概要をつかむことを目的としています。

イベント概要:https://k8sjp.connpass.com/event/116799/
録画:https://www.youtube.com/watch?v=mAGmmeylj_4 (2:33:20)
ブログ記事:https://ccvanishing.hateblo.jp/entry/2019/02/22/193916

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

February 19, 2019
Tweet

Transcript

  1. 猫でもわかる Scheduling Framework チェシャ猫 (@y_taka_23) Kubernetes Meetup Tokyo #16 (2019/02/19)

    #k8sjp
  2. Scheduler 自作勢の人? #k8sjp

  3. 変則 Scheduling が欲しいとき • 奥から詰めて配置したい ◦ お金が無いので Node 数を節約したい •

    一度にまとめて配置したい ◦ クラスタを構成する Pod が一個だけ取り残される • 途中で実行を中断されたくない ◦ 長時間かかる Job が無駄になる ◦ でも場合によっては割込み機能も欲しい #k8sjp
  4. 開発中の Alternative Scheduler • kube-batch ◦ バッチ処理に特化 ◦ All or

    Nothing のスケジューリングに対応 ◦ 実証済み機能が kube-flow に移植されている • Poseidon ◦ Firmament Scheduler の Kubernetes 向け実装 ◦ 制約をグラフ上の最小費用流問題に帰着 #k8sjp
  5. カスタマイズでは駄目? #k8sjp

  6. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #k8sjp
  7. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #k8sjp
  8. Scheduler Extender • Webhook による処理の追加 ◦ 指定した外部サーバと JSON をやり取り •

    拡張できるポイントは 4 つ ◦ Filter - Node の候補を絞る ◦ Prioritize - Node の順位付け関数を追加 ◦ Preempt - 追い出される Pod の候補を絞る ◦ Bind - Pod と Node の紐づけを委譲 #k8sjp
  9. Scheduler Extender の不足点 • 記述できる処理が限定的 ◦ 特にエラー時の分岐や中断が難しい • 実行時のオーバヘッド ◦

    外部サーバへの JSON Webhook は遅い • 情報の使いまわしが効かない ◦ 前の拡張点で得られた処理結果 ◦ Scheduler 本体が持っているキャッシュ #k8sjp
  10. Scheduling Framework #k8sjp

  11. #k8sjp

  12. Scheduling Framework の目的 • シンプルなコア機能を抽出 ◦ 肥大化しすぎた現在の実装を整理 • 柔軟に拡張できるプラガブルな設計 ◦

    Scheduler 再開発の労力を低減 ◦ ただし実行速度のためプラグインごとコンパイル • 情報共有の機構を提供 ◦ プラグインが得た結果の再利用を可能に #k8sjp
  13. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #k8sjp
  14. 2 1 3 Per-Pod Goroutines Rank Nodes Filter Nodes Dequeue

    Preempt Bind to Node Main Loop #k8sjp
  15. 提案されている 12 個の拡張点 • メインループ内 ◦ Scheduling Queue Sort ◦

    Pre-Filter, Filter, Post-Filter, Scoring, Post-Scoring ◦ Reserve • 各 Pod ごとに分岐した goroutine 内 ◦ Permit, Reject ◦ Pre-Bind, Bind, Post-Bind #k8sjp
  16. 特筆すべき拡張点 • Scheduling Queue Sort ◦ キュー内の Pod が dequeue

    される順を変更できる ◦ Pod の比較結果 (=, <, >) を返す • Permit / Reject ◦ 個別の goroutine 分岐後、Pod を待機させる ◦ permit, deny, wait のいずれかを返す ◦ reject した場合にはロールバック処理 #k8sjp
  17. (というのはあくまで予定) #k8sjp

  18. Scheduling Framework の現状 • プラグインは interface として定義 • 実装済みの拡張点は 2

    個 ◦ Reserve - Pod ごとに分岐前にリソースを確認 ◦ Pre-Bind - 実際にリソースを確保 • プラグイン間データ共有は実装済み ◦ スレッドセーフな Key-Value Map が使用可 ◦ ただしライフタイムは一回のメインループ中のみ #k8sjp
  19. Plugin のインタフェース #k8sjp

  20. データ共有用のシングルトン #k8sjp

  21. まとめ • 用途に応じたスケジューリングの需要 ◦ 従来だとスクラッチ開発が必要 • 既存実装 + Extender の限界

    ◦ できる処理が限定的、パフォーマンスに難 • Scheduler Framework ◦ ソースコードレベルで処理を差し込み ◦ 現時点では未実装の部分が多く、今後に期待 #k8sjp
  22. #k8sjp

  23. You Ain’t Scheduled Nothin’ Yet! Presented by チェシャ猫 (@y_taka_23) #k8sjp