2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kubernetes 1.25: SIG Scheduling の変更内容

Last updated at Posted at 2022-09-26

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

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

過去の変更内容:

1.25変更点の所感

  • v1.24に引き続きPod Topology Spread関連の機能追加が目玉となっています。
    • NodeInclusionPolicy
    • EnableMatchLabelKeysInPodTopologySpread
  • kube-schedulerのComponentConfigがGAしkubescheduler.config.k8s.io/v1が利用可能になりました。
  • それ以外は軽微なものばかりです。

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

:new: What's new! (新情報)

:pencil: ありません

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

:pencil: ありません

:wastebasket: Deprecation(非推奨)

:pencil: ありません

:earth_asia: API Changes(API変更)

:pencil: NodeAffinityPolicy=Ignore, Honorの挙動の違い

おさらい

spec:
  topologySpreadConstraints:
    # 複数指定したらAND-ed
  - topologyKey: zone # zone単位で散らしたい(node label keyを指定できる. domainと呼びます)
    maxSkew: 1        # 各zoneに居るlabelSelectorにマッチする
    labelSelector:    # このselectorにマッチするpod数の偏りは1以内にしたい
      matchLabels:
        foo: bar
    whenUnsatisfiable: DoNotSchedule # maxSkewを満たせない場合はscheduleしない
                                     # 'ScheduleAnyway'だと無視してスケジュールする
    # 今回追加されたのは下2つ
    nodeAffinityPolicy: Ignore|Honor # skewを計算する対象のnodeにpodのnode affinity/selectorを考慮するかどうか(default=Honor)
    nodeTaintsPolicy: Ignore|Honor   # skewを計算する時に対象のnodeにpodのtoleraitonを考慮するかどうか(default=Ignore)

シナリオ

4ノードが2つのゾーンに存在していて、zone1に2 pod, zone2に3 pod稼働しているとします。(label selectorは話を簡単にするために、全部マッチするとします。)。ここに、zoneに対するpod topology spreadと worker3に対するanti node-affinity(worker3にはスケジュールされない) をもったtest-podが作成されたとします。

zone zone1 zone2
node worker worker2 worker3 worker4
existingPods pod1 pod2 pod3, pod4 pod5
vacancy 空き無し 空き無し 空き有り 空き有り
test-podaffinity

NodeAffinityPolicy=Honor(default)の挙動

各nodeの対象pod数の計算の際、Podに指定されたnode-affinityにマッチするnodeだけが対象になります。すると、下記のようになるため、domain間のskewは 2(zone1)-1(zone2)=1 となり、zone2test-podをscheduleすれば、skewが下がるため、zone2にscheduleされようとします。test-podworker3へanti node-affinityを持っているため、結果としてworker4にスケジュールされます。

zone zone1 zone2
node worker worker2 worker3 worker4
existingPods pod1 pod2 pod3, pod4 pod5
vacancy 空き無し 空き無し 空き有り 空き有り
test-podaffinity
skew計算対象Pod数 1 1 対象外 1
zone毎Pod数 2 1
TopologySpreadの
zone選択
test-pod
最終的なschedule先

NodeAffinityPolicy=Ignoreの挙動

各nodeの対象pod数の計算は下記のようになるため、domain間のskewは 3(zone2)-2(zone1)=1 となり、zone1test-podをscheduleすれば、skewが下がるため、zone1にscheduleされようとしますが、zone1には空いているノードが存在しないため、test-podPendingになります。

zone zone1 zone2
node worker worker2 worker3 worker4
existingPods pod1 pod2 pod3, pod4 pod5
vacancy 空き無し 空き無し 空き有り 空き有り
test-podaffinity
skew計算対象Pod数 1 1 2 1
zone毎Pod数 2 3
TopologySpreadの
zone選択
test-pod
最終的なschedule先
なし
  • v1.25はGolang 1.19を使うようになります。このPRではGAがまだ利用できないため1.19rc2を使っています。(#111254, @dims)
  • Pod障害Policyに応じてPod障害を処理するようになりました (#111113, @mimowo)
  • DisruptionTarget Pod Condition Typeが導入されます. reason フィールドはpod停止の理由を示します:
  • kube-schedulerのComponentConfigがGAし、kubescheduler.config.k8s.io/v1が利用可能です。 v1ではSelectorSpreadPluginは削除されています。(#110534, @kerthcet)
  • Local Storage Capacity Isolationが1.25でGAになります。 root file systemをチェックできないシステム(rootless)では、 kubeletの--local-storage-capacity-isolation=falseを使って無効化してください。無効化されるとpodでlocal ephemeral storage request/limitやemptyDir sizeLimitが利用できなくなります. (#111513, @jingxu97)
  • NodeResourcesFit pluginのエラーメッセージにおいて、許可されているScoringStrategyTypeを表示するようになりました。(#111206, @SataQiu)
    • :pencil: plugin初期化時(kube-scheduler起動時)のエラーメッセージの改善です。
    • :pencil: E0718 07:13:34.754796 9974 run.go:74] "command failed" err="initializing profiles: creating profile for scheduler name default-scheduler: initializing plugin \"NodeResourcesFit\": scoring strategy XXXX is not supported, only [LeastAllocated MostAllocated RequestedToCapacityRatio] is accepted" と出るようになります
  • logging設定向けのGo APIがk8s.io/component-baseからk8s.io/component-base/logs/api/v1に移動しました。 設定ファイルのフォーマットはコマンドラインフラグはこれまでと同じです。(#105797, @pohly)
  • PodTopologySpreadがrolling upgrade時に尊重されるようになります。 (#111441, @denkensk)
    • :pencil: KEP-3243: respect pod topology spread after rolling upgrades
    • :pencil: feature gate: EnableMatchLabelKeysInPodTopologySpread (v1.25ではalpha)
    • :pencil: 解決したい現象
      • Deploymentをsurgeありでrolling updateすると、Topology SpreadがmaxSkewを越えてしまうことがありました。
      • 先に新しいReplicaSet Podが作成され、後から旧ReplicaSet Podが削除されますが、Pod Topology Spreadはscheduling時にしか有効じゃないので、古いReplicaSet Podが消されるときにmaxSkewを超えてしまう場合がありました。
      • ただ、通常Deployment配下のPodのPodSpec.ToplogySpread.LabelSelectorは新旧ReplicaSetを跨って同じになるので、ReplicaSet Pod毎にskewを計算するのは今のSpecだとできませんでした。
    • :pencil: 解決法
      • KEP-3243: respect pod topology spread after rolling upgradesで、「skewを計算するPodの集合」を定義する、PodSpec.TopologySpreadConstraint.MatchLabelKeysというAPIが導入されました。このフィールドに定義されているlabelの値が等しいものをskew計算のグループとして捉えるようになります。
      • 通常Deploymentで使う場合は matchLabelKeys: ["pod-template-hash"] で良いです。
      • こうするとReplicaSetそれぞれでskewが計算され、古いreplicasetは関係なくなります。

:sparkle: FEATURE(機能追加)

  • Feature gate CSIMigrationがenabledに固定され、CSIMigrationはGAになりました。このfeature gateはv1.27で削除予定です. (#110410, @Jiawei0227)
  • CSIMigrationAWSがGAに昇格し、trueに固定されました。 (#111479, @wongma7)
  • CSIMigrationGCEがGAに昇格し、trueに固定されました。(#111301, @mattcary)

:bug: バグ修正

  • Preemption(PostFilter)中にPluginメトリクスが記録されなかったバグを修正しました。 (#108727, @sanposhiho)
    • :pencil: 過去バージョンへはbackportされていません。
  • JobコントローラでactiveDeadlineSecondsの設定が有効にならないバグを修正しました。 (#110294, @harshanarayana)
    • :pencil: JobReadyPodsfeature gateが有効(v1.24以降でデフォルトで有効)な場合にactiveDeadlineSecondsを超えてもJob Podが削除されずに残るバグがありました。
    • :pencil: v1.22以降すべてのバージョンにbackportされています。
  • CSI migrationでinline volumesがattach limitとしてカウントされないバグを修正しました。(#107787, @Jiawei0227)
  • scheduler plugin開発者向けの変更: Scheduler Frameworkが提供するShared PodInformerが空のIndexerで初期化されるようになりました。これによってpluginはカスタムIndexerを追加できるようになります。 Indexerの追加はコンフリクトしない限りにおいて追加可能です。(#110663, @fromanirh)
    • :pencil: これまではIndexerがnilだったので、Indexerを使いたいためだけに、カスタムScheduling Pluginで自分でInformerを初期化していたのでとても便利になります。
    • :pencil: ただし、schedulerのShared Informerはnon-terminal podのみが対象なので注意してください。

:microscope: Other (その他の修正)

  • kube-scheduler ComponentConfig v1beta2はv1.25でdeprecatedになりました。 (#111547, @kerthcet)
2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?