先日行われた CloudNative Days Tokyo 2019 で、Kubernetes のスケジューリングについて発表してきました。公募 CFP 枠です。
今回の発表は、実は技術的に目新しい内容をほとんど含んでいません。各トピックは今までいくつかの勉強会で LT として発表しているものがほとんどです。
ただし、普段の発表では時間が短いこともあって断片的になりがちだった内容を 40 分の枠で再構成し、スケジューリングについて初めて聞く人にとっても入り口のギャップを少なく、できるだけ学習曲線がなだらかになるようにすることを念頭に置いてプレゼンを組み立てました。
当日の Twitter でも「これはわかりやすい」という反応を複数の方からもらっているので、狙いとしてはある程度成功したんじゃないかと思っています。
当日の質問に関して
Twitter から #CNDT2019
と #RoomG
のタグで拾った反応です。いくつかコメントがつけられそうなものがあったので、当日の内容の補足を兼ねて以下に述べます。
なるほど、scoringはDeploymentなどのPodとJobのそれで異なるのか。 #cndt2019 #RoomG
— こば(右) (@tzkb) July 23, 2019
スライドの流れだとちょっと語弊があったかもしれません。「スケジューリングの要件はPod の用途によって異なる」ことの例として二種類のポリシーについて述べましたが、実際に(デフォルトの状態で)Deployment による Pod と Job による Pod でポリシーが内部的に切り替わるわけではありません。ポリシはあくまでも発表中に述べたように policy.cfg
で定義します。
ちなみに過去には --algorithm-provider
という実行時フラグで LeastRequestedPriority
と MostRequestedPriority
とを選択する機能(ソースコード)がありましたが、すでに非推奨になっています。
schedulerは各ノードの状態をどうやって把握してるのだろう?#CNDT2019 #RoomG
— m-daichang (@mdaichang) July 23, 2019
特に目新しい仕組みがあるわけではありません。普通に Scheduler 自身が NodeInformer
を介して API Server にアクセスして(ソースコード)情報を取得しています。おおむね kubectl describe nodes
で取れる情報と同じです。
VPAはPodが一回死ぬんだっけ? #cndt2019 #RoomG
— こば(右) (@tzkb) July 23, 2019
はい、現状では VPA は Pod を一度 evict し、その後 Resource Request が調整された Pod が新規に再作成されます。evict を行わない、いわゆる in-place な request は現在検討段階で、KubeCon EU 2019 でもいくつか発表がありました。
- Resize Your Pods w/o Disruptions aka How to Have a Cake and Eat a Cake
- Restart-Free Vertical Scaling for Kubernetes Pods
Descheduler、これって成熟してたっけ?
— silverbirder (@silver_birder) July 23, 2019
#CNDT2019 #RoomG
Descheduler = リバランス??
— m-daichang (@mdaichang) July 23, 2019
そんな機能があったのか、知らなかった
(manifestみるとv1alphaか)#CNDT2019 #RoomG
Descheduler は Scheduler の機能ではなく、独立した単体のコマンドラインツールです。動作は単純で、一回実行するとその時点で条件に違反している Pod を検出して evict して終わりです。逆に言えば、継続してクラスタの状態を調整し続けたいのであれば、例えば CronJob にするなど、他の仕組みと組み合わせる必要があります。
参考文献
スケジューラのアーキテクチャ
Kubernetes 全体
スケジューラのアルゴリズム
カスタムポリシー設定
フィードバックとリソース効率
Preemption
Vertical Pod Autoscaler
Descheduler
広がるスケジューラの世界
Scheduler Extender
- Extender の API
- Scheduler Extender のスケルトン実装
- kube-throttler
- TopoLVM
- Stork
- 明日、業務で使える Scheduler Extender
特殊スケジューラ
まとめ
以上、CloudNative Days Tokyo 2019 で行った講演の補足情報でした。
今回の講演では、エッジな新情報の提供については一旦優先度を下げ、スケジューラについてあまりよく知らない人が一通りの知識を得られることにフォーカスしてストーリーを作成しました。結果として、曲がりなりにも「スケジューラについてはとりあえずこれを読んでおけ」と言える資料になったのではないかと自負しています。
余談ですが、最後に名前だけ出した kube-batch と Poseidon はなかなか興味深い対象です。スライド中でも述べた通り、通常の kube-scheduler が Pod ひとつごとに Node を決定していくのに対して、これらの特殊スケジューラは複数の Pod の配置をまとめて考慮することができます。今回はあえて深入りしなかったこの詳細、いつかどこかで発表するのを狙っていますが、それはまた別の話。