Upgrade to Pro — share decks privately, control downloads, hide ads and more …

kube-scheduler: from 101 to the frontier

sanposhiho
October 10, 2024
110

kube-scheduler: from 101 to the frontier

Kubernetes Meetup Tokyo #67
https://k8sjp.connpass.com/event/330635/

sanposhiho

October 10, 2024
Tweet

More Decks by sanposhiho

Transcript

  1. Hello! こんにちは ! 👋 Kensei Nakada (@sanposhiho) • Software Engineer

    @ • Kubernetes maintainer (SIG-Scheduling approver, SIG-Autoscaling) • Kubernetes contributor award 2022, 2023
  2. Scheduler Plugins 各Scheduling制約はPluginとして実装されている Image Locality Plugin TaintToleration Plugin Resource Fit

    Plugin NodePorts Plugin NodeAffinity Plugin Inter-Pod Affinity Plugin etc etc… Kubernetes scheduler consists of many plugins:
  3. Performance matters! • Schedulerは基本的にクラスター内に1つだけ ◦ Scheduling ThroughputがクラスターのPod作成速度よりも下回るとスケジュールされてない Podが溜まっていってしまう。 ◦ アップストリームでは全てのシナリオで

    300 Pods/s以上キープを目標にしている。 scheduler-perf(後述)で計測。 • Scheduler のパフォーマンス改善は複数のエリアにまたがる ◦ Scheduling Framework自体のパフォーマンス ◦ Pluginのパフォーマンス ◦ Requeueingの正確性 (scheduling cycleの無駄使いを減らす)
  4. パフォーマンス改善 1: Scheduling Cycle Pod1つあたりのSchedulingにかかる時間を減らす • Plugin自体の処理効率を上げる ◦ 事前に計算できる部分は PreXXXXに処理を移す

    • FrameworkのInterfaceに手を加えてより効率的にPluginが動けるようにする ◦ PreFilterResult: 複数のNodeをPreFilter時点で除外できるようにする ◦ Skip: 不要なPluginはその後の拡張点で呼ばれないようにする • PreemptionのAPIの呼び出しを非同期に (KEP-4832, 計画中未実装)
  5. パフォーマンス改善 1-2: framework • PreFilterResult: 複数のNodeをPreFilter時点で除外できるようにする ◦ 例: metadata.nameに対するNodeAffinityがPodに指定されている時、PreFilterの段階で、その指 定Node以外を除外できる

    • Skip: 不要なPluginはその後の拡張点で呼ばれないようにする ◦ 例: NodeAffinityを持っていないPodのSchedule中、NodeAffinityを呼び出す必要はない → NodeAffinity#PreFilterがSkipを返すことでFilterが呼ばれなくなる
  6. [復習] Scheduling Queue Schedule待ちのPodはScheduling Queueにて待機させられる。 内部は3つの待機場所に別れている: • ActiveQ: Schedule待ちのPodたち •

    BackoffQ: Backoff中のPodたち。Backoff終了後ActiveQへ移動される。 • Unschedulable Pod Pool: 待機中のPodたち
  7. その他: scheduling queueのロック改善 • Scheduling Queueは1つのロックを使用して排他制御していた • QueueingHintの導入等でQueueがイベントの処理にかかる時間が増加 ◦ イベント処理中もロックは取りっぱなし

    • Scheduling cycleがQueueからPodを取り出す時にもロックが必要 → イベント処理がロックを取りまくるせいで Scheduling cycleの開始が妨害されThroughput が低下