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

自作して学ぶKubernetes Scheduler入門

sanposhiho
November 05, 2021
930

自作して学ぶKubernetes Scheduler入門

CloudNative Days Tokyo 2021での登壇資料です。
https://event.cloudnativedays.jp/cndt2021/talks/1184

GitHub repository
https://github.com/sanposhiho/mini-kube-scheduler

sanposhiho

November 05, 2021
Tweet

More Decks by sanposhiho

Transcript

  1. 自己紹介
 中田 健誠 / Kyoto Uni (4th year)
 普段はバックエンドエンジニアをしてます
 


    Twitter: さんぽし (@sanpo_shiho)
 GitHub: @sanposhiho
 
 Google Summer of Code 2021 @ Kubernetes
 member of Kubernetes / Kubernetes SIGs

  2. もくじ 
 0. Kubernetes schedulerの簡単な概要を知る
 1. 今回の自作に関して
 2. 適当なスケジュールをするSchedulerを作る 🌟


    3. Filter/Score Pluginを実装する 🌟
 4. CycleStateについて知る
 5. Binding Cycle の並列化について知る
 6. Scheduling Cache について知る
 7. Scheduling Queue をざっくり実装する 🌟
 8. Event Handlerについて再度考える 🌟          🌟: 実装する章
 
 3
  3. Scheduling Framework
 Scheduling Framework (の Scheduling Cycle) のうち、
 • Filter

    (+ PreFilter)
 • Score (+ PreScore + Normalized Score )
 の結果が主にNodeの決定に影響している 
 ※ Extenderについては今回は割愛して説明します。 
 
 8
  4. 11

  5. 15 Score B プラグインの Weightが1
 → 10
 → 50
 Score

    A プラグインの Weightが10
 → 300
 → 500

  6. 仕組みざっくりまとめ
 Scheduler は Scheduling Framework の流れに沿って動作
 • Filter で実行できない/したくないNodeを弾き、
 •

    ScoreでNodeをスコアリングし、
 • 最後にPlugin Weightを加味して、
 • どのNodeでPodを実行するか決定する
 • その後Binding CycleでPodをそのNodeにBindする
 18
  7. ScheduleされていないPodを見つける
 
 
Queue はとりあえず Slice でシンプルに実装
 • Queue に Pod

    を追加するメソッドを実装
 • Queue からPodを取り出すメソッドを実装

  8. 適当な Scheduler おさらい
 1. Queue のPodを取り出す
 2. そのPodのScheduleを始める
 3. 全てのNodeを取得する


    4. ランダムにNodeを一つ選ぶ
 5. 選んだNodeに対してPodをBindする
 6. 1に戻る

  9. 適当な Scheduler += Filter/Score Plugin
 1. Queue のPodを取り出す
 2. そのPodのScheduleを始める


    3. 全てのNodeを取得する
 4. Filter Plugin で Node の候補を絞る
 5. Score Plugin で 残った候補をスコアリングする
 6. 残った候補の中からスコアが高いNodeを選ぶ
 7. 選んだNodeに対してPodをBindする
 8. 1に戻る

  10. 適当な Scheduler += Filter/Score Plugin
 1. Queue のPodを取り出す
 2. そのPodのScheduleを始める


    3. 全てのNodeを取得する
 4. Filter Plugin で Node の候補を絞る
 5. Score Plugin で 残った候補をスコアリングする
 6. (残った候補の中から) ランダムにNodeを一つ選ぶ
 7. 選んだNodeに対してPodをBindする
 8. 1に戻る

  11. Scheduling Framework (おさらい)
 71 ## Scheduling Cycle
 PodをどのNodeで実行するかを決定する
 ## Binding

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

  12. Scheduling Cycle
 
 
 72 他のPodのスケジュール結果が確定していないと正しくスケジュールできない
 → 並列に実行できず、Podを一つ一つスケジュールしていくしかない
 
 


    並列に実行するとダメな例: 
 2つのPodが同時にスケジュールされ、”1つのPodしかリソース的に実行できないNode” に2つのPodがBindされる
 

  13. Binding Cycle の並列化に関係する仕組み
 • Node を予約する仕組み
 • Bindのタイミングを管理できる仕組み
 ◦ Permit

    Plugin / wait on permit 
 ◦ 実装済(発表時間が足りず削った) → ブランチ: permit-plugin 

  14. Scheduling Cache について知る
 EventHandlerでNodeの作成/更新/削除 を検知してCacheを更新する
 
 
 
 (おさらい) EventHandler

    
 → リソースの変更をトリガーにあらかじめ登録した関数を実行してくれる仕組み

  15. snapshot に関して
 Cacheと同様にNodeの状態を保持している
 • スケジュール中はNodeを取得する際にsnapshotに問い合わせる
 ◦ (= APIから取得しない) 
 ◦

    (= scheduling cacheからも直接取得しない )
 • スケジュールの開始時にCacheのデータを用いて更新されるようになっている
 ◦ 逆に言うとスケジュールの開始時以外は更新されない 
 

  16. Scheduling Queueが持つ3つのQueueの種類
 • activeQ: Schedule待ちのPodのQueue
 • podBackoffQ backoff中のPodのQueue。
 • unschedulableQ

    一度スケジュールしようとして失敗したPodのQueue
          Unschedulableとなった原因のPluginなども保存

  17. Queue への追加/Queueからの取り出し
 追加
 • Add: 新たにPodが作成された時
 • AddUnschedulableIfNotPresent: スケジュールに失敗した時
 ◦

    この際にUnschedulableとなった原因のPluginなども保存 
 取り出し
 • スケジューリング開始時にPopを使用してactiveQからPodが取り出される

  18. unschedulableQ → backoffQ/activeQ
 
 特定のイベントの発行時にbackoffQ/activeQへ移動
 unschedulableQはPodがどのPluginのせいでスケジュールできなかった(Unschedulableになった)のか を記録している 
 
 例:

    Filterで候補0となりUnschedulableとなった場合は、Filterで一つでもNodeを除外したPluginが Unschedulableの原因となったPluginとして記録される 

  19. Next step....
 時間の関係上今回触れなかった機能が多くあります
 • Preemption
 • Permit Plugin / wait

    on permit
 • Reserve/UnReserve Plugin
 • QueueSort Plugin
 • Extender全般
 • PodsToActivate によるCycleStateを通したQueue内の操作
 • その他リソースの変更によるQueue内の操作
 など