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