初心者でもわかるKubernetes Scheduler拡張の全てとその最前線
by
196Ikuchil
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
初心者でもわかるKubernetes Scheduler拡張の全てと その最前線 Kensei Nakada / Ikumu Kakinuma
Slide 2
Slide 2 text
Kensei Nakada Platform Engineer @ Mercari Kubernetes SIG-Scheduling approver その他、Kube-scheduler-simulator, Kube-scheduler-wasm-extentionのownerとして 活動 2
Slide 3
Slide 3 text
Ikumu Kakinuma Software Engineer @ Infcurion Kube-scheduler-simulator approver 普段はGoを書きながら カード決済周りのお仕事をしています 3
Slide 4
Slide 4 text
本日話すこと 1. Kubernetes Scheduler とは何者なのか ➢ Schedulerの役割とアーキテクチャ 2. Schedulingをどのように自分好みにコントロール/カスタマイズするか ➢ デフォルト機能の利用 ➢ Schedulerの拡張 3. Schedulingをいかに上手くコントロールするか ➢ scheduling_perf ➢ kube-scheduler-simulator 4
Slide 5
Slide 5 text
What’s Scheduler? 5
Slide 6
Slide 6 text
Pod・Nodeとは Kubernetes上の抽象的な概念 Pod … 一つ以上のコンテナの集まり Node … コンテナが実際に動くVM or 物理マシン Podを作成すると、どこかいい感じのNodeでそのPodが 動き出す 6
Slide 7
Slide 7 text
Podが作成されてからNodeで動き出すまで NodeA NodeB NodeC Podを作成 7
Slide 8
Slide 8 text
Podが作成されてからNodeで動き出すまで 行き先決まっ てないPodあ るやん NodeA NodeB NodeC SchedulerはPodが 作成されたことに気 がつく 👀 8
Slide 9
Slide 9 text
Podが作成されてからNodeで動き出すまで こいつはNodeA で実行するのが ええわ NodeA NodeB NodeC SchedulerがPodをど このNodeで実行す るか決める 9
Slide 10
Slide 10 text
Podが作成されてからNodeで動き出すまで わしのPod やないかい NodeA NodeB NodeC Kubeletが自身の Nodeで実行されるべ きPodに気がつく 👀 10
Slide 11
Slide 11 text
Podが作成されてからNodeで動き出すまで 実行せな NodeA NodeB NodeC Podが実行される 11
Slide 12
Slide 12 text
Schedulerのお仕事 Podが実際にどのNodeで動作するかを決定する内部のコンポーネント - リソースの使用状況 - CPUが足りないNodeにはPodをScheduleしない - リソースが多く余っているNodeを優先する - Podの分散具合 - とあるNodeに同じWorkloadが集まっているので、別のNodeを優先する - etc Schedulingには色々な要因が絡んでいる 12
Slide 13
Slide 13 text
Scheduling Framework スケジューラーのアーキテクチャ ● 機能・目的ごとに拡張点が存在し、プラグインとして機能を差し込み可能 ● スケジューリングのロジックをプラグインという単位で分割 ○ e.g.) NodeAffinity, PodTopologySpread, ... ● プラグインは一つ以上の拡張点で動作 13
Slide 14
Slide 14 text
Scheduling Framework 14
Slide 15
Slide 15 text
Scheduling Framework スケジューラーのアーキテクチャ ● 機能・目的ごとに拡張点が存在し、プラグインとして機能を登録可能 ● スケジューリングのロジックをプラグインという単位で分割 ○ e.g.) NodeAffinity, PodTopologySpread, ... ● プラグインは一つ以上の拡張点で動作 15
Slide 16
Slide 16 text
Scheduling Framework - Filter 役割:Podを実行できない(したくない)Nodeを候補から除外する 例えば… ・リソース不足でPodが実行できないNode ・nodeSelectorの条件に一致しないNode を除外する 16
Slide 17
Slide 17 text
17
Slide 18
Slide 18 text
× × 何かしらの観点でNodeを フィルタリングする 18
Slide 19
Slide 19 text
Scheduling Framework - Score 役割:残った候補のNodeをスコアリングする。 例えば… ・全体のNodeのリソース使用量のバランスがちょうど良くなるNodeを優先 ・Podを実行するコンテナイメージをすでに持っているNodeを優先 19
Slide 20
Slide 20 text
× × 20
Slide 21
Slide 21 text
何かしらの観点でNodeをスコ アリングする × × 21
Slide 22
Slide 22 text
80 60 Node2が最終的に 選ばれる × × 22
Slide 23
Slide 23 text
Scheduling Framework このような形で1つのPodに対して適切なNodeを選んでいく 23
Slide 24
Slide 24 text
× × 何かしらの観点でNodeを フィルタリングする × × × × もしこの段階で候補のNodeが全滅した場合🤔 → Preemptionする → 諦める (Unscheduled) 24
Slide 25
Slide 25 text
Preemption スケジューラーがPodをスケジューリングできないときに、優先度の低いPodをプリエン プトする(追い出す)ことを試みる Priority 300 Priority 500 Priority 100 Priority 300 Priority 200 あいつ追い出せば スケジュール できるやん スケジューリング中 Pod 25
Slide 26
Slide 26 text
Scheduling Framework PreemptionのロジックもPluginとして実装されている 26
Slide 27
Slide 27 text
Schedulingをコントロールする 27
Slide 28
Slide 28 text
Schedulingのコントロール方法 大枠 仕様・機能名 備考 デフォルトの Schedulerの機能 PodのSpec上でSchedulingの指 定を行う Pod単位での設定 KubeSchedulerConfiguration scheduler自身の設定ファイル Scheduler自体の拡 張 Extender Webhook経由で任意処理を差し込む Plugin scheduler自体に任意処理を差し込む WebAssembly (WIP) wasmにコンパイルした任意処理を scheduler自体に差し込む 28
Slide 29
Slide 29 text
デフォルトのSchedulerの機能を使用する Schedulerには「弱い」制約と「強い」制約がある NodeAffinityを例とすると.. - 弱い制約 - 優先条件を記述する - preferredDuringSchedulingIgnoredDuringExecution - 強い制約 - 絶対条件を記述する - requiredDuringSchedulingIgnoredDuringExecution 29
Slide 30
Slide 30 text
機能を使用するようPodに設定する PodのspecにどのようなNodeにスケジュールしたいか明記し、Podを生 成する 30
Slide 31
Slide 31 text
Kube Scheduler Configuration KubeSchedulerConfigurationとは、Schedulerの設定ファイル 🤔 <「プラグインの振る舞いをちょっと変えたい…」 → KubeSchedulerConfiguration上に設定項目が存在する可能性があります 31
Slide 32
Slide 32 text
Kube Scheduler Configuration - MultiPoint 差し込んだプラグインを一括で有効化/無効化する 32 MultiPoint 個別設定
Slide 33
Slide 33 text
Kube Scheduler Configuration 拡張点 個別設定 33
Slide 34
Slide 34 text
俺のやりたいSchedulingが実現できない… 34
Slide 35
Slide 35 text
Scheduler自体を拡張する 独自のロジックをいずれかの方法で実装して、組み込む 大枠 仕様・機能名 備考 デフォルトの Schedulerの機能 PodのSpec上でSchedulingの指定 を行う Pod単位での設定 KubeSchedulerConfiguration scheduler自身の設定ファイル Scheduler自体の拡 張 Extender Webhook経由で任意処理を差し込む Plugin scheduler自体に任意処理を差し込む WebAssembly (WIP) wasmにコンパイルした任意処理を scheduler自体に差し込む 35
Slide 36
Slide 36 text
Extender 歴史のあるWebhookベースの拡張 スケジューリング処理中の特定のタイミングで呼び出される - Filter: Scheduling FrameworkのFilterに相当 - Prioritize: Scheduling FrameworkのScoreに相当 - Preempt: Scheduling FrameworkのPostFilterに相当 - Bind: Scheduling FrameworkのBindに相当 36
Slide 37
Slide 37 text
Extender メリット: - Schedulerをビルドし直す必要がない! デメリット: - パフォーマンス、エラーハンドリング等にかなり難あり - Scheduling Frameworkと比較して拡張性が乏しい 37
Slide 38
Slide 38 text
Plugin (Scheduling Framework) Scheduling Frameworkに則って自分で作成したPluginをSchedulerに組み込む メリット: - パフォーマンス良い。拡張性も高い。 デメリット: - Schedulerをビルドし直す必要がある - クラスター上に既存のSchedulerを無効にする必要がある 38
Slide 39
Slide 39 text
Pluginを自作する 1. 各拡張点ごとに用意されたInterfaceを満たす形で独自Pluginを実装 2. Schedulerに組み込み、ビルドし直す 3. KubeSchedulerConfigurationで有効化 Interface定義: https://github.com/kubernetes/kubernetes/blob/release-1.27/pkg/scheduler/framework/interface.go#L293-L50 5 39
Slide 40
Slide 40 text
PreScore + Score 実装例 40
Slide 41
Slide 41 text
PreScore + Score 実装例 41
Slide 42
Slide 42 text
PluginをSchedulerに組み込む 42
Slide 43
Slide 43 text
Configuration上で有効にする 43
Slide 44
Slide 44 text
scheduler-plugins コミュニティでメンテしているCustom Plugin達 44
Slide 45
Slide 45 text
scheduler-plugins 45
Slide 46
Slide 46 text
WebAssembly 46
Slide 47
Slide 47 text
WebAssembly WebAssembly(Wasm) - 様々な言語からコンパイル可能なバイナリフォーマット 元々はWebブラウザの文脈で耳にすることが多かったが… 47
Slide 48
Slide 48 text
EnvoyにおけるWasm拡張 48
Slide 49
Slide 49 text
Scheduler ❤ WebAssembly WasmによるSchedulerの拡張が提案 → Extenderの「遅い」「拡張性に乏しい」問題と、 Pluginの「Schedulerのビルドめんどい」問題を解決を目指している 49
Slide 50
Slide 50 text
PreScore + Score 実装例 50
Slide 51
Slide 51 text
PreScore + Score 実装例 51
Slide 52
Slide 52 text
WebAssembly プラグインはWebAssembly(.wasmファイル)としてコンパイルする。 ↓ SchedulerはWebAssemblyにコンパイルされたプラグインを読み込み、 通常のプラグインのように各拡張点で呼び出す 52
Slide 53
Slide 53 text
WebAssembly メリット - Schedulerをビルドし直す必要がない - Extenderよりオーバーヘッドがかなり少ない デメリット - Pluginと比較すると流石にオーバーヘッドがある 53
Slide 54
Slide 54 text
WebAssembly メリット - Schedulerをビルドし直す必要がない - Extenderよりオーバーヘッドがかなり少ない デメリット - Pluginと比較すると流石にオーバーヘッドがある → Extender vs Plugin vs Wasm のパフォーマンスは実際どのくらい違うのか 54
Slide 55
Slide 55 text
パフォーマンス比較 Plugin: めっちゃ早い 55
Slide 56
Slide 56 text
パフォーマンス比較 Wasm: 一つ入れると倍くらい時間がか かる 56
Slide 57
Slide 57 text
パフォーマンス比較 Extender: 一つ入れると10倍超くらい時間 がかかる 😓 57
Slide 58
Slide 58 text
Schedulingをいかに 上手くコントロールするか 58
Slide 59
Slide 59 text
難しさ 正しいScheduling指定やSchedulerの拡張は難しい - 本当にやりたいSchedulingがそれで表現できている? - その拡張の実装、コーナーケース拾い切れている? - その拡張入れてもパフォーマンス大丈夫? 59
Slide 60
Slide 60 text
難しさ - Schedulerは単一障害点 - Schedulerはブラックボックス 60
Slide 61
Slide 61 text
Schedulerは単一障害点 基本的にClusterにつきSchedulerは一つ Schedulerが遅くなるとクラスター上の全Podのスケジュールが遅くなる = クラスターのスケーラビリティに頭打ちが来やすくなる 61
Slide 62
Slide 62 text
Schedulerが遅いと.. すまん..... 頑張っているん だが.. NodeA NodeB NodeC 62 … はよせい 💦
Slide 63
Slide 63 text
Schedulerはブラックボックス Schedulerは多くのPluginからの意見を集めてPodの行き先を決める ↓ Scheduling指定やPluginの実装にミスがあっても気がつきにくい (特にPreferredなScheduling制約) 63
Slide 64
Slide 64 text
80 60 × × 64
Slide 65
Slide 65 text
65 ? 選出
Slide 66
Slide 66 text
scheduler_perf 実際のKubernetes内で使用されているSchedulerのテスト パフォーマンスを比較することで、デグレがないかを把握できる 例: https://github.com/kubernetes-sigs/kube-scheduler-wasm-extension/pull/63 66
Slide 67
Slide 67 text
先ほどのPluginのスライド Plugin: めっちゃ早い 67
Slide 68
Slide 68 text
kube-scheduler-simulator 68
Slide 69
Slide 69 text
kube-scheduler-simulator 大きく3つの要素で構成 - Debuggable Scheduler - Kube apiserver (fake) + 色々controllers - Web UI 69
Slide 70
Slide 70 text
Debuggable Scheduler - 通常のSchedulerと同じようにスケジュールを行う - 通常のSchedulerと同じようにCustom Pluginも刺せる - PodにはSchedulingの詳細な結果が付く - Podには過去のSchedulingの履歴も付く 70
Slide 71
Slide 71 text
Debuggable Scheduler - 通常のSchedulerと同じようにスケジュールを行う - 通常のSchedulerと同じようにCustom Pluginも刺せる - PodにはSchedulingの詳細な結果が付く - Podには過去のSchedulingの履歴も付く 71
Slide 72
Slide 72 text
72
Slide 73
Slide 73 text
各FilterPluginの結果 73
Slide 74
Slide 74 text
過去のPlugin結果の履歴 74
Slide 75
Slide 75 text
75
Slide 76
Slide 76 text
Kube apiserver (fake) + Web UI Debuggable Schedulerだけだとシュッと使いにくいので、 シュッと扱いやすくするための周辺ツールが存在 76
Slide 77
Slide 77 text
Kube apiserver (fake) + Web UI 裏でkube-apiserver(fake)と Debuggable Schedulerが動いてる 77
Slide 78
Slide 78 text
Kube apiserver (fake) + Web UI 78
Slide 79
Slide 79 text
79
Slide 80
Slide 80 text
まとめ カスタマイズ・デバッグのために以下について紹介しました! Schedulerのカスタマイズ・拡張 - Schedulerデフォルト機能(デフォルトプラグイン) - Kube Scheduler Configuration - Extender - Plugin - Wasm テスト・デバッグツール - scheduler_perf - kube-scheduler-simulator 80
Slide 81
Slide 81 text
Enjoy happy scheduling life! 81
Slide 82
Slide 82 text
We are hiring!! 株式会社インフキュリオン: カード決済・コード決済サービスを一緒に作っていく仲間を 大募集しています! 株式会社メルカリ: メルカリでは、大量のマイクロサービスを下から支え ているPlatformを開発する仲間を募集しています! 82
Slide 83
Slide 83 text
質問は直接でもTwitter等でも お気軽に! @sanpo_shiho, @196Ikuchil 83
Slide 84
Slide 84 text
84
Slide 85
Slide 85 text
kube-scheduler-simulator将来性 / Scenario/benchmarker 想定される数百のpodのschedulingやクラスターの状況をシナリオとして記述し、 schedulerを最適化していける機能(?) シナリオを使いつつ、scheduling_perfのようなパフォーマンステストを実施する機能 が今後導入されさらに実用的になる予定です(思想まで話すか、シナリオについて少し 深掘りするかは、残り時間次第) 85