Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介
 中田 健誠 / Kyoto Uni (4th year)
 普段はバックエンドエンジニアをしてます
 
 Twitter: @sanpo_shiho
 GitHub: @sanposhiho
 
 member of Kubernetes/Kubernetes SIGs


Slide 3

Slide 3 text

もくじ
 1. Kubernetes schedulerの概要
 2. Kubernetes scheduler simulatorについて
 3. Kubernetes scheduler simulatorの仕組みについて
 3

Slide 4

Slide 4 text

Kubernetes schedulerについて
 
 
 4

Slide 5

Slide 5 text

Kubernetes scheduler
 PodをどのNodeに割り当てるかを決定するコンポーネント
 
 様々なリソースの状況からPodに最適なNodeを決定する
 
 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Scheduling Framework
 7 ## Scheduling Cycle
 PodをどのNodeで実行するかを決定する
 ## Binding Cycle
 Scheduling Cycle での決定を実際にクラスターに適応する


Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Scheduling Framework
 Scheduling Framework (の Scheduling Cycle) のうち、
 ● Filter (+ PreFilter)
 ● Score (+ PreScore)
 ● Normalized Score 
 の結果が主にNodeの決定に影響している (+ Plugin Weight)
 ※ Extenderについては今回は割愛して説明します。 (scheduler simulatorでもExtenderには現状対応していません。) 
 
 9

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

Scheduling Framework
 Filter
 Podを実行できない(したくない)Nodeを候補から除外する
 
 例えば…
 ・リソース不足でPodが実行できないNode
 ・nodeSelectorの条件に一致しないNode
 を除外する
 11

Slide 12

Slide 12 text

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


Slide 13

Slide 13 text

13 ×
 ×
 何かしらの観点でNodeを フィルタリングする
 ×
 ×
 ×
 ×
 もしこの段階で候補のNodeが全滅した場合 
 → Preemptionする
 → 諦める (Unscheduled) 


Slide 14

Slide 14 text

Preemption
 Podは priority(優先度)を持つことができます。 
 優先度は他のPodに対する相対的なPodの重要度を示します。 
 もしPodをスケジューリングできないときには、スケジューラーはそのPodをスケジューリ ングできるようにするため、優先度の低いPodをプリエンプトする(追い出す)ことを試み ます。
 
 
 14 公式Doc: 「Pod Priority and Preemption | Kubernetes」より引用


Slide 15

Slide 15 text

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


Slide 16

Slide 16 text

Scheduling Framework
 Score
 残った候補のNodeをスコアリングする。
 
 例えば…
 ・全体のNodeのリソースの使用量のバランスがちょうど良くなるNodeを優先
 ・Podを実行するコンテナイメージをすでに持っているNodeを優先
 16

Slide 17

Slide 17 text

Scheduling Framework
 Normalize Score
 全てのScoreの結果を踏まえてScoreを修正する
 
 
 17

Slide 18

Slide 18 text

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


Slide 19

Slide 19 text

Scheduling Framework
 Plugin Weight
 Plugin ごとにScoreの重み付けをできる。
 
 (そのプラグインのスコア) × Plugin Weight
 19

Slide 20

Slide 20 text

20 Score B プラグインの Weightが1
 → 10
 → 50
 Score A プラグインの Weightが10
 → 300
 → 500


Slide 21

Slide 21 text

21 → 10
 → 50
 Node1 が最終的に選ばれる 
 → 300
 → 500
 350
 510


Slide 22

Slide 22 text

仕組みざっくりまとめ
 Scheduler は Scheduling Framework の流れに沿って動作
 ● Filter で実行できない/したくないNodeを弾き、
 ● Score, Normalized Score でNodeをスコアリングし、
 ● 最後にPlugin Weightを加味して、
 ● どのNodeでPodを実行するか決定する
 
 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

web-based 
 Kubernetes scheduler simulator
 25

Slide 26

Slide 26 text

Kubernetes scheduler simulator
 
 
Web 上から Scheduler の動作をシミュレートすることができるWebApp。
 ↓ Kubernetes SIGs のOrg元で公開
 26

Slide 27

Slide 27 text

Kubernetes scheduler simulator
 
 
 ● フロントエンド + バックエンド + etcd を立ち上げるだけ
 ○ 内部的に Kubernetes のクラスターを立ち上げているわけではない 
 ○ docker image をk8s.gcr.ioから公開予定 
 
 27

Slide 28

Slide 28 text

Background
 ● Scheduler がその Node を選んだ理由は簡単に見ることができない
 ○ ログレベルをあげる必要がある (v=10) 
 ○ ログを確認するには強い権限が必要 
 ○ ログだと見にくい (主観) 
 ● Scheduler の検証には実際のクラスターを立ち上げる必要がある
 ○ そのクラスター上で特定のリソースの状況を作るのもめんどくさい 
 28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

特徴
 
 ● Web 上からリソースを作成し、クラスターの特定の状態を再現できる
 通常の Kubernetes と同様のyaml を使用する


Slide 31

Slide 31 text

スケジューリングに影響し得る 
 リソースの作成に対応 


Slide 32

Slide 32 text

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


Slide 33

Slide 33 text

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


Slide 34

Slide 34 text

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


Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

こういうことに使えるよ
 ● Scheduler 自体や Scheduler のプラグインごとの動作の検証
 ● Scheduler の動作原理の学習
 に使用することができる
 
 36

Slide 37

Slide 37 text

展望
 37

Slide 38

Slide 38 text

展望
 38

Slide 39

Slide 39 text

展望
 39

Slide 40

Slide 40 text

Kubernetes scheduler simulator の仕組み
 40

Slide 41

Slide 41 text

Kubernetes scheduler simulator の仕組み
 どうやってクラスターを立ち上げずにシミュレートしているの?
 41

Slide 42

Slide 42 text

Kubernetes scheduler simulator の仕組み
 Scheduler に必要なコンポーネントのみを実行
 (scheduler_perfの仕組みを参考にしている)
 
 
 scheduler_perfについて詳しくは
 こちらのスライドを参照 →
 
 
 https://speakerdeck.com/sanposhiho/kuberneteshaschedulerfalsepahuomansuwodofalseyouniji-ce-siteiruka
 42

Slide 43

Slide 43 text

Simulator に必要なコンポーネント
 ● kube-apiserver (+ etcd)
 ● scheduler
 ● pv controller
 43

Slide 44

Slide 44 text

Kubernetes scheduler simulator の機能
 ● 各リソースの作成/変更/更新/削除
 ● schedulerの設定の変更
 ● プラグインごとのスケジューリング結果の収集/閲覧
 44

Slide 45

Slide 45 text

Scheduler の設定変更
 1. 現在動いているSchedulerを停止させる 
 2. ユーザーがリクエストしたKubeSchedulerConfigurationを元にSimulator向けの設定 を生成 
 3. Schedulerを2の設定で起動する
 45

Slide 46

Slide 46 text

Scheduler の設定変更
 1. 現在動いているSchedulerを停止させる 
 2. ユーザーがリクエストしたKubeSchedulerConfigurationを元にSimulator向けの設定 を生成 ← ?
 3. Schedulerを2の設定で起動する
 46

Slide 47

Slide 47 text

プラグインの結果の収集
 プラグイン = interfaceを満たすことで実装できる
 ←プラグインのFilterメソッドを実行 
 ↓↑結果の記録
 47

Slide 48

Slide 48 text

プラグインの結果の収集
 ● どのプラグインが
 ● どのNodeに対して
 ● どのような結果を出したのか
 を全て収集する
 ←プラグインのFilterメソッドを実行 
 ↓↑結果の記録
 48

Slide 49

Slide 49 text

プラグインの結果の収集
 
 結果を記録できるようにした新たなプラグインを動的に生成し、
 デフォルトのプラグインの代わりに使用している
 49

Slide 50

Slide 50 text

プラグインの結果の収集
 結果を記録できるようにした新たなプラグインを動的に生成し、
 デフォルトのプラグインの代わりに使用している
 例えばFilterだとこんな感じ↓(/scheduler/plugin/plugins.go#L292)
 ←元のFilterプラグインのFilterメソッドを実行 
 結果の記録
 50

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

プラグインの結果の収集
 各プラグインは同一の resultstore を持っており、そこに結果が貯められていく
 ↓
 Schedulingの終了時に全ての結果をまとめたものがPodのAnnotationに反映される
 
 52

Slide 53

Slide 53 text

プラグインの結果の収集
 各プラグインは同一の resultstore を持っており、そこに結果が貯められていく
 ↓
 Schedulingの終了時に全ての結果をまとめたものがPodのAnnotationに反映される
 ↓
 フロントエンドがPodのAnnotationから表にして表示
 53

Slide 54

Slide 54 text

プラグインの結果の収集まとめ
 1. スケジュールの際に Filter メソッドが呼び出される
 2. Filter メソッド内で元のプラグインの Filter メソッドを呼び出して結果を取得
 3. 取得した結果を resultstore に記録
 4. (スケジュールが進む)
 5. スケジュールの終了時にresultstore が結果を Pod の annotation に記録
 ↓↑結果の記録
 54

Slide 55

Slide 55 text

まとめ
 ● Scheduler では内部で様々なPluginが動作している
 ● Kubernetes scheduler simulatorでは、Pluginごとの動作を検証しつつ、Schedulerを シミュレートできる
 ● 内部的にはSchedulerに必要なコンポーネントのみを立ち上げ、Pluginを動的に入 れ替えることでPluginの結果の取得を可能にしている
 ● feature request/bug報告などお待ちしています
 55