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

kube-scheduler-simulatorを用いたSchedulerのシミュレーションとその仕組み

sanposhiho
September 28, 2021
270

 kube-scheduler-simulatorを用いたSchedulerのシミュレーションとその仕組み

Kubernetes Meetup Tokyo #45 での資料です
https://k8sjp.connpass.com/event/223232/

sanposhiho

September 28, 2021
Tweet

Transcript

  1. kube-scheduler-simulatorを用いたSchedulerのシミュ
    レーションとその仕組み

    Kensei Nakada @sanposhiho

    1

    View Slide

  2. 自己紹介

    中田 健誠 / Kyoto Uni (4th year)

    普段はバックエンドエンジニアをしてます


    Twitter: @sanpo_shiho

    GitHub: @sanposhiho


    member of Kubernetes/Kubernetes SIGs


    View Slide

  3. もくじ

    1. Kubernetes schedulerの概要

    2. Kubernetes scheduler simulatorについて

    3. Kubernetes scheduler simulatorの仕組みについて

    3

    View Slide

  4. Kubernetes schedulerについて



    4

    View Slide

  5. Kubernetes scheduler

    PodをどのNodeに割り当てるかを決定するコンポーネント


    様々なリソースの状況からPodに最適なNodeを決定する


    5

    View Slide

  6. Scheduling Framework

    公式Doc: 「Scheduling Framework | Kubernetes」より引用

    6

    View Slide

  7. Scheduling Framework

    7
    ## Scheduling Cycle

    PodをどのNodeで実行するかを決定する

    ## Binding Cycle

    Scheduling Cycle での決定を実際にクラスターに適応する


    View Slide

  8. Scheduling Framework

    公式Doc: 「Scheduling Framework | Kubernetes」より引用

    8

    View Slide

  9. Scheduling Framework

    Scheduling Framework (の Scheduling Cycle) のうち、

    ● Filter (+ PreFilter)

    ● Score (+ PreScore)

    ● Normalized Score 

    の結果が主にNodeの決定に影響している (+ Plugin Weight)

    ※ Extenderについては今回は割愛して説明します。 (scheduler simulatorでもExtenderには現状対応していません。) 


    9

    View Slide

  10. 10

    View Slide

  11. Scheduling Framework

    Filter

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


    例えば…

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

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

    を除外する

    11

    View Slide

  12. 12
    ×

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


    View Slide

  13. 13
    ×

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

    ×

    ×

    ×

    ×

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

    → Preemptionする

    → 諦める (Unscheduled) 


    View Slide

  14. Preemption

    Podは priority(優先度)を持つことができます。 

    優先度は他のPodに対する相対的なPodの重要度を示します。 

    もしPodをスケジューリングできないときには、スケジューラーはそのPodをスケジューリ
    ングできるようにするため、優先度の低いPodをプリエンプトする(追い出す)ことを試み
    ます。



    14
    公式Doc: 「Pod Priority and Preemption | Kubernetes」より引用


    View Slide

  15. 15
    ×

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


    View Slide

  16. Scheduling Framework

    Score

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


    例えば…

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

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

    16

    View Slide

  17. Scheduling Framework

    Normalize Score

    全てのScoreの結果を踏まえてScoreを修正する



    17

    View Slide

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


    View Slide

  19. Scheduling Framework

    Plugin Weight

    Plugin ごとにScoreの重み付けをできる。


    (そのプラグインのスコア) × Plugin Weight

    19

    View Slide

  20. 20
    Score B プラグインの
    Weightが1

    → 10

    → 50

    Score A プラグインの
    Weightが10

    → 300

    → 500


    View Slide

  21. 21
    → 10

    → 50

    Node1 が最終的に選ばれる 

    → 300

    → 500

    350

    510


    View Slide

  22. 仕組みざっくりまとめ

    Scheduler は Scheduling Framework の流れに沿って動作

    ● Filter で実行できない/したくないNodeを弾き、

    ● Score, Normalized Score でNodeをスコアリングし、

    ● 最後にPlugin Weightを加味して、

    ● どのNodeでPodを実行するか決定する


    22

    View Slide

  23. Scheduler Configuration

    実行する Plugin と Plugin Weightを変更できる (詳しくは公式Doc)

    23

    View Slide

  24. [宣伝] 詳しい話は CloudNative Days で

    24

    View Slide

  25. web-based 

    Kubernetes scheduler simulator

    25

    View Slide

  26. Kubernetes scheduler simulator


    
Web 上から Scheduler の動作をシミュレートすることができるWebApp。

    ↓ Kubernetes SIGs のOrg元で公開

    26

    View Slide

  27. Kubernetes scheduler simulator


    
 ● フロントエンド + バックエンド + etcd を立ち上げるだけ

    ○ 内部的に Kubernetes のクラスターを立ち上げているわけではない

    ○ docker image をk8s.gcr.ioから公開予定


    27

    View Slide

  28. Background

    ● Scheduler がその Node を選んだ理由は簡単に見ることができない

    ○ ログレベルをあげる必要がある (v=10) 

    ○ ログを確認するには強い権限が必要 

    ○ ログだと見にくい (主観) 

    ● Scheduler の検証には実際のクラスターを立ち上げる必要がある

    ○ そのクラスター上で特定のリソースの状況を作るのもめんどくさい 

    28

    View Slide

  29. 29

    View Slide

  30. 特徴


    ● Web 上からリソースを作成し、クラスターの特定の状態を再現できる

    通常の Kubernetes と同様のyaml
    を使用する


    View Slide

  31. スケジューリングに影響し得る 

    リソースの作成に対応 


    View Slide

  32. Pod を作成するとどのNodeに配置
    されたかみることができる 


    View Slide

  33. 特徴


    ● プラグインごとの結果を全て可視化 ( 次スライド )


    View Slide

  34. どのプラグインがどのNodeに対し
    てどのような判断を下したかを表
    で確認できる


    View Slide

  35. 特徴


    ● Scheduler の設定を Web 上から変更することができる

    35

    View Slide

  36. こういうことに使えるよ

    ● Scheduler 自体や Scheduler のプラグインごとの動作の検証

    ● Scheduler の動作原理の学習

    に使用することができる


    36

    View Slide

  37. 展望

    37

    View Slide

  38. 展望

    38

    View Slide

  39. 展望

    39

    View Slide

  40. Kubernetes scheduler simulator の仕組み

    40

    View Slide

  41. Kubernetes scheduler simulator の仕組み

    どうやってクラスターを立ち上げずにシミュレートしているの?

    41

    View Slide

  42. Kubernetes scheduler simulator の仕組み

    Scheduler に必要なコンポーネントのみを実行

    (scheduler_perfの仕組みを参考にしている)



    scheduler_perfについて詳しくは

    こちらのスライドを参照 →



    https://speakerdeck.com/sanposhiho/kuberneteshaschedulerfalsepahuomansuwodofalseyouniji-ce-siteiruka

    42

    View Slide

  43. Simulator に必要なコンポーネント

    ● kube-apiserver (+ etcd)

    ● scheduler

    ● pv controller

    43

    View Slide

  44. Kubernetes scheduler simulator の機能

    ● 各リソースの作成/変更/更新/削除

    ● schedulerの設定の変更

    ● プラグインごとのスケジューリング結果の収集/閲覧

    44

    View Slide

  45. Scheduler の設定変更

    1. 現在動いているSchedulerを停止させる 

    2. ユーザーがリクエストしたKubeSchedulerConfigurationを元にSimulator向けの設定
    を生成 

    3. Schedulerを2の設定で起動する

    45

    View Slide

  46. Scheduler の設定変更

    1. 現在動いているSchedulerを停止させる 

    2. ユーザーがリクエストしたKubeSchedulerConfigurationを元にSimulator向けの設定
    を生成 ← ?

    3. Schedulerを2の設定で起動する

    46

    View Slide

  47. プラグインの結果の収集

    プラグイン = interfaceを満たすことで実装できる

    ←プラグインのFilterメソッドを実行 

    ↓↑結果の記録

    47

    View Slide

  48. プラグインの結果の収集

    ● どのプラグインが

    ● どのNodeに対して

    ● どのような結果を出したのか

    を全て収集する

    ←プラグインのFilterメソッドを実行 

    ↓↑結果の記録

    48

    View Slide

  49. プラグインの結果の収集


    結果を記録できるようにした新たなプラグインを動的に生成し、

    デフォルトのプラグインの代わりに使用している

    49

    View Slide

  50. プラグインの結果の収集

    結果を記録できるようにした新たなプラグインを動的に生成し、

    デフォルトのプラグインの代わりに使用している

    例えばFilterだとこんな感じ↓(/scheduler/plugin/plugins.go#L292)

    ←元のFilterプラグインのFilterメソッドを実行 

    結果の記録

    50

    View Slide

  51. プラグインの結果の収集

    各プラグインは同一の resultstore を持っており、そこに結果が貯められていく

    51

    View Slide

  52. プラグインの結果の収集

    各プラグインは同一の resultstore を持っており、そこに結果が貯められていく

    ↓

    Schedulingの終了時に全ての結果をまとめたものがPodのAnnotationに反映される


    52

    View Slide

  53. プラグインの結果の収集

    各プラグインは同一の resultstore を持っており、そこに結果が貯められていく

    ↓

    Schedulingの終了時に全ての結果をまとめたものがPodのAnnotationに反映される

    ↓

    フロントエンドがPodのAnnotationから表にして表示

    53

    View Slide

  54. プラグインの結果の収集まとめ

    1. スケジュールの際に Filter メソッドが呼び出される

    2. Filter メソッド内で元のプラグインの Filter メソッドを呼び出して結果を取得

    3. 取得した結果を resultstore に記録

    4. (スケジュールが進む)

    5. スケジュールの終了時にresultstore が結果を Pod の annotation に記録

    ↓↑結果の記録

    54

    View Slide

  55. まとめ

    ● Scheduler では内部で様々なPluginが動作している

    ● Kubernetes scheduler simulatorでは、Pluginごとの動作を検証しつつ、Schedulerを
    シミュレートできる

    ● 内部的にはSchedulerに必要なコンポーネントのみを立ち上げ、Pluginを動的に入
    れ替えることでPluginの結果の取得を可能にしている

    ● feature request/bug報告などお待ちしています

    55

    View Slide