LoginSignup
6
2

More than 3 years have passed since last update.

Kubernetes 1.20: SIG Scheduling の変更内容

Last updated at Posted at 2020-12-23

はじめに

本ドキュメントでは、Kubernetes v1.20.0のCHANGELOGをベースにSIG Schedulingに関する機能について紹介します。

v1.20.0での変更はあまり多く有りません。主な変更をまとめると次のとおりです。
- Default Pod Topology Spread を betaに昇格
- 大きめ(主観です)のBugFixが含まれており、すべてv1.18.x, v1.19.xにbackportされているのでBug or Regressionのsectionは確認すると良さそうです。

下記 :pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

What's New (新情報)

Pod resource metrics

オンデマンドのメトリクスが /metrics/resources から利用できるようになりました。この機能を有効にすると実行中の Pod のリソースリクエストが取得できます。

:pencil: Kubernetes 1.20: Metrics Changes と SIG Instrumentation の変更内容 で詳細に解説されているので参照してください。 簡単に解説すると、次のとおりです。

  • Podは複数のContainer、複数にinitContainerから成るため、Pod全体としてのリソース要求量のメトリクスはこれまで出力されていませんでした。
  • kube-state-metricsではコンテナ毎のリソース要求量のメトリクスを出力しているため、それらのメトリクスを使って計算することは可能でしたが、クエリが複雑になってしまう & 計算オーバーヘッドも大きいという課題がありました
    • しかも、正確に計算しようとすると、specで指定されているPod Overhead(Runtime ClassのOverhead)やEphemeral Volume, Hugepages等の要求量等も加味しなくてはいけません。
    • また、自分自信で記述したクエリ結果がschedulerが使っている値と一致している保証は自分で確保しなければならないため正確なキャパシティプランニングが困難な状態でした1
  • このエンドポイントは、schedulerが算出したPodとしての要求量(requests/limits)を返してくれるため、メトリクス計算のオーバーヘッドを軽減でき、かつ信頼できるメトリクスを使えるようになります。
  • 現時点ではfeature stateはalphaです。

Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)

:pencil: ありません。

Deprecation (非推奨)

:pencil: ありません。

API Change (API の変更)

Feature (機能)

  • DefaultPodTopologySpread feature gateがBeta になりました。このfeature gateはデフォルトでenabledになります。(#95631, @alculquicondor) [SIG Scheduling and Testing]
  • デフォルトscheduler pluginの順序が変更され、 taintやnode affinityが使われている場合のschedule/preemption latencyが改善されます。(#95539, @soulxu) [SIG Scheduling]
  • resourceVersion が同一のPodのUpdateイベントを無視するようになりました。(#96071, @Huang-Wei) [SIG Scheduling]
  • Scheduling Framework: PostFilterextention pointで利用可能なPreemptionHandleRun[Pre]ScorePlugins関数が公開されるようになりました。(#93534, @everpeace) [SIG Scheduling and Testing]

    • :pencil: 1.19からScheduling FrameworkにおいてPostFilterというextention pointが導入されました。このextention pointは主にPreemptionロジックをカスタムするための導入です。Preemptionは高優先度のPod(Preemptorと呼ばれます)をスケジュールするために、いくつかの低優先度のPod(Victimと呼ばれます)を選出し停止する、という処理を行います。その際に、scheduling profileで指定された Filter/Score 関数3を呼び出したい場合があります。

      • Filter: Vicitmを選出するために、Victim候補を停止した後の仮想的なNodeに対してPreemptorがFitするかどうか?を判別するため
      • Score: 複数のNodeでVictim候補が選ばれた際に、どのNodeを最終的なVictimとして選出すべきか?つまりPreemptorをどのVictim Nodeにスケジュールすべきか?を評価するため

      です。1.19ではPreemptionHandle経由で公開されたいたのはFilter関数のみで、Score関数は公開されていませんでした。このため、Preemptor Podがvictim候補ノードを選ぶ際に設定されているscheduling profileと整合性の取れたNodeを選ぶことが困難でした4。この変更はPreemptionHandleScore関数を公開する変更です。この変更によって、ユーザの定義したscheduling profileとより整合性の取れたカスタムPostFilterPluginの実装が可能になります。

  • DefaultPodTopologySpreadがenabledの場合、SelectorSpreadPriority pluginはPodTopologySpreadpluginに変換されるようになります。(#95448, @alculquicondor) [SIG Scheduling]

Failing Test (失敗しているテスト)

  • "validates that there is no conflict between pods with same hostPort but different hostIP and protocol" というConformance Testのテストケースで、テストに加えて各 hostPort への接続性の検証も行うようにしました。(#96627, @aojea) [SIG Scheduling and Testing]

Bug or Regression (バグまたはリグレッション)

:pencil: backportされていないバージョンを利用している方はご注意ください⚠️

  • LocalStorageCapacityIsolation feature gateがdisabledな際にschedulerがそれを考慮しない問題を修正しました。(#96092, @Huang-Wei) [SIG Scheduling]
    • :pencil: LocalStorageCapacityIsolation feature gateはデフォルトでenabledで、disabledにするケースは少ないと思われますが、disabledな場合、Podのephemeral volumeはschedulingにおいては無視されるべきなのですが、考慮してしまっていたというバグです。この修正はv1.19.4, v1.18.11にもbackportされています。
  • (legacy) scheduler policyを利用した場合に、DefaultPreemption Pluginがdisabledになってしまう問題を修正しました。(#96439, @Huang-Wei) [SIG Scheduling and Testing]
    • :pencil: Scheduling Policies(現在legacy扱い)を使ってkube-schedulerを設定すると、Preemptionが全く無効になってしまうバグの修正です。この修正はv1.19.5にもbackportされています。
  • Podよりも前にそのNodeが削除された時、scheduler内部のcache snapshotが不整合になってしまう問題を修正しました。(#95130, @alculquicondor) [SIG Scheduling]

Other (その他の修正)

  • Scheduler metricsエンドポイントへのリクエストが認証できない場合のメッセージを修正しました。(#94035, @zhouya0) [SIG Scheduling]
    • :pencil: 内部実装でlegacyschemaを利用し続けたいたのが原因で、認証エラーの際に、認証エラーとは無関係のエラーがレスポンスされていたのですが、この修正で正しい認証エラーメッセージがレスポンスされるようになりました。
  • kube-schedulerスタート時に処理されたcomponent configがログとして出力されるようになりました。(#96426, @damemi) [SIG Scheduling]
    • :pencil: 便利ですね!
  • Scheduler framework interfaceがpkg/scheduler/framework/v1alphaからpkg/scheduler/frameworkに移動しました。 (#95069, @farah) [SIG Scheduling, Storage and Testing]

:pencil: おまけ

Scheduling Framework登場以降、かなり柔軟にカスタムスケジューラがkubernetesをforkせずに開発ができるようになってきており、kubernetes-sigs/scheduler-pluginsにいくつかPlugin拡張が公開されています。ぜひ見てみると良いと思います!


  1. Nodeの空き容量メトリクスも出してほしいですね。 

  2. 正確には同一の service, replication controller, replica set or stateful set配下のPodに限られます 

  3. 一般には複数のPluginが合成された関数になります 

  4. kube-schedulerにおけるDefaultPreemption PluginはprofileのScore関数を考慮せず、VictimのPDB違反数、最大優先度の値、優先度の和、といった指標でVictim Nodeを一つにしぼっています、v1.19においては、default preemptionロジックのplugin化にフォーカスされたため、Score関数の公開は行われなかったという背景があります。ここからも分かる通り、default preemptionは、カスタムScore Pluginを利用して、できるだけPodを効果的にPackingしたいと言うような場合に不都合が発生する場合があります。 

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2