Upgrade to Pro — share decks privately, control downloads, hide ads and more …

初心者でもわかるKubernetes Scheduler拡張の全てとその最前線

196Ikuchil
August 02, 2023

初心者でもわかるKubernetes Scheduler拡張の全てとその最前線

Kubernetesにおけるスケジューリングをクラスターに合わせて最適化する方法は複数存在しますが、正しい設定には正しい理解が必要で、ハードルが高く見えているのも事実です。
この講演では、Schedulerにおける現在の拡張方法と、今まさに検討されているWasmを通した拡張を紹介します。その上で、最適化に必要なシミュレーターやパフォーマンステストなど周辺ツールの紹介を行います。

#CNDF2023

196Ikuchil

August 02, 2023
Tweet

Other Decks in Technology

Transcript

  1. 初心者でもわかるKubernetes Scheduler拡張の全てと
    その最前線



    Kensei Nakada / Ikumu Kakinuma


    View Slide

  2. Kensei Nakada

    Platform Engineer @ Mercari

    Kubernetes SIG-Scheduling approver


    その他、Kube-scheduler-simulator,
    Kube-scheduler-wasm-extentionのownerとして
    活動

    2

    View Slide

  3. Ikumu Kakinuma

    Software Engineer @ Infcurion

    Kube-scheduler-simulator approver


    普段はGoを書きながら

    カード決済周りのお仕事をしています

    3

    View Slide

  4. 本日話すこと

    1. Kubernetes Scheduler とは何者なのか

    ➢ Schedulerの役割とアーキテクチャ

    2. Schedulingをどのように自分好みにコントロール/カスタマイズするか

    ➢ デフォルト機能の利用

    ➢ Schedulerの拡張

    3. Schedulingをいかに上手くコントロールするか

    ➢ scheduling_perf

    ➢ kube-scheduler-simulator

    4

    View Slide

  5. What’s Scheduler?

    5

    View Slide

  6. Pod・Nodeとは

    Kubernetes上の抽象的な概念

    Pod … 一つ以上のコンテナの集まり

    Node … コンテナが実際に動くVM or 物理マシン


    Podを作成すると、どこかいい感じのNodeでそのPodが
    動き出す

    6

    View Slide

  7. Podが作成されてからNodeで動き出すまで

    NodeA
 NodeB
 NodeC

    Podを作成
    7

    View Slide

  8. Podが作成されてからNodeで動き出すまで

    行き先決まっ
    てないPodあ
    るやん
    NodeA
 NodeB
 NodeC

    SchedulerはPodが
    作成されたことに気
    がつく
    👀

    8

    View Slide

  9. Podが作成されてからNodeで動き出すまで

    こいつはNodeA
    で実行するのが
    ええわ NodeA
 NodeB
 NodeC

    SchedulerがPodをど
    このNodeで実行す
    るか決める

    9

    View Slide

  10. Podが作成されてからNodeで動き出すまで

    わしのPod
    やないかい
    NodeA
 NodeB
 NodeC

    Kubeletが自身の
    Nodeで実行されるべ
    きPodに気がつく

    👀

    10

    View Slide

  11. Podが作成されてからNodeで動き出すまで

    実行せな
    NodeA
 NodeB
 NodeC

    Podが実行される

    11

    View Slide

  12. Schedulerのお仕事

    Podが実際にどのNodeで動作するかを決定する内部のコンポーネント

    - リソースの使用状況

    - CPUが足りないNodeにはPodをScheduleしない

    - リソースが多く余っているNodeを優先する

    - Podの分散具合

    - とあるNodeに同じWorkloadが集まっているので、別のNodeを優先する

    - etc

    Schedulingには色々な要因が絡んでいる
    12

    View Slide

  13. Scheduling Framework

    スケジューラーのアーキテクチャ

    ● 機能・目的ごとに拡張点が存在し、プラグインとして機能を差し込み可能

    ● スケジューリングのロジックをプラグインという単位で分割

    ○ e.g.) NodeAffinity, PodTopologySpread, ...

    ● プラグインは一つ以上の拡張点で動作

    13

    View Slide

  14. Scheduling Framework

    14

    View Slide

  15. Scheduling Framework

    スケジューラーのアーキテクチャ

    ● 機能・目的ごとに拡張点が存在し、プラグインとして機能を登録可能

    ● スケジューリングのロジックをプラグインという単位で分割

    ○ e.g.) NodeAffinity, PodTopologySpread, ...

    ● プラグインは一つ以上の拡張点で動作

    15

    View Slide

  16. Scheduling Framework - Filter

    役割:Podを実行できない(したくない)Nodeを候補から除外する


    例えば…

    ・リソース不足でPodが実行できないNode

    ・nodeSelectorの条件に一致しないNode

    を除外する

    16

    View Slide

  17. 17

    View Slide

  18. ×

    ×

    何かしらの観点でNodeを
    フィルタリングする

    18

    View Slide

  19. Scheduling Framework - Score

    役割:残った候補のNodeをスコアリングする。


    例えば…

    ・全体のNodeのリソース使用量のバランスがちょうど良くなるNodeを優先

    ・Podを実行するコンテナイメージをすでに持っているNodeを優先

    19

    View Slide

  20. ×

    ×

    20

    View Slide

  21. 何かしらの観点でNodeをスコ
    アリングする

    ×

    ×

    21

    View Slide

  22. 80

    60

    Node2が最終的に

    選ばれる

    ×

    ×

    22

    View Slide

  23. Scheduling Framework

    このような形で1つのPodに対して適切なNodeを選んでいく

    23

    View Slide

  24. ×

    ×
 何かしらの観点でNodeを
    フィルタリングする

    ×

    ×

    ×

    ×

    もしこの段階で候補のNodeが全滅した場合🤔

    → Preemptionする

    → 諦める (Unscheduled)

    24

    View Slide

  25. Preemption

    スケジューラーがPodをスケジューリングできないときに、優先度の低いPodをプリエン
    プトする(追い出す)ことを試みる


    Priority

    300

    Priority

    500

    Priority

    100

    Priority

    300

    Priority

    200

    あいつ追い出せば
    スケジュール
    できるやん
    スケジューリング中
    Pod
    25

    View Slide

  26. Scheduling Framework 

    PreemptionのロジックもPluginとして実装されている

    26

    View Slide

  27. Schedulingをコントロールする

    27

    View Slide

  28. Schedulingのコントロール方法

    大枠 仕様・機能名 備考
    デフォルトの
    Schedulerの機能
    PodのSpec上でSchedulingの指
    定を行う
    Pod単位での設定
    KubeSchedulerConfiguration scheduler自身の設定ファイル
    Scheduler自体の拡
    張


    Extender
 Webhook経由で任意処理を差し込む
    Plugin scheduler自体に任意処理を差し込む
    WebAssembly (WIP) wasmにコンパイルした任意処理を
    scheduler自体に差し込む
    28

    View Slide

  29. デフォルトのSchedulerの機能を使用する

    Schedulerには「弱い」制約と「強い」制約がある

    NodeAffinityを例とすると..

    - 弱い制約

    - 優先条件を記述する

    - preferredDuringSchedulingIgnoredDuringExecution 

    - 強い制約

    - 絶対条件を記述する

    - requiredDuringSchedulingIgnoredDuringExecution

    29

    View Slide

  30. 機能を使用するようPodに設定する

    
PodのspecにどのようなNodeにスケジュールしたいか明記し、Podを生
    成する

    30

    View Slide

  31. Kube Scheduler Configuration

    KubeSchedulerConfigurationとは、Schedulerの設定ファイル


    🤔
    <「プラグインの振る舞いをちょっと変えたい…」

    → KubeSchedulerConfiguration上に設定項目が存在する可能性があります

    31

    View Slide

  32. Kube Scheduler Configuration - MultiPoint

    差し込んだプラグインを一括で有効化/無効化する

    32
    MultiPoint
 個別設定


    View Slide

  33. Kube Scheduler Configuration 拡張点 個別設定

    33

    View Slide

  34. 俺のやりたいSchedulingが実現できない…

    34

    View Slide

  35. Scheduler自体を拡張する

    独自のロジックをいずれかの方法で実装して、組み込む

    大枠 仕様・機能名 備考
    デフォルトの
    Schedulerの機能
    PodのSpec上でSchedulingの指定
    を行う
    Pod単位での設定
    KubeSchedulerConfiguration scheduler自身の設定ファイル
    Scheduler自体の拡
    張


    Extender
 Webhook経由で任意処理を差し込む
    Plugin scheduler自体に任意処理を差し込む
    WebAssembly (WIP) wasmにコンパイルした任意処理を
    scheduler自体に差し込む
    35

    View Slide

  36. Extender

    歴史のあるWebhookベースの拡張

    スケジューリング処理中の特定のタイミングで呼び出される


    - Filter: Scheduling FrameworkのFilterに相当

    - Prioritize: Scheduling FrameworkのScoreに相当

    - Preempt: Scheduling FrameworkのPostFilterに相当

    - Bind: Scheduling FrameworkのBindに相当


    36

    View Slide

  37. Extender

    メリット:


    - Schedulerをビルドし直す必要がない!


    デメリット:


    - パフォーマンス、エラーハンドリング等にかなり難あり

    - Scheduling Frameworkと比較して拡張性が乏しい


    37

    View Slide

  38. Plugin (Scheduling Framework)

    Scheduling Frameworkに則って自分で作成したPluginをSchedulerに組み込む


    メリット:

    - パフォーマンス良い。拡張性も高い。


    デメリット:

    - Schedulerをビルドし直す必要がある

    - クラスター上に既存のSchedulerを無効にする必要がある

    38

    View Slide

  39. 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

    View Slide

  40. PreScore + Score 実装例

    40

    View Slide

  41. PreScore + Score 実装例

    41

    View Slide

  42. PluginをSchedulerに組み込む

    42

    View Slide

  43. Configuration上で有効にする

    43

    View Slide

  44. scheduler-plugins

    コミュニティでメンテしているCustom Plugin達


    44

    View Slide

  45. scheduler-plugins

    45

    View Slide

  46. WebAssembly

    46

    View Slide

  47. WebAssembly


    WebAssembly(Wasm) - 様々な言語からコンパイル可能なバイナリフォーマット


    元々はWebブラウザの文脈で耳にすることが多かったが…

    47

    View Slide

  48. EnvoyにおけるWasm拡張

    48

    View Slide

  49. Scheduler ❤ WebAssembly


    WasmによるSchedulerの拡張が提案


    → Extenderの「遅い」「拡張性に乏しい」問題と、

      Pluginの「Schedulerのビルドめんどい」問題を解決を目指している

    49

    View Slide

  50. PreScore + Score 実装例

    50

    View Slide

  51. PreScore + Score 実装例

    51

    View Slide

  52. WebAssembly

    プラグインはWebAssembly(.wasmファイル)としてコンパイルする。

    ↓

    SchedulerはWebAssemblyにコンパイルされたプラグインを読み込み、

    通常のプラグインのように各拡張点で呼び出す

    52

    View Slide

  53. WebAssembly

    メリット

    - Schedulerをビルドし直す必要がない

    - Extenderよりオーバーヘッドがかなり少ない


    デメリット

    - Pluginと比較すると流石にオーバーヘッドがある

    53

    View Slide

  54. WebAssembly

    メリット

    - Schedulerをビルドし直す必要がない

    - Extenderよりオーバーヘッドがかなり少ない


    デメリット

    - Pluginと比較すると流石にオーバーヘッドがある

    → Extender vs Plugin vs Wasm のパフォーマンスは実際どのくらい違うのか


    54

    View Slide

  55. パフォーマンス比較

    Plugin:

    めっちゃ早い

    55

    View Slide

  56. パフォーマンス比較

    Wasm:

    一つ入れると倍くらい時間がか
    かる

    56

    View Slide

  57. パフォーマンス比較

    Extender:

    一つ入れると10倍超くらい時間
    がかかる 😓

    57

    View Slide

  58. Schedulingをいかに

    上手くコントロールするか

    58

    View Slide

  59. 難しさ

    正しいScheduling指定やSchedulerの拡張は難しい


    - 本当にやりたいSchedulingがそれで表現できている?

    - その拡張の実装、コーナーケース拾い切れている?

    - その拡張入れてもパフォーマンス大丈夫?

    59

    View Slide

  60. 難しさ

    - Schedulerは単一障害点

    - Schedulerはブラックボックス

    60

    View Slide

  61. Schedulerは単一障害点

    基本的にClusterにつきSchedulerは一つ

    Schedulerが遅くなるとクラスター上の全Podのスケジュールが遅くなる

    = クラスターのスケーラビリティに頭打ちが来やすくなる


    61

    View Slide

  62. Schedulerが遅いと..

    すまん.....
    頑張っているん
    だが..
    NodeA
 NodeB
 NodeC

    62

    はよせい
    💦


    View Slide

  63. Schedulerはブラックボックス

    Schedulerは多くのPluginからの意見を集めてPodの行き先を決める

    ↓

    Scheduling指定やPluginの実装にミスがあっても気がつきにくい

    (特にPreferredなScheduling制約)


    63

    View Slide

  64. 80

    60

    ×

    ×

    64

    View Slide

  65. 65
    ? 選出


    View Slide

  66. scheduler_perf

    実際のKubernetes内で使用されているSchedulerのテスト

    パフォーマンスを比較することで、デグレがないかを把握できる


    例:

    https://github.com/kubernetes-sigs/kube-scheduler-wasm-extension/pull/63 

    66

    View Slide

  67. 先ほどのPluginのスライド

    Plugin:

    めっちゃ早い

    67

    View Slide

  68. kube-scheduler-simulator

    68

    View Slide

  69. kube-scheduler-simulator

    大きく3つの要素で構成

    - Debuggable Scheduler

    - Kube apiserver (fake) + 色々controllers

    - Web UI

    69

    View Slide

  70. Debuggable Scheduler

    - 通常のSchedulerと同じようにスケジュールを行う

    - 通常のSchedulerと同じようにCustom Pluginも刺せる

    - PodにはSchedulingの詳細な結果が付く

    - Podには過去のSchedulingの履歴も付く

    70

    View Slide

  71. Debuggable Scheduler

    - 通常のSchedulerと同じようにスケジュールを行う

    - 通常のSchedulerと同じようにCustom Pluginも刺せる

    - PodにはSchedulingの詳細な結果が付く

    - Podには過去のSchedulingの履歴も付く

    71

    View Slide

  72. 72

    View Slide

  73. 各FilterPluginの結果
    73

    View Slide

  74. 過去のPlugin結果の履歴
    74

    View Slide

  75. 75

    View Slide

  76. Kube apiserver (fake) + Web UI

    Debuggable Schedulerだけだとシュッと使いにくいので、

    シュッと扱いやすくするための周辺ツールが存在



    76

    View Slide

  77. Kube apiserver (fake) + Web UI

    裏でkube-apiserver(fake)と

    Debuggable Schedulerが動いてる
    77

    View Slide

  78. Kube apiserver (fake) + Web UI

    78

    View Slide

  79. 79

    View Slide

  80. まとめ

    カスタマイズ・デバッグのために以下について紹介しました!

    Schedulerのカスタマイズ・拡張

    - Schedulerデフォルト機能(デフォルトプラグイン)

    - Kube Scheduler Configuration

    - Extender

    - Plugin

    - Wasm

    テスト・デバッグツール

    - scheduler_perf

    - kube-scheduler-simulator

    80

    View Slide

  81. Enjoy happy scheduling life!

    81

    View Slide

  82. We are hiring!!

    株式会社インフキュリオン:

    カード決済・コード決済サービスを一緒に作っていく仲間を
    大募集しています!

    株式会社メルカリ:

    メルカリでは、大量のマイクロサービスを下から支え

    ているPlatformを開発する仲間を募集しています!


    82

    View Slide

  83. 質問は直接でもTwitter等でも

    お気軽に!

    @sanpo_shiho, @196Ikuchil

    83

    View Slide

  84. 84

    View Slide

  85. kube-scheduler-simulator将来性 /
    Scenario/benchmarker

    想定される数百のpodのschedulingやクラスターの状況をシナリオとして記述し、
    schedulerを最適化していける機能(?)

    シナリオを使いつつ、scheduling_perfのようなパフォーマンステストを実施する機能

    が今後導入されさらに実用的になる予定です(思想まで話すか、シナリオについて少し
    深掘りするかは、残り時間次第)

    85

    View Slide