Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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