Slide 1

Slide 1 text

明日、業務で使える Scheduler Extender チェシャ猫 (@y_taka_23) Cloud Native Meetup Tokyo #7 (2019/03/29) #cloudnativejp

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

ConfigMap 内の policy.cfg #cloudnativejp

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Scheduler に schedulerName を設定 #cloudnativejp

Slide 14

Slide 14 text

Pod で schedulerName を指定 #cloudnativejp

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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