猫でもわかる Scheduling Framework #k8sjp / Kubernetes Meetup Tokyo 16th
by
y_taka_23
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
猫でもわかる Scheduling Framework チェシャ猫 (@y_taka_23) Kubernetes Meetup Tokyo #16 (2019/02/19) #k8sjp
Slide 2
Slide 2 text
Scheduler 自作勢の人? #k8sjp
Slide 3
Slide 3 text
変則 Scheduling が欲しいとき ● 奥から詰めて配置したい ○ お金が無いので Node 数を節約したい ● 一度にまとめて配置したい ○ クラスタを構成する Pod が一個だけ取り残される ● 途中で実行を中断されたくない ○ 長時間かかる Job が無駄になる ○ でも場合によっては割込み機能も欲しい #k8sjp
Slide 4
Slide 4 text
開発中の Alternative Scheduler ● kube-batch ○ バッチ処理に特化 ○ All or Nothing のスケジューリングに対応 ○ 実証済み機能が kube-flow に移植されている ● Poseidon ○ Firmament Scheduler の Kubernetes 向け実装 ○ 制約をグラフ上の最小費用流問題に帰着 #k8sjp
Slide 5
Slide 5 text
カスタマイズでは駄目? #k8sjp
Slide 6
Slide 6 text
2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod Goroutines Bind to Node Main Loop #k8sjp
Slide 7
Slide 7 text
2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod Goroutines Bind to Node Main Loop #k8sjp
Slide 8
Slide 8 text
Scheduler Extender ● Webhook による処理の追加 ○ 指定した外部サーバと JSON をやり取り ● 拡張できるポイントは 4 つ ○ Filter - Node の候補を絞る ○ Prioritize - Node の順位付け関数を追加 ○ Preempt - 追い出される Pod の候補を絞る ○ Bind - Pod と Node の紐づけを委譲 #k8sjp
Slide 9
Slide 9 text
Scheduler Extender の不足点 ● 記述できる処理が限定的 ○ 特にエラー時の分岐や中断が難しい ● 実行時のオーバヘッド ○ 外部サーバへの JSON Webhook は遅い ● 情報の使いまわしが効かない ○ 前の拡張点で得られた処理結果 ○ Scheduler 本体が持っているキャッシュ #k8sjp
Slide 10
Slide 10 text
Scheduling Framework #k8sjp
Slide 11
Slide 11 text
#k8sjp
Slide 12
Slide 12 text
Scheduling Framework の目的 ● シンプルなコア機能を抽出 ○ 肥大化しすぎた現在の実装を整理 ● 柔軟に拡張できるプラガブルな設計 ○ Scheduler 再開発の労力を低減 ○ ただし実行速度のためプラグインごとコンパイル ● 情報共有の機構を提供 ○ プラグインが得た結果の再利用を可能に #k8sjp
Slide 13
Slide 13 text
2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod Goroutines Bind to Node Main Loop #k8sjp
Slide 14
Slide 14 text
2 1 3 Per-Pod Goroutines Rank Nodes Filter Nodes Dequeue Preempt Bind to Node Main Loop #k8sjp
Slide 15
Slide 15 text
提案されている 12 個の拡張点 ● メインループ内 ○ Scheduling Queue Sort ○ Pre-Filter, Filter, Post-Filter, Scoring, Post-Scoring ○ Reserve ● 各 Pod ごとに分岐した goroutine 内 ○ Permit, Reject ○ Pre-Bind, Bind, Post-Bind #k8sjp
Slide 16
Slide 16 text
特筆すべき拡張点 ● Scheduling Queue Sort ○ キュー内の Pod が dequeue される順を変更できる ○ Pod の比較結果 (=, <, >) を返す ● Permit / Reject ○ 個別の goroutine 分岐後、Pod を待機させる ○ permit, deny, wait のいずれかを返す ○ reject した場合にはロールバック処理 #k8sjp
Slide 17
Slide 17 text
(というのはあくまで予定) #k8sjp
Slide 18
Slide 18 text
Scheduling Framework の現状 ● プラグインは interface として定義 ● 実装済みの拡張点は 2 個 ○ Reserve - Pod ごとに分岐前にリソースを確認 ○ Pre-Bind - 実際にリソースを確保 ● プラグイン間データ共有は実装済み ○ スレッドセーフな Key-Value Map が使用可 ○ ただしライフタイムは一回のメインループ中のみ #k8sjp
Slide 19
Slide 19 text
Plugin のインタフェース #k8sjp
Slide 20
Slide 20 text
データ共有用のシングルトン #k8sjp
Slide 21
Slide 21 text
まとめ ● 用途に応じたスケジューリングの需要 ○ 従来だとスクラッチ開発が必要 ● 既存実装 + Extender の限界 ○ できる処理が限定的、パフォーマンスに難 ● Scheduler Framework ○ ソースコードレベルで処理を差し込み ○ 現時点では未実装の部分が多く、今後に期待 #k8sjp
Slide 22
Slide 22 text
#k8sjp
Slide 23
Slide 23 text
You Ain’t Scheduled Nothin’ Yet! Presented by チェシャ猫 (@y_taka_23) #k8sjp