調べたいことがあり、スケジューラ実装のソースを読んだ際のメモです。
かなりはしょってますので、読みづらいかもしれません。
調べたいこと
- Priority Classを使った際にスタベーションは起きるのか
- バックフィルはあるのか
読む前に知識をつける
- https://speakerdeck.com/smatsuzaki/kubernetesfalsesosukodorideinguru-men
- https://www.alibabacloud.com/blog/a-brief-analysis-on-the-implementation-of-the-kubernetes-scheduler_595083
- https://www.alibabacloud.com/blog/getting-started-with-kubernetes-%7C-scheduling-process-and-scheduler-algorithms_596299
コードリーディング準備
- vscode WSLを利用
- GitHubからクローン(コミットログ不要なので
--depth 1
をつける) - goの拡張を入れる
- 右クリックで参照や定義ジャンプができるようになる
概要
-
pkg/scheduler/internal/scheduling_queue.go
- 3つのQueueを内部にもつ
- activeQ: アサインしようとしているPodをためる。実態はinternal/heap/heap.go
- unschedulableQ: アサインを試みて無理と判断したPodをためる
- backOffQ: unschedulableQから移したPodをためる。このQの中でbackOff完了したPodをactiveQに戻す。実態はinternal/heap/heap.go
- 3つのQueueを内部にもつ
-
internal/heap/heap.go
- container/heapパッケージのラッパー
- internal/heap_test/heap.go を見れば、動的に優先度を変更できることがわかる
結論
- 動的に優先度変更がキューに反映されるので、優先度の付け方次第でスタベーションは起きえる
- あくまでキューがそうなってるだけなので、ProrityClassの変更がキューに渡らない可能性もある。
- 要追加調査(実機検証したい)
- あくまでキューがそうなってるだけなので、ProrityClassの変更がキューに渡らない可能性もある。
- アサイン不能なものはいったんactiveQから出て別のキューに移動するので、キュー先頭がアサイン不能だった場合、それより優先度の低いものもアサインはされる
- バックフィルに近い挙動である(厳密には違うが)