KubeSchedulerConfigrationのv1beta3(Kubernetes v1.23)で追加されるMulti-point plugin configurationについて

December 06, 2021

こんにちは。この記事はKubernetes scheduler pluginsの記念すべき 1 日目の記事にしようと思ったけど、やっぱりやめたボツ記事です。1 日目はまた別で書きます。(遅い)

この記事では(SSIA ですが)、リリース目前の Kubernetes v1.23 で KubeSchedulerConfigration の v1beta3 に追加される Multi-point plugin configuration について解説します。

前提知識

Kubernetes の Scheduler は KubeSchedulerConfiguration を通して、カスタマイズすることができます。

https://kubernetes.io/docs/reference/scheduling/config/

また、Scheduler は Scheduling Framework というものに基づいて動作しており、Scheduler のそれぞれの機能はそれぞれプラグインとして独立した形で実装されています。KubeSchedulerConfiguration ではそれらのプラグインの有効/無効などの設定も行うことができました。

https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/

背景

Scheduling Framework には拡張ポイントというものが複数存在し、プラグインは一つ以上の拡張ポイントで動作することになります。

KubeSchedulerConfiguration ではそれらのプラグインの有効/無効などの設定も行うことができました。

と言いました。これまで(v1beta2)の設定方法を見てみましょう。

apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
  - plugins:
      score:
        disabled:
          - name: PodTopologySpread

このような感じです。「元々デフォルトで score 拡張点で動作している PodTopologySpread を score 拡張点で動作しないようにする」というのがこの設定の意味です。

しかし、実際には PodTopologySpread は他の拡張点でも動作しています。そのためこの設定だけでは PodTopologySpread を完全に無効化することはできていません。もちろん「PodTopologySpread が他の拡張点で動いているのはいいんだけど、Score 拡張点で動作しているのだけは気に食わない」といった場合はこのような設定をすることになるのですが、実際のユースケースとしては PodTopologySpread 全体を完全に無効化したいといった場合がほとんどだと思います。

PodTopologySpread 全体を完全に無効化したい場合は v1beta2 では以下のように書く必要があります。

apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
  - plugins:
      prescore:
        disabled:
          - name: PodTopologySpread
      score:
        disabled:
          - name: PodTopologySpread
      prefilter:
        disabled:
          - name: PodTopologySpread
      filter:
        disabled:
          - name: PodTopologySpread

め、めんどい…

「PodTopologySpread を無効化する場合、PodTopologySpread がどの拡張点で動作しているかをユーザーが把握する必要がある」という点が問題ですね。 また、PodToplogySpread が途中で preBind 拡張点でも動作するようになった場合に、ユーザーが手作業で preBind 拡張点を無効化する設定を変更しなければいけません、こっちも大変ですね。

Multi-point plugin configuration

ドキュメントの変更を見てもらえればそれが全てなのですが、折角なので少し説明して終わりたいと思います。

Multi-point plugin configuration ではこのように記述します。

apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
          - name: MyPlugin

この記事の執筆時点ではまだドキュメントの変更は行われていませんが、そのまま website への PR から持ってきています ref. v1.23 リリース後にこのドキュメントが更新されるはず。

見ての通りプラグインごとにまとめて管理できるようにしたmultiPointが yaml に追加されています。 この例ではまとめてMyPluginが有効になっています。

このように書けるようになった事でユーザーはどの拡張点で動作しているプラグインなのかを意識する必要がなくなり、前述したデメリット達が解決されます。

  • ユーザーはプラグインを完全に無効化したい時、multiPoint を通して disable すれば、どの拡張点で動作しているのかを意識せずとも無効化することができる
  • プラグインが新たに別の拡張点で動作することになった時も、multiPoint で設定していれば設定を変更する必要はない。

などですね。ちなみに個別の拡張点での設定は引き続き使用することができ、優先度は multiPoint よりも高くなっています。

apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: non-multipoint-scheduler
    plugins:
      multiPoint:
        enabled:
          - name: "MyPlugin"
      preScore:
        disabled:
          - name: "MyPlugin"
      score:
        disabled:
          - name: "MyPlugin"

そのため、このように書くことで、MyPlugin は preScore や score では無効化され、それ以外の拡張点でのみ動作することになります。

終わりに

ということで v1.23 における小ネタでした。僕は卒論の執筆に戻ります..

このエントリーをはてなブックマークに追加