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