はじめに
Kubernetes 1.23がリリースされましたね
今回も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, InterPodAffinity
Pluginのデフォルト重みの増えます。これによってPreferNoSchedule
なEffectを持つTaintへのTolerationや、preferredDuringSchedulingIgnoredDuringExecution
なaffinityがこれまでよりも効きやすくなります。
-
- __
kubescheduler.config.k8s.io/v1beta1
が削除__されました。 - __legacyなscheduler policy configが削除__されました。
下記 がついた文章は、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することができるようになります。これらの拡張点を個別に設定する方式は、ほとんどのユーザーにとって無関係であるため、抽象化されました。
kube-schedulerはScheduling Frameworkに基づいて動作していて、各機能はPluginという形で実装されています。それらのPluginはKubeSchedulerConfiguration を通して、有効化/無効化できるようになっています。各PluginはScheduling Frameworkの拡張点(extension point)を実装するのですが、これまではユーザの意図とはあまり関係のない拡張点の単位で設定を有効化/無効化する必要があり設定が煩雑でした。また設定を誤って一部の拡張点でしか設定しないと、Pluginが意図しない動作をする可能性すらありました。multiPoint
フィールドを使うと拡張点単位ではなくPluginごとに有効化/無効化の設定ができるため、単純かつ安全になりました。
`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
`multiPoint`を使う場合 → Pluginごとに簡単かつ安全にenabled/disabledできて便利!
# v1beta3のmultiPointを使う場合
# すべての拡張点を適切にenabled/disabledしてくれる
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- plugins:
multiPoint:
enabled:
- name: MyPlugin
"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(必ず一読してからアップグレードしなければならない事項)
ありません。とはいえ、action requiredな変更がいくつかあるので注意です。
Deprecation (非推奨)
-
[ACTION REQUIRED] Kube-scheduler:
--port
,--address
フラグは何の効果もなくなり、v1.24で削除されます。insecure portフラグである--port
は0しか指定できなくなります。また、kubescheduler.config.k8s.io/v1beta1
のmetricsBindAddress
,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]
- kube-schedulerは
- deprecatedな
scheduler_volume_scheduling_duration_seconds
メトリクスが削除されました。(#104518, @dntosas) [sig/scheduling,sig/storage,sig/instrumentation]
API Change (API の変更)
- kube-apiserver:
rbac.authorization.k8s.io/v1alpha1
API が削除されます。v1.8以降利用可能なrbac.authorization.k8s.io/v1
APIを使ってください。scheduling.k8s.io/v1alpha1
APIが削除されます。v1.14以降利用可能なscheduling.k8s.io/v1
APIを使ってください。(#104248, @liggitt) -
v1beta3
APIが追加されました。このバージョンでは- ユーザが指定できるnode priorityのweightが増えます。
TaintTolerations
が3に、NodeAffinity
が2に、InterPodAffinity
が2になります。 -
HealthzBindAddress
,MetricsBindAddress
fieldsが削除されます。 -
v1beta2
まではすべてこれらのScore pluginのweightは1でした。v1beta3
からこれらのNodeScoreがより強く影響するようになります。PreferNoSchedule
effectなTaintや、preferredDuringSchedulingIgnoredDuringExecution
なaffinityを使っている際に影響を受けます。 -
v1beta3
では設定項目の変更は殆どなく、上記の重み変更によるデフォルト設定でのbreaking changeに伴うversion bumpとなっています。
- ユーザが指定できるnode priorityのweightが増えます。
-
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]- What's New(新情報)の節参照
-
Action Required: legacyなscheduler policy configはv1.23で削除されます。関連する
policy-config-file
,policy-configmap
,policy-configmap-namespace
anduse-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
andschedule_attempts_total
メトリクスがstableにgraduateしました。 また、e2e_scheduling_duration_seconds
がscheduling_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]-
RequestedToCapacityRatio
はNodeにおけるrequests量に応じてスコアを自分自身で指定できる(shapeと呼ばれます)Pluginです。 - 参考: Resource Bin Packing for Extended Resources
-
-
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)- v1.21で--v=4以上で全ノードのtop 3 pluginの情報が出力されるようになりましたが、全ノードでログ出力は大規模クラスターではschedulerのパフォーマンスが50%ほど劣化すると報告されており(#103515)、段階的に出力内容を調整できるように修正されました。
Documentation
-
pod_scheduling_duration_seconds
,pod_scheduling_attempts
,framework_extension_point_duration_seconds
,plugin_execution_duration_seconds
andqueue_incoming_pods_total
メトリクスがstableにGraduateしました。(#106266, @ahg-g) [SIG Instrumentation, Scheduling and Testing]
Failing Test (失敗しているテスト)
ありません。
Bug or Regression (バグまたはリグレッション)
- 一時的な故障によってschedulerがPodの削除イベントを観測できなかった場合でもscheduelr cacheからPodが削除される様に修正しました。(#106102, @alculquicondor) [SIG Scheduling]
- requestsを持たないようなpodが存在するnodeにおける
NodeResourcesBalancedAllocation
scoring pluginsの挙動を修正しました。 (#105845, @ahmad-diaa)-
NodeResourcesBalancedAllocation
scoring pluginでは、requestsが空のpodについては、scheduler defaultのepsilon量をrequestsとして計算していましたが、これだと、zero requestsのpodが大量にある場合にbalanceしないという問題を修正しています。(#105220)
-
- nodeがzoneラベルを持たない場合のtopology spreadingのシステムデフォルトの設定を修正しました。この修正によってデフォルトでPodが分散されるようになります。 (#105046, @alculquicondor)
-
Kubernetes 1.19以降、PodTopologySpreadのシステムデフォルト設定ではnodeが
kubernetes.io/hostname
,topology.kubernetes.io/zone
の両ラベルを持っていることを想定しており、オプレミスクラスタ等でzoneラベルがないnodeがあるとPodTopologySpreadが期待通り動作しなかった問題を修正しています。(#102136) - v1.20, v1.21, v1.22にbackportされています。
-
Kubernetes 1.19以降、PodTopologySpreadのシステムデフォルト設定ではnodeが
- 改行やエスケープを含むような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)- このhisotogramメトリクスのバケットの最小値が1000秒になってしまっており、1000秒未満の値も1000秒として報告されていたのが修正されました。
- Schedulerのリソースメトリクスにおいて2進接頭辞を使っている場合(2.5Gi, 1.1Ki)にリソース量が非常に小さな値として報告されていたのを修正しました。(#103751, @y-tag) [sig/scheduling,sig/api-machinery]
- このバグの影響は、Kubernetes 1.20で導入された、scheduerの
/metrics/resources
endpointで公開されているkube_pod_resource_{request|limits}
のみです。backport等もされていないようです。 - 参考: Kubernetes 1.20: Metrics Changes と SIG Instrumentation の変更内容
- このバグの影響は、Kubernetes 1.20で導入された、scheduerの
- schedulerで
--leader-elect*
CLI argsが有効になるように修正しました。 (#105915, #105712, @Huang-Wei) -
pods/binding
サブリソースがPodのmetadata.uid
とmetadata.resourceVersion
を参照する用になります。(#105913, @aholic)
Other (その他の修正)
ほとんどが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]