Skip last victim in async preemption if any prior Pod preemption failed kubernetes/kubernetes #135495by tosi3k

N 個のPodをプリエンプトする際、最初の N-1 個の Pods 削除が失敗した場合、最後のPodの削除をスキップするという最適化。 既に N-1 の非同期プリエンプションで失敗した場合の途中停止は実装済みだったので、これがその周辺では残っていた最適化でした。

Tip
最初の N-1 個の削除に失敗している時点で、最後の 1 個だけ削除しても意味がない。意味がないというのは NNN を仮に埋めたとしても結局リソース不足でスケジュール負荷になる。

読んでいるとメトリクス周りで修正した方が良さそうな箇所があったので issue にした。 scheduler_preemption_victims differs between sync and async preemption kubernetes/kubernetes #135717by utam0k

ついでに Async Preemption の KEP を読んだが、確かにプリエンプションがおそい

- name: PreemptionBasic
  workloadTemplate:
  - opcode: createNodes
    countParam: $initNodes
  - opcode: createPods
    countParam: $initPods
    podTemplatePath: config/templates/pod-low-priority.yaml
  - opcode: createPods
    countParam: $measurePods
    podTemplatePath: config/templates/pod-high-priority.yaml
    collectMetrics: true
  workloads:
  - name: 5Nodes
    labels: [integration-test, fast, short]
    params:
      initNodes: 5
      initPods: 20
      measurePods: 5
  - name: 500Nodes
    labels: [performance, fast]
    threshold: 18
    params:
      initNodes: 500
      initPods: 2000
      measurePods: 500

FeatureGate があると機能が読みやすい気がした。