Cloud Native Meetup Tokyo #7 で使用したスライドです。Kubernetes の Scheduler を Webhook で拡張する仕組み、Extender について解説しています。
イベント概要:https://cloudnative.connpass.com/event/123324/
明日、業務で使えるScheduler Extenderチェシャ猫 (@y_taka_23)Cloud Native Meetup Tokyo #7 (2019/03/29)#cloudnativejp
View Slide
Extender、初めて聞いた人?#cloudnativejp
明日には「使える」状態に#cloudnativejp
Scheduling のサイクル● Node のフィルタリング○ リソース不足等、条件に合わない Node を除外○ 候補が残らなければ preemption へ● Node のランキング○ 残った各 Node のスコアを算出して順位付け● Node への Pod のバインディング○ Pod ごとに独立した goroutine を生成#cloudnativejp
2 1 3Rank NodesFilter NodesDequeuePreemptPer-PodGoroutinesBindto NodeMainLoop#cloudnativejp
Scheduler Extender● Webhook による処理の追加○ 指定した外部サーバと JSON をやり取り● 拡張できるポイントは 4 つ○ Filter - Node の候補をさらに絞る○ Prioritize - Node のスコアリング関数を追加○ Preempt - 追い出される Pod の候補を絞る○ Bind - Pod と Node の紐づけを委譲#cloudnativejp
Scheduling Policy の設定● Extender 以外も設定可能○ デフォルトのフィルタ・スコアリングの指し替え○ ExtendedResources の扱いなど● policy.cfg を ConfigMap にしておく○ Scheduler 起動時フラグで設定ファイルを指定○ 設定ファイル内でさらに ConfigMap を指定○ 直接 policy.cfg を指定するフラグは非推奨#cloudnativejp
ConfigMap 内の policy.cfg#cloudnativejp
起動時に設定ファイルを指定policy.cfg を含む ConfigMap#cloudnativejp
ウチ、マネージドなんだけど?#cloudnativejp
追加 Scheduler の指定● 通常の Pod として Scheduler を追加○ マネージドだと kube-scheduler に触れない○ kube-scheduler イメージを使いまわせる○ 追加した Scheduler に Policy を読み込ませる● 特定の Pod だけが Scheduling 対象に○ Scheduler 側で schedulerName を設定○ Pod の schedulerName 属性で担当決め#cloudnativejp
Scheduler に schedulerName を設定#cloudnativejp
Pod で schedulerName を指定#cloudnativejp
具体的に何ができるの?#cloudnativejp
拡張点 1 : Filter● Node のフィルタ条件を追加できる○ 入力 : Pod、候補 Node のリスト○ 出力 : 残った / 落選した Node のリスト● その Pod を載せたくない Node を選べる○ NodeAntiAffinity より複雑な条件が書ける○ 時間経過で変化する条件も考慮できる#cloudnativejp
拡張点 2 : Prioritize● Node のスコアリング関数を追加できる○ 入力 : Pod、候補として残った Node のリスト○ 出力 : 各 Node のホスト名とスコアの組● スコアが大きい Node ほど選ばれやすい○ 各スコアリング関数が 0 から 10 で採点○ weight をかけて合計したものが最終スコアに#cloudnativejp
拡張点 3 : Preempt● Preempt の犠牲になる Pod を選択できる○ 入力 : Pod、犠牲 Pod のリスト、PDB 違反個数○ 出力 : 犠牲にしてよい Pod のリスト● Pod は自由に指定できず、候補から選択○ 通常の preemption の結果が送られてくる○ 犠牲にしたくない Pod は外してから送り返す#cloudnativejp
Preempt Extender の重要性● Preemption で殺されない Pod○ 現状 Preemption を制御する数少ない方法○ あとは Scheduler ごと自作しかない● PodPriority だけでは制御できない○ PodPriority はキュー内の優先度も兼ねる○ 後回しでもいいが中断されたくない Job が困る○ https://github.com/kubernetes/kubernetes/pull/73331#cloudnativejp
拡張点 4 : Bind● Pod を Node に紐づける操作を委譲○ 入力 : Pod 名と UID、Namespace、Node 名○ 出力 : なし● Node 上で時間のかかる前処理ができる○ 個別の goroutine 内で実行○ Webhook 送信後 Scheduler は何もしない○ Extender 自身が Binding オブジェクトを作成#cloudnativejp
kubernetes/pkg/scheduler/api/types.go#cloudnativejp
まとめ● Scheduler Extender による拡張○ JSON Webhook による処理の差し込み○ ConfigMap に記述、設定ファイルから参照● マネージド環境でも使用可能○ 追加で Scheduler をもう一つデプロイして設定● API 定義さえ見つかれば単純な仕組み○ Preempt Extender がメリットを得やすい#cloudnativejp
Let’s Extend Your Ideas!Presented by チェシャ猫 (@y_taka_23)#cloudnativejp