はじめに
Kubernetes 1.21がリリースされましたね
今回SIG Schedulingの変更は少なめなのですが、
今回もKubernetes v1.21のCHANGELOGをベースにSIG Schedulingに関する機能について紹介します。
個人的に今回の変更で特筆すべきものは下記3つかなと思います。
- Storage Capacity Tracking:
VolumeCapacityPriority
feature(alpha) で statically provisionedなvolumeのcapacityを考慮してNodeを選べるようになった - Scheduler extenderのfilterフェーズにおいて
Unresolvable
nodeが返せるようになった -
PreferNominatedNode
featureでpreemption時にパフォーマンスが向上した
下記 がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
What's New (新情報)
Storage Capacity Tracking
従来、KubernetesのSchedulerは追加のPersistentVolumeがクラスタ内のどこでも利用可能であり、容量が無制限であるという仮定に基づいています。
トポロジーの制約は前者に対応していましたが、これまでは残りのストレージ容量が新しいポッドを起動するのに十分でない可能性を考慮せずにPodのスケジューリングが行われていました。
ストレージのキャパシティトラッキングがその問題に対応します。CSI driverへストレージキャパシティをレポートするためのAPIを追加し、PodのためのノードをSchedulerが選択する時にその情報を利用します。
- Storage - Storage Capacity (FEATURE STATE: Kubernetes v1.21 [beta])
この機能は、ローカルボリュームや、より容量に制約のある他のボリュームタイプのダイナミックプロビジョニングをサポートするための足がかりとなります。
実際に対応された機能についてはFeaturesの節で後述します。
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
ありません。
Deprecation (非推奨)
- 非推奨だった
scheduling_algorithm_preemption_evaluation_seconds
,binding_duration_seconds
というメトリクスが削除されました。代替として、scheduler_framework_extension_point_duration_seconds
の利用を推奨します。(#96447, @chendave) [SIG Cluster Lifecycle, Instrumentation, Scheduling and Testing]-
scheduler_framework_extension_point_duration_seconds
メトリクスにはextention_point
,status
,profile
ラベルが付与されます。
-
API Change (API の変更)
-
bazelによるKubernetesビルドサポートを削除。(#99561, @BenTheElder) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows]
-
Scheduler extenderのfilterインターフェースにおいて、
ExtenderFilterResult
structに新しく追加されたFailedAndUnresolvableNodes
フィールドによって、スケジュール不可能かつ解決不能なノード(unresolvable failed nodes)を報告できるようになりました。このMap内のノードはpreemptionフェーズでは無視されます。(#92866, @cofyc) [SIG Scheduling]- Schedulerでは、nodeのfilter時において、filter失敗(failed)と解決不能(unresolved)を区別しており、unresolvedなnodeはpreemption時にvictim検索から除外されます
-
これまでのscheduler extenderにおけるfilterでは、schedule不能なnodeを
FailedNodes
というフィールドで返すことができましたが、そもそもNodeがnot readyな場合等の解決不能(Unresolved)なnodeと区別することが不可能でした。 -
この変更によって
FailedAndUnresolvableNodes
フィールドを使って、そのようなnodeを単にスケジュール不可能なノードと区別して返答できるようになり、効率よくpreemptionが実行できるようになりました。
-
PodDisruptionBudget API が
policy/v1
に昇格しました。schemaの変更はありません。唯一の機能変更は、空のセレクター({}
)が、該当namespaceの全podを選択するようになった事です。policy/v1beta1
APIの振る舞いは変更はありません。policy/v1beta1
PodDisruptionBudget APIは非推奨になり、1.25+では提供されなくなります。(#99290, @mortent) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Scheduling and Testing]
Feature (機能)
-
Schedulerにおいて、複数のトポロジーに跨って静的にprovisionされたPVのうち、サイズが最もマッチするノードを優先度付けするalpha feature
VolumeCapacityPriority
を追加しました。(#96347, @cofyc) [SIG Apps, Network, Scheduling, Storage and Testing]- KEP-1845: Prioritization on volume capacity
- 例えば、下記のように2つのノードにそれぞれLocal Volumeが宣言されているとします。
-
vol-1
:capacity.storage=10Gi
onnode-1
(bynodeAffinity
) -
vol-2
:capacity.storage=2Gi
onnode-2
(bynodeAffinity
) -
このとき、
requests.storage=1Gi
をもつPVCをvolumeとするPodをスケジュールする場合、従来であればどちらが選ばれるかを制御できなかったところ、このfeatureをONにすることで、node-2
が選択されやすくなります(schedule時のnode優先度が高くなります)。これによってVolumeの利用効率が向上します。 - Amazon EBSのようなcloud storageでもstatic provisionedなvolumeであればnode topology(e.g. availability zone)を考慮してスコアリングされます
-
Kube-schedulerが
--v=4
でpluginによるscoreサマリをlog出力するようになりました。(#99411, @damemi) [SIG Scheduling]-
出力例→
"Top 3 plugins for pod on node" pod="default/mypodcn84p" node="kind-worker2" scores=[{Plugin:NodePreferAvoidPods Score:1000000 AverageScore:1e+06} {Plugin:PodTopologySpread Score:200 AverageScore:200} {Plugin:InterPodAffinity Score:100 AverageScore:52.333333333333336}]
-
出力例→
-
PreferNominatedNode
featureを有効することで、preemptionが頻繁に発生する状況でschedulingのパフォーマンスが全体的に向上します。しかし、この機能を有効にしても、最適な候補ノードにscheduleされない場合があります。(#93179, @chendave) [SIG Scheduling and Testing]- [KEP-1923: Prefer Nominated Node](KEP-1923: Prefer Nominated Node)
- schedulerにおいて、preemptionは、2 scheduling cycleを伴います。
-
最初のcycleでは、victim podを停止し、victim podが動いていたnodeを
.status.nominatedNodeName
フィールドに設定する。preemptor podはscheduler内部のqueueにrequeueされる。 - 次のcycleは、preemptor podを通常通りスケジュールするcycleです(前のcycleでvictimを停止しているのでschedule可能なことが期待できるだけで、victimノードにスケジュールされることは保証していません)。
- この変更は、後者のサイクルにおける変更です。従来は、preemptorをスケジュールする際、通常どおり、nominatedNode以外のノードも含めて通常通り評価(filter→score)しスケジュール先ノードを決定していましたが、これだと大規模なクラスタでは時間がかかります。
-
この機能を有効にすることで、
.status.nominatedNodeName
フィールドを優先してノード評価するようになります(つまりこのノードがスケジュール可能なら他のノードは見ないでここにbindする)。 - もしこのノードに適合しない場合、scheduling cycleは通常通りクラスタ内の残りのノードを評価します。
-
NodeAffinity
pluginがPreFilter
拡張を実装することでFilter
フェーズのパフォーマンスを向上しました。 (#99213, @AliceZhang2016) [SIG Scheduling]-
Nodeの状態はscheduling cycleに渡って変更されることが無いため、
NodeAffinity
の計算をPreFilter
時に一度だけ計算し、CycleState
にキャッシュすることによって効率を向上しています
-
Nodeの状態はscheduling cycleに渡って変更されることが無いため、
Documentation
ありません。
Failing Test (失敗しているテスト)
ありません。
Bug or Regression (バグまたはリグレッション)
-
InterPodAffinity
Pluginのスコアがより強く区別されるようになりました。(#98096, @leileiwan) [SIG Scheduling]-
これまで
InterPodAffinity
Pluginの出力するスコアの計算方法(Normalize時の値域が広くなった)が変更され、node選択により色濃く反映されるようになりました。
-
これまで
-
VolumeBindingArgs
でBindTimeoutSeconds
をゼロで設定できるようになりました。ゼロを設定すると、volume binding操作のチェックをまたなくなります。(#99835, @chendave) [SIG Scheduling and Storage]
Other (その他の修正)
- v1.17でGAになった
CSINodeInfo
feature gateが無条件にenabledになり、--feature-gates
引数に指定できなくなりました。 (#96561, @ialidzhikov) [SIG Apps, Auth, Scheduling, Storage and Testing] - デフォルトの委任認可オプションでは、
healthz, readyz, and livez
への非認証アクセスを許可するようになりました。また、system:masters
ユーザからの接続では認可チェックを行わないようになりました。 (#98325, @deads2k) [SIG API Machinery, Auth, Cloud Provider and Scheduling] - RotateKubeletClientCertificate, AttachVolumeLimit, VolumePVCDataSource and EvenPodsSpread` feature gateが無条件にenabledになり、componentから指定できなくなりました。 (#97306, @gavinfish) [SIG Node, Scheduling and Storage]
- これらのfeature gateは既に全てGAとなっています。