$30 off During Our Annual Pro Sale. View Details »

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

明日、業務で使える 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. 明日、業務で使える
    Scheduler Extender
    チェシャ猫 (@y_taka_23)
    Cloud Native Meetup Tokyo #7 (2019/03/29)
    #cloudnativejp

    View Slide

  2. Extender、初めて聞いた人?
    #cloudnativejp

    View Slide

  3. 明日には「使える」状態に
    #cloudnativejp

    View Slide

  4. Scheduling のサイクル
    ● Node のフィルタリング
    ○ リソース不足等、条件に合わない Node を除外
    ○ 候補が残らなければ preemption へ
    ● Node のランキング
    ○ 残った各 Node のスコアを算出して順位付け
    ● Node への Pod のバインディング
    ○ Pod ごとに独立した goroutine を生成
    #cloudnativejp

    View Slide

  5. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  6. Scheduler Extender
    ● Webhook による処理の追加
    ○ 指定した外部サーバと JSON をやり取り
    ● 拡張できるポイントは 4 つ
    ○ Filter - Node の候補をさらに絞る
    ○ Prioritize - Node のスコアリング関数を追加
    ○ Preempt - 追い出される Pod の候補を絞る
    ○ Bind - Pod と Node の紐づけを委譲
    #cloudnativejp

    View Slide

  7. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  8. Scheduling Policy の設定
    ● Extender 以外も設定可能
    ○ デフォルトのフィルタ・スコアリングの指し替え
    ○ ExtendedResources の扱いなど
    ● policy.cfg を ConfigMap にしておく
    ○ Scheduler 起動時フラグで設定ファイルを指定
    ○ 設定ファイル内でさらに ConfigMap を指定
    ○ 直接 policy.cfg を指定するフラグは非推奨
    #cloudnativejp

    View Slide

  9. ConfigMap 内の policy.cfg
    #cloudnativejp

    View Slide

  10. 起動時に設定ファイルを指定
    policy.cfg を含む ConfigMap
    #cloudnativejp

    View Slide

  11. ウチ、マネージドなんだけど?
    #cloudnativejp

    View Slide

  12. 追加 Scheduler の指定
    ● 通常の Pod として Scheduler を追加
    ○ マネージドだと kube-scheduler に触れない
    ○ kube-scheduler イメージを使いまわせる
    ○ 追加した Scheduler に Policy を読み込ませる
    ● 特定の Pod だけが Scheduling 対象に
    ○ Scheduler 側で schedulerName を設定
    ○ Pod の schedulerName 属性で担当決め
    #cloudnativejp

    View Slide

  13. Scheduler に schedulerName を設定
    #cloudnativejp

    View Slide

  14. Pod で schedulerName を指定
    #cloudnativejp

    View Slide

  15. 具体的に何ができるの?
    #cloudnativejp

    View Slide

  16. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  17. 拡張点 1 : Filter
    ● Node のフィルタ条件を追加できる
    ○ 入力 : Pod、候補 Node のリスト
    ○ 出力 : 残った / 落選した Node のリスト
    ● その Pod を載せたくない Node を選べる
    ○ NodeAntiAffinity より複雑な条件が書ける
    ○ 時間経過で変化する条件も考慮できる
    #cloudnativejp

    View Slide

  18. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  19. 拡張点 2 : Prioritize
    ● Node のスコアリング関数を追加できる
    ○ 入力 : Pod、候補として残った Node のリスト
    ○ 出力 : 各 Node のホスト名とスコアの組
    ● スコアが大きい Node ほど選ばれやすい
    ○ 各スコアリング関数が 0 から 10 で採点
    ○ weight をかけて合計したものが最終スコアに
    #cloudnativejp

    View Slide

  20. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  21. 拡張点 3 : Preempt
    ● Preempt の犠牲になる Pod を選択できる
    ○ 入力 : Pod、犠牲 Pod のリスト、PDB 違反個数
    ○ 出力 : 犠牲にしてよい Pod のリスト
    ● Pod は自由に指定できず、候補から選択
    ○ 通常の preemption の結果が送られてくる
    ○ 犠牲にしたくない Pod は外してから送り返す
    #cloudnativejp

    View Slide

  22. Preempt Extender の重要性
    ● Preemption で殺されない Pod
    ○ 現状 Preemption を制御する数少ない方法
    ○ あとは Scheduler ごと自作しかない
    ● PodPriority だけでは制御できない
    ○ PodPriority はキュー内の優先度も兼ねる
    ○ 後回しでもいいが中断されたくない Job が困る
    ○ https://github.com/kubernetes/kubernetes/pull/73331
    #cloudnativejp

    View Slide

  23. 2 1 3
    Rank Nodes
    Filter Nodes
    Dequeue
    Preempt
    Per-Pod
    Goroutines
    Bind
    to Node
    Main
    Loop
    #cloudnativejp

    View Slide

  24. 拡張点 4 : Bind
    ● Pod を Node に紐づける操作を委譲
    ○ 入力 : Pod 名と UID、Namespace、Node 名
    ○ 出力 : なし
    ● Node 上で時間のかかる前処理ができる
    ○ 個別の goroutine 内で実行
    ○ Webhook 送信後 Scheduler は何もしない
    ○ Extender 自身が Binding オブジェクトを作成
    #cloudnativejp

    View Slide

  25. kubernetes/pkg/scheduler/api/types.go
    #cloudnativejp

    View Slide

  26. まとめ
    ● Scheduler Extender による拡張
    ○ JSON Webhook による処理の差し込み
    ○ ConfigMap に記述、設定ファイルから参照
    ● マネージド環境でも使用可能
    ○ 追加で Scheduler をもう一つデプロイして設定
    ● API 定義さえ見つかれば単純な仕組み
    ○ Preempt Extender がメリットを得やすい
    #cloudnativejp

    View Slide

  27. Let’s Extend Your Ideas!
    Presented by チェシャ猫 (@y_taka_23)
    #cloudnativejp

    View Slide