LoginSignup
3
2

More than 1 year has passed since last update.

Kubernetes 1.23: SIG Scheduling の変更内容

Last updated at Posted at 2022-01-05

はじめに

Kubernetes 1.23がリリースされましたね :tada:

今回もKubernetes v1.23のCHANGELOGをベースにSIG Schedulingに関する機能について紹介していきます。

過去の変更内容:
- Kubernetes 1.22: SIG Scheduling の変更内容
- Kubernetes 1.21: SIG Scheduling の変更内容
- Kubernetes 1.20: SIG Scheduling の変更内容

所感

v1.23では設定周りの変更が入った程度で、それ以外はバグ修正,メトリクス周りの修正程度で目立ったものはありませんでした。

  • kubescheduler.config.k8s.io/v1beta3が追加されました。
    • multiPoint fieldの登場によってscheduler pluginが簡単・安全に有効化/無効化できるようになります。
    • TaintTolerations, NodeAffinity, InterPodAffinityPluginのデフォルト重みの増えます。これによってPreferNoScheduleなEffectを持つTaintへのTolerationや、preferredDuringSchedulingIgnoredDuringExecutionなaffinityがこれまでよりも効きやすくなります。
  • kubescheduler.config.k8s.io/v1beta1が削除されました。
  • legacyなscheduler policy configが削除されました。

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

What's New (新情報)

Simplified Multi-point plugin configuration for scheduler

kube-schedulerは複数の拡張点(extension point)を持つPluginの設定を単純化できるmultiPoint設定フィールドを追加しました。このフィールドは、管理者がschedulerをシンプルに設定できるようにすることを目的としています。

multiPointフィールドで有効化されたpluginは、自動的に実装されているすべて拡張点をschedulerに登録します。たとえば、ScoreとFilterという拡張点を実装しているpluginは、双方同時にenabledできるようになります。これによって、拡張点を個別のenables/disabledを手動で編集せずに、全てのpluginをenabled/disbledすることができるようになります。これらの拡張点を個別に設定する方式は、ほとんどのユーザーにとって無関係であるため、抽象化されました。

:pencil: kube-schedulerはScheduling Frameworkに基づいて動作していて、各機能はPluginという形で実装されています。それらのPluginはKubeSchedulerConfiguration を通して、有効化/無効化できるようになっています。各PluginはScheduling Frameworkの拡張点(extension point)を実装するのですが、これまではユーザの意図とはあまり関係のない拡張点の単位で設定を有効化/無効化する必要があり設定が煩雑でした。また設定を誤って一部の拡張点でしか設定しないと、Pluginが意図しない動作をする可能性すらありました。multiPointフィールドを使うと拡張点単位ではなくPluginごとに有効化/無効化の設定ができるため、単純かつ安全になりました。

:pencil:multiPoint を使わない場合 → ユーザはPluginをenabled/disabledしたいのであって拡張点にあまり興味はないはずなのに、拡張点ごとにenabled/disabledしなきゃいけなくて、すごく面倒くさい。間違うと誤動作する可能性すらある。
# v1beta2(multiPoint使えない)場合
# 例えば、デフォルトで有効になっているPodTopologySpreadを外す場合
# 実装している拡張点すべてでenabled/disabledする必要がある
# (しかも間違うと意図しない動作する可能性すらある)
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
---
#自作のPluginを利用する際にも、
# 実装している拡張点毎にenabledする必要がある
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
  - plugins:
      score:
        enabled:
          - name: MyPlugin
      filter:
        enabled:
          - name: MyPlugin

:pencil:multiPointを使う場合 → Pluginごとに簡単かつ安全にenabled/disabledできて便利!
# v1beta3のmultiPointを使う場合
# すべての拡張点を適切にenabled/disabledしてくれる
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - plugins:
      multiPoint:
        enabled:
          - name: MyPlugin

:pencil: "KubeSchedulerConfigrationのv1beta3(Kubernetes v1.23)で追加されるMulti-point plugin configurationについて"でも詳細に解説されているので参照してください。

Structured logging graduate to Beta

構造化ロギングがBetaマイルストーンに到達しました。kubeletとkube-schedulerの多くのログメッセージが構造化ロギングに変換されました。ユーザはJSON出力を試したり、構造化テキストフォーマットをパースしたりして、multi-line文字列の処理といったopen issueについてのフィードバックを行うことが推奨されています。

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

:pencil: ありません。とはいえ、action requiredな変更がいくつかあるので注意です。

Deprecation (非推奨)

  • [ACTION REQUIRED] Kube-scheduler: --port,--addressフラグは何の効果もなくなり、v1.24で削除されます。insecure portフラグである--portは0しか指定できなくなります。また、 kubescheduler.config.k8s.io/v1beta1metricsBindAddress, healthzBindAddress fieldsは指定しても効果がなく、空であることが期待されます。そして、kubescheduler.config.k8s.io/v1beta2では完全に削除されます。加えて、下記に注意してください:
    • kube-schedulerは--authorization-kubeconfig and --authentication-kubeconfigが正しく設定された状態でスタートしなければなりません。
    • kube-schedulerのliveness/readiness probesはHTTPSを使わなければなりません。デフォルトポートが10259に変更になります。
    • kube-schedulerのメトリクスにアクセスするApplicationは /metrics nonResourceURLsへのアクセスが許可されたservice accountを使う必要があります。(#96345, @ingvagabund) [SIG Cloud Provider, Scheduling and Testing]
  • deprecatedなscheduler_volume_scheduling_duration_secondsメトリクスが削除されました。(#104518, @dntosas) [sig/scheduling,sig/storage,sig/instrumentation]

API Change (API の変更)

  • kube-apiserver: rbac.authorization.k8s.io/v1alpha1API が削除されます。v1.8以降利用可能な rbac.authorization.k8s.io/v1APIを使ってください。 scheduling.k8s.io/v1alpha1APIが削除されます。v1.14以降利用可能なscheduling.k8s.io/v1APIを使ってください。(#104248, @liggitt) 
  • v1beta3 APIが追加されました。このバージョンでは
    • ユーザが指定できるnode priorityのweightが増えます。TaintTolerationsが3に、NodeAffinityが2に、InterPodAffinityが2になります。
    • HealthzBindAddress, MetricsBindAddress fieldsが削除されます。
    • :pencil: v1beta2まではすべてこれらのScore pluginのweightは1でした。v1beta3からこれらのNodeScoreがより強く影響するようになります。PreferNoSchedule effectなTaintや、preferredDuringSchedulingIgnoredDuringExecutionなaffinityを使っている際に影響を受けます。
    • :pencil: v1beta3では設定項目の変更は殆どなく、上記の重み変更によるデフォルト設定でのbreaking changeに伴うversion bumpとなっています。
  • Action Required: kube-scheduler: 設定ファイルバージョンv1beta1が削除されます。v1.23に更新する前にv1beta2(xref: https://github.com/kubernetes/enhancements/issues/2901) もしくはv1beta3に更新してください。(#104782, @kerthcet)
  • KubeSchedulerConfigurationは新しくMultiPointフィールドを提供します。このフィールドによって各プラグインが対応しているextension pointを適切に登録することができるようになります。(#105611, @damemi) [SIG Scheduling and Testing]
  • Action Required: legacyなscheduler policy configはv1.23で削除されます。関連するpolicy-config-file, policy-configmap, policy-configmap-namespace and use-legacy-policy-configフラグも削除されます。Component Config に移行してください。詳細は https://kubernetes.io/docs/reference/scheduling/config/ を参照してください。(#105424, @kerthcet)

Feature (機能)

  • VolumeBinding pluginで、ClaimLostフェーズのPVCをUnschedulableAndUnresolvableとして処理するように改善しました。(#105245, @yibozhuang)
  • pending_pods, preemption_attempts_total, preemption_victims and schedule_attempts_totalメトリクスがstableにgraduateしました。 また、e2e_scheduling_duration_secondsscheduling_attempt_duration_secondsにリネームされ、stableにgraduateしました。(#105941, @rezakrimi) [SIG Instrumentation, Scheduling and Testing]
  • Jobが未スタートかつsuspendな場合にのみ、Node affinity, Node selectors, and tolerationsがmutableになりました。(#105479, @ahg-g)
  • RequestedToCapacityRatio ScoringStrategyを利用する際、空のshapeはエラーになります。(#106169, @kerthcet) [SIG Scheduling]
  • kube-schedulerは--v<10でも nodeのscoreをログ出力するようになります。--v=4,5ではtop 3 nodeのtop 3 pluginのスコアを、--v=6,7,8,9ではtop 6 nodeのすべてのpluginのスコアを出力します。(#103515, @muma378)

Documentation

  • pod_scheduling_duration_seconds, pod_scheduling_attempts, framework_extension_point_duration_seconds, plugin_execution_duration_seconds and queue_incoming_pods_totalメトリクスがstableにGraduateしました。(#106266, @ahg-g) [SIG Instrumentation, Scheduling and Testing]

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

:pencil: ありません。

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

  • 一時的な故障によってschedulerがPodの削除イベントを観測できなかった場合でもscheduelr cacheからPodが削除される様に修正しました。(#106102, @alculquicondor) [SIG Scheduling]
  • requestsを持たないようなpodが存在するnodeにおけるNodeResourcesBalancedAllocationscoring pluginsの挙動を修正しました。 (#105845, @ahmad-diaa)
    • :pencil: NodeResourcesBalancedAllocation scoring pluginでは、requestsが空のpodについては、scheduler defaultのepsilon量をrequestsとして計算していましたが、これだと、zero requestsのpodが大量にある場合にbalanceしないという問題を修正しています。(#105220)
  • nodeがzoneラベルを持たない場合のtopology spreadingのシステムデフォルトの設定を修正しました。この修正によってデフォルトでPodが分散されるようになります。 (#105046, @alculquicondor)
    • :pencil: Kubernetes 1.19以降、PodTopologySpreadのシステムデフォルト設定ではnodeがkubernetes.io/hostname, topology.kubernetes.io/zoneの両ラベルを持っていることを想定しており、オプレミスクラスタ等でzoneラベルがないnodeがあるとPodTopologySpreadが期待通り動作しなかった問題を修正しています。(#102136)
    • :pencil: v1.20, v1.21, v1.22にbackportされています。
  • 改行やエスケープを含むようなkube-schedulerの設定ファイルをログ出力する際の可読性を改善しました。(#106228, @sanchayanghosh) [SIG Scheduling]
  • schedulerのnode limitsとkubeletのhostpath checkでgeneric ephemeral volumesが適切に処理されていなかったのを修正しました。(#100482, @pohly)
  • kube-schedulerで未定義のフラグを指定した場合にusageメッセージを出力しないようになります。(#104503, @sanposhiho) [sig/scheduling]
  • メトリクスの変更: scheduler_volume_scheduling_duration_seconds_bucketメトリクスで公開されているBucketを修正しました。(#100720, @dntosas)
    • :pencil: このhisotogramメトリクスのバケットの最小値が1000秒になってしまっており、1000秒未満の値も1000秒として報告されていたのが修正されました。
  • Schedulerのリソースメトリクスにおいて2進接頭辞を使っている場合(2.5Gi, 1.1Ki)にリソース量が非常に小さな値として報告されていたのを修正しました。(#103751, @y-tag) [sig/scheduling,sig/api-machinery]
  • schedulerで--leader-elect*CLI argsが有効になるように修正しました。 (#105915, #105712, @Huang-Wei)
  • pods/bindingサブリソースがPodのmetadata.uidmetadata.resourceVersionを参照する用になります。(#105913, @aholic)

Other (その他の修正)

:pencil: ほとんどがstructured loggingに対応するPRです

  • Schedulerで、PersistentVolumeClaimをbindするPersistentVolumeが存在しないことが原因でnodeが選択されなかった場合のエラーメッセージを改善しました。(#105196, @yibozhuang)
  • pkg/scheduler/framework/plugins/interpodaffinity/filtering.go,pkg/scheduler/framework/plugins/podtopologyspread/filtering.go, pkg/scheduler/framework/plugins/volumezone/volume_zone.goをstructured loggingに移行しました。(#105931, @mengjiao-liu)
  • pkg/schedulerをstructured loggingに移行しました。 (#99273, [@yangjunmyfm192085(https://github.com/yangjunmyfm192085))
  • cmd/kube-scheduler/app/server.go, pkg/scheduler/framework/plugins/nodelabel/node_label.go, pkg/scheduler/framework/plugins/nodevolumelimits/csi.go, pkg/scheduler/framework/plugins/nodevolumelimits/non_csi.goをstructured loggingに移行しました。 (#105855, [@shivanshu1333]
  • pkg/scheduler/framework/plugins/volumebinding/assume_cache.goをstructured loggingに移行しました。 (#105904, @mengjiao-liu) [SIG Instrumentation, Scheduling and Storage]
  • pkg/scheduler/framework/preemption/preemption.go, pkg/scheduler/framework/plugins/examples/stateful/stateful.go,pkg/scheduler/framework/plugins/noderesources/resource_allocation.goをstructured loggingに移行しました。 (#105967, @shivanshu1333) [SIG Instrumentation, Node and Scheduling]
  • schedulerのファイル cache.goをstructured loggingに移行しました。 (#105969, @shivanshu1333) [SIG Instrumentation and Scheduling]
  • schedulerのファイルcomparer.go, dumper.go, node_tree.goをstructured loggingに移行しました。 (#105968, @shivanshu1333) [SIG Instrumentation and Scheduling]
3
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
3
2