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

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

sanposhiho
September 28, 2021
400

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

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

sanposhiho

September 28, 2021
Tweet

More Decks by sanposhiho

Transcript

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

    Kensei Nakada @sanposhiho

    1

    View full-size slide

  2. 自己紹介

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

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


    Twitter: @sanpo_shiho

    GitHub: @sanposhiho


    member of Kubernetes/Kubernetes SIGs


    View full-size slide

  3. もくじ

    1. Kubernetes schedulerの概要

    2. Kubernetes scheduler simulatorについて

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

    3

    View full-size slide

  4. Kubernetes schedulerについて



    4

    View full-size slide

  5. Kubernetes scheduler

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


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


    5

    View full-size slide

  6. Scheduling Framework

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

    6

    View full-size slide

  7. Scheduling Framework

    7
    ## Scheduling Cycle

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

    ## Binding Cycle

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


    View full-size slide

  8. Scheduling Framework

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

    8

    View full-size slide

  9. Scheduling Framework

    Scheduling Framework (の Scheduling Cycle) のうち、

    ● Filter (+ PreFilter)

    ● Score (+ PreScore)

    ● Normalized Score 

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

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


    9

    View full-size slide

  10. Scheduling Framework

    Filter

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


    例えば…

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

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

    を除外する

    11

    View full-size slide

  11. 12
    ×

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


    View full-size slide

  12. 13
    ×

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

    ×

    ×

    ×

    ×

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

    → Preemptionする

    → 諦める (Unscheduled) 


    View full-size slide

  13. Preemption

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

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

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



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


    View full-size slide

  14. 15
    ×

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


    View full-size slide

  15. Scheduling Framework

    Score

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


    例えば…

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

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

    16

    View full-size slide

  16. Scheduling Framework

    Normalize Score

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



    17

    View full-size slide

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


    View full-size slide

  18. Scheduling Framework

    Plugin Weight

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


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

    19

    View full-size slide

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

    → 10

    → 50

    Score A プラグインの
    Weightが10

    → 300

    → 500


    View full-size slide

  20. 21
    → 10

    → 50

    Node1 が最終的に選ばれる 

    → 300

    → 500

    350

    510


    View full-size slide

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

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

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

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

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

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


    22

    View full-size slide

  22. Scheduler Configuration

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

    23

    View full-size slide

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

    24

    View full-size slide

  24. web-based 

    Kubernetes scheduler simulator

    25

    View full-size slide

  25. Kubernetes scheduler simulator


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

    ↓ Kubernetes SIGs のOrg元で公開

    26

    View full-size slide

  26. Kubernetes scheduler simulator


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

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

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


    27

    View full-size slide

  27. Background

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

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

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

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

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

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

    28

    View full-size slide

  28. 特徴


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

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


    View full-size slide

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

    リソースの作成に対応 


    View full-size slide

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


    View full-size slide

  31. 特徴


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


    View full-size slide

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


    View full-size slide

  33. 特徴


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

    35

    View full-size slide

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

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

    ● Scheduler の動作原理の学習

    に使用することができる


    36

    View full-size slide

  35. Kubernetes scheduler simulator の仕組み

    40

    View full-size slide

  36. Kubernetes scheduler simulator の仕組み

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

    41

    View full-size slide

  37. Kubernetes scheduler simulator の仕組み

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

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



    scheduler_perfについて詳しくは

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



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

    42

    View full-size slide

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

    ● kube-apiserver (+ etcd)

    ● scheduler

    ● pv controller

    43

    View full-size slide

  39. Kubernetes scheduler simulator の機能

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

    ● schedulerの設定の変更

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

    44

    View full-size slide

  40. Scheduler の設定変更

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

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

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

    45

    View full-size slide

  41. Scheduler の設定変更

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

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

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

    46

    View full-size slide

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

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

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

    ↓↑結果の記録

    47

    View full-size slide

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

    ● どのプラグインが

    ● どのNodeに対して

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

    を全て収集する

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

    ↓↑結果の記録

    48

    View full-size slide

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


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

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

    49

    View full-size slide

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

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

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

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

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

    結果の記録

    50

    View full-size slide

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

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

    51

    View full-size slide

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

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

    ↓

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


    52

    View full-size slide

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

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

    ↓

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

    ↓

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

    53

    View full-size slide

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

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

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

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

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

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

    ↓↑結果の記録

    54

    View full-size slide

  50. まとめ

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

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

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

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

    55

    View full-size slide