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

明日、業務で使える Scheduler Extender #cloudnativejp / C...

明日、業務で使える Scheduler Extender #cloudnativejp / Cloud Native Meetup Tokyo 7th

Cloud Native Meetup Tokyo #7 で使用したスライドです。Kubernetes の Scheduler を Webhook で拡張する仕組み、Extender について解説しています。

イベント概要:https://cloudnative.connpass.com/event/123324/

y_taka_23

March 29, 2019
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

  1. Scheduling のサイクル • Node のフィルタリング ◦ リソース不足等、条件に合わない Node を除外 ◦

    候補が残らなければ preemption へ • Node のランキング ◦ 残った各 Node のスコアを算出して順位付け • Node への Pod のバインディング ◦ Pod ごとに独立した goroutine を生成 #cloudnativejp
  2. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  3. Scheduler Extender • Webhook による処理の追加 ◦ 指定した外部サーバと JSON をやり取り •

    拡張できるポイントは 4 つ ◦ Filter - Node の候補をさらに絞る ◦ Prioritize - Node のスコアリング関数を追加 ◦ Preempt - 追い出される Pod の候補を絞る ◦ Bind - Pod と Node の紐づけを委譲 #cloudnativejp
  4. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  5. Scheduling Policy の設定 • Extender 以外も設定可能 ◦ デフォルトのフィルタ・スコアリングの指し替え ◦ ExtendedResources

    の扱いなど • policy.cfg を ConfigMap にしておく ◦ Scheduler 起動時フラグで設定ファイルを指定 ◦ 設定ファイル内でさらに ConfigMap を指定 ◦ 直接 policy.cfg を指定するフラグは非推奨 #cloudnativejp
  6. 追加 Scheduler の指定 • 通常の Pod として Scheduler を追加 ◦

    マネージドだと kube-scheduler に触れない ◦ kube-scheduler イメージを使いまわせる ◦ 追加した Scheduler に Policy を読み込ませる • 特定の Pod だけが Scheduling 対象に ◦ Scheduler 側で schedulerName を設定 ◦ Pod の schedulerName 属性で担当決め #cloudnativejp
  7. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  8. 拡張点 1 : Filter • Node のフィルタ条件を追加できる ◦ 入力 :

    Pod、候補 Node のリスト ◦ 出力 : 残った / 落選した Node のリスト • その Pod を載せたくない Node を選べる ◦ NodeAntiAffinity より複雑な条件が書ける ◦ 時間経過で変化する条件も考慮できる #cloudnativejp
  9. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  10. 拡張点 2 : Prioritize • Node のスコアリング関数を追加できる ◦ 入力 :

    Pod、候補として残った Node のリスト ◦ 出力 : 各 Node のホスト名とスコアの組 • スコアが大きい Node ほど選ばれやすい ◦ 各スコアリング関数が 0 から 10 で採点 ◦ weight をかけて合計したものが最終スコアに #cloudnativejp
  11. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  12. 拡張点 3 : Preempt • Preempt の犠牲になる Pod を選択できる ◦

    入力 : Pod、犠牲 Pod のリスト、PDB 違反個数 ◦ 出力 : 犠牲にしてよい Pod のリスト • Pod は自由に指定できず、候補から選択 ◦ 通常の preemption の結果が送られてくる ◦ 犠牲にしたくない Pod は外してから送り返す #cloudnativejp
  13. Preempt Extender の重要性 • Preemption で殺されない Pod ◦ 現状 Preemption

    を制御する数少ない方法 ◦ あとは Scheduler ごと自作しかない • PodPriority だけでは制御できない ◦ PodPriority はキュー内の優先度も兼ねる ◦ 後回しでもいいが中断されたくない Job が困る ◦ https://github.com/kubernetes/kubernetes/pull/73331 #cloudnativejp
  14. 2 1 3 Rank Nodes Filter Nodes Dequeue Preempt Per-Pod

    Goroutines Bind to Node Main Loop #cloudnativejp
  15. 拡張点 4 : Bind • Pod を Node に紐づける操作を委譲 ◦

    入力 : Pod 名と UID、Namespace、Node 名 ◦ 出力 : なし • Node 上で時間のかかる前処理ができる ◦ 個別の goroutine 内で実行 ◦ Webhook 送信後 Scheduler は何もしない ◦ Extender 自身が Binding オブジェクトを作成 #cloudnativejp
  16. まとめ • Scheduler Extender による拡張 ◦ JSON Webhook による処理の差し込み ◦

    ConfigMap に記述、設定ファイルから参照 • マネージド環境でも使用可能 ◦ 追加で Scheduler をもう一つデプロイして設定 • API 定義さえ見つかれば単純な仕組み ◦ Preempt Extender がメリットを得やすい #cloudnativejp