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