LoginSignup
2
2

Kubernetes 1.30: SIG-Apps の変更内容

Last updated at Posted at 2024-04-26

はじめに

このページではKubernetes v1.30 における SIG-Apps に関連する変更内容をまとめています。

SIG-AppsはKubernetesのワークロードの扱いなどの変更を主に扱っているため、他のSIGと関係する変更が多くなっております。

SIG / SIG-Apps とは?
  • SIGとは?

    • Special Interest Groups の略称
    • 各 SIG には Subproject が与えられていて、 Subproject に対して独立して開発できるようになっています。
    • Kubernetes は巨大なプロジェクトなので、各SIG 毎に担当(Subproject)が割り当てられていて、各SIG は独立して開発をしています。
    • SIG 間を跨って話し合いをする必要が生じた場合は Working Groups が一時的に作られ、その枠組みの中で話し合うことになります。
  • SIG-Appsとは?

    • Apps Special Interest Group の略称
    • Kubernetes に対して、application を deploy したりすることに関することが対象。具体的には Pod, ReplicaSet, Deployments, DaemonSet, StatefulSet, Jobs, CronJob が対象。
      Kubernetes基礎_-_Google_Slides.png
    • 詳細について知りたい方はこちらをご参照ください。

注目の変更

Feature Gatesの中で今回Stageに変更のあったSig-Appsに関連する機能は以下になります。

今回新規された機能の詳細について以下で説明します。

Job

JobManagedBy

Job リソースの管理を既存の Job Controller ではなく、他のコントローラーに移譲できるように、Job のリソースに管理するコントローラーを指定するフィールドを追加します。

  • 関連情報
KEP KEP-4368
Feature stage Alpha
Feature Gate JobManagedBy
issue #4368
参考 公式ドキュメント

機能しては Ingeress に対する IngressClass や GatewayAPI における GatewayClass のような機能の Job リソース版になります。
Kueueのプロジェクトの中で、Job のリソースの管理を Kueue controller に移譲したい要望があり追加されました。

詳しい内容の説明 (クリックすると開きます)

JobManagedBy が有効化されている場合に spec.managedBy が利用できるようになります。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
+  managedBy: "kubernetes.io/job-controller"
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

kubernetes.io/job-controller は予約された文字列になっていて、これを指定した場合は Job リソースは既存の Job Controller で管理されます。Kueue などで利用する場合は、ここに移譲させたいコントローラーで指定された文字列を設定します。

該当のフィールドを利用するユースケースは、Kueue など Job リソースを操作するカスタムコントローラーを独自に用意する場合になります。

JobSuccessPolicy

Index 付きの Job 実行時の成功の条件を柔軟に設定できるようになります。

  • 関連情報
KEP KEP-3998
Feature stage Alpha
Feature Gate JobSuccessPolicy
issue #3998
参考 公式ドキュメント

Job で sepec.completionMode=Indexed ようにして、Index 付きの Job を実行する場合には、全ての Index 付き Pod の実行が成功しないと Job として成功になりませんが、成功とするための判定条件をもう少し柔軟に設定するための機能になります。

詳しい内容の説明 (クリックすると開きます)

sepec.completionMode=Indexed を指定して Index 付き Job を実行する場合に、sepec.successPolicy で成功の条件を追加することができます。

apiVersion: batch/v1
kind: Job
spec:
  parallelism: 10
  completions: 10
+  completionMode: Indexed
+  successPolicy:
+    rules:
+      - succeededIndexes: 0,2-3
+        succeededCount: 1
  template:
    spec:
      containers:
      - name: main
        image: python
        command:
          - python3
          - -c
          - |
            import os, sys
            if os.environ.get("JOB_COMPLETION_INDEX") == "2":
              sys.exit(0)
            else:
              sys.exit(1)            

successPolicy には以下の 2 つのルールを設定できます。

  • succeededIndexes : Index の番号を指定します。指定した index の番号の Pod の処理が成功したら Job を成功と判定します
  • succeededCount : 成功に必要な個数を指定します。index の番号付きの Pod の処理が成功した回数が指定した数を超えたら Job を成功と判定します。

successPolicy を利用する場合は 1つ以上のルールを設定する必要があり、最大で 20 個までルールを設定することができます。複数のルールが設定されている場合は、どれか 1 つのルールを満たした時点で Job は成功として判定されます。

v1.30 Release Notes

v1.30 Release Notes の中で SIG-Apps に関するものについて以下に和訳したものを記載します。

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

:wastebasket: Deprecation(非推奨)

なし

:earth_asia: API Changes(変更)

  • Job のフィールドに managedBy がアルファ機能として追加されました。 このフィールドは Job をカスタムできるもので、kubernetes.io/job-controller 以外の値が設定されている場合は job controller からスキップされ、フィールドで指定されている external controller でリコンサイルを実施するようになります。Job はこのフィールドに何も設定されていないか、 予約文字列である kubernetes.io/job-controller が指定されている場合に job controller によってリコンサイルが実施されます。
    (#123273, @mimowo) [sig/api-machinery,sig/apps,sig/testing]

    • :pencil: 新しくカスタムコントローラーを用意した上で、リコンサイルの対象のリソースを CRD で新たに定義せずに、既存の Job リソースを対象とした場合に使うフィールドになります。このフィールドによって、 既存の job controller と並行して独自に Job 用のコントローラーを用意することができるようになりました。
  • Job で SuccessPolicy がアルファ機能としてサポートされました。
    (#123412, @tenzen-y) [sig/api-machinery,sig/apps,sig/testing]

    • :pencil: index 付きの Job を実行する際の Job の成功条件をより柔軟に設定できるようになりました。
  • Dynamic Resource Allocation: DRA drivers は "structured parameters" を使用して、 scheduler がリソースの要求を割り当てできるようになりました。
    (#123516, @pohly) [sig/scheduling,sig/storage,sig/node,sig/api-machinery,sig/cluster-lifecycle,sig/auth,sig/apps,sig/cli,sig/instrumentation,sig/testing,sig/release]

  • StorageVersionMigration API は以前は CRD を利用していましたが、Kubernetes の built-in API となりました。
    (#123344, @nilekhc) [sig/api-machinery,sig/auth,sig/apps,sig/cli,sig/testing]

  • readOnly volumes は kernel versions >= 5.12 の場合に、再起的な read-only mounts をサポートするようになりました。
    (#123180, @AkihiroSuda) [sig/node,sig/api-machinery,sig/apps,sig/testing]

  • RelaxedEnvironmentVariableValidation feature gate がアルファで追加されました、この機能が有効化されている場合に Kubernetes で印字可能なすべての ASCII 文字が Pod 内の環境変数の名前に使用できるようになリます。 (#123385, @HirazawaUi) [sig/node,sig/apps,sig/testing]

  • trafficDistribution が Service の spec にアルファ機能のフィールドとして追加され、この設定は traffic の endpoints への分散を表現します。 ServiceTrafficDistribution feature gate 有効化することで利用できます。(#123487, @gauravkghildiyal) [sig/network,sig/api-machinery,sig/apps]

  • kube-controller-manager の CLI に disable-force-detach を追加しました。デフォルトでは false に設定されています。有効化された場合には maximum unmount time と node status の状態に応じて、強制的にボリュームがデタッチされます。実行された場合にはノード障害から復帰するために、non-graceful node shutdown 機能を使用しなければなりません。 また、リスクを冒して Pod 強制終了する場合には適切な VolumeAttachment オブジェクトを削除する必要があります。 (#120344, @rohitssingh) [sig/storage,sig/api-machinery,sig/apps,sig/testing]

  • AppArmor profiles は PodSecurityContext とコンテナの SecurityContext で設定できるようになりました。ベータの AppArmor annotations は非推奨になりました。 AppArmor status は node の ready condition に含まれなくなります。 (#123435, @tallclair) [sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing]

  • topology spread constraints の Pod の minDomains が GA になりました。 MinDomainsInPodTopologySpread feature gate は機能しなくなり、該当のフィールドは Pod と PodTemplate APIs で常に利用できるようになります。 (#123481, @sanposhiho) [sig/scheduling,sig/api-machinery,sig/apps,sig/testing]

  • PodSpec API の hostNetwork Pods から hostAliases がサポートされなくなります。 該当機能は v1.8 からサポートされていました。 (#122422, @neolit123) [sig/api-machinery,sig/apps]

:sparkle: Feature(機能追加)

  • Pod API ではアルファ機能である procMount フィールドに Unmasked 設定する場合は spec.hostUsers=false も設定する必要があるようになりました。
    (#123520, @haircommander) [sig/auth,sig/apps,sig/testing]

  • kubectl get job で Job の status が表示されるようになりました。
    (#123226, @ivanvc) [sig/apps,sig/cli]

  • HorizontalPodAutoscaler で per-container metrics が GA になりました。 (#123482, @sanposhiho) [sig/api-machinery,sig/autoscaling,sig/apps]

  • Pod の status.hostIPs フィールドが GA になりました。PodHostIPs feature gate は機能しなくなり、 Pod API の status.hostIPs フィールドは常に利用できるようになります。 (#122870, @wzshiming) [sig/network,sig/node,sig/apps,sig/testing]

:bug: Bug or Regression(バグ修正)

  • syncCronJob のエラーログの誤りを修正しました。
    (#122493, @mengjiao-liu) [sig/apps]

    • :pencil: エラー時に syncErr の変数に格納されるようになっていましたが、チェックする箇所が err の変数をチェックしていて、 syncErr のチェックが今まで漏れていたのが修正されました。
  • 更新中に PDB の状態を維持するために、disruption controller が PDB status への同期が修正されました。
    (#122056, @dhenkel92) [sig/apps]

    • :pencil: disruption controller が更新するときに、現状の Status.Conditions コピーして保持するように修正されました。これによって、disruption controller 以外で変更されているものが、同期によって削除されることを防ぐようになったようです。
  • restartPolicy が NeverOnFailure に設定されている Pod で containerRestartPolicy が Always に設定された init container の ステータスを terminated から non-terminated に更新できない不具合を修正しました。 (#123323, @gjkim42) [sig/node,sig/apps]

    • :pencil: 1.29 から beta になった Sidecar 機能に関する不具合の修正になります。
  • 不要な node events を無視するようにして、daemonset controller のパフォーマンスが良くなるように修正しました。 (#121669, @xigang) [sig/apps]

  • conditionType ready が誤ってパッチによって nil が設定された場合に、node lifecycle controller がパニックになる不具合を修正しました。 (#122874, @fusida) [sig/network,sig/node,sig/apps]

    • :pencil: NWプラグインや、node の conditionType を操作するカスタムコントローラーが誤って、nil を設定した場合に、node lifecycle controller がパニックになる可能性があるので、nil のチェックが追加されました。
  • volume source が CSI type かマイグレーションされた annotation がある静的にプロビジョニングした PV が削除される場合に PersistentVolume controller はその状態を Failed state に変更しません。 この patch を適用すると external provisioner は次の reconcile loop で finalizer を削除できるようになります。残念ながら、既に既存の PV が Failed state にこの patch の効果は適用されせん。 ユーザは手動で finalizer を削除する必要があります。 (#122030, @carlory) [sig/storage,sig/apps]

  • Persistent Volume Claims (PVCs) は storageClassName が空だった場合に、PersistentVolume controller 自動でデフォルトの StorageClass を設定しなくなります。
    (#122704, @carlory) [sig/storage,sig/apps]

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

なし

所感

今回の変更で Job の機能が新たに 2つ追加されることとなりました、また、sig-apps が所管ではないですが、Pod リソースに関する変更としては最近では SideCar や PreStop での Sleep を利用できる機能などの大きな変更が続々と追加されてここに来て機能追加が活発になってきた印象があります。しかし、既存の Pod リソースの互換性を維持しながら機能を追加する必要があるため、設定方法がわかりにくかったり、使い勝手の面でも少し痒い所に手が届いていないようなものもあります。PreStop で Sleep を実施する機能も PreStop に一つしか指定できないので、Sleep の後に Exec で何かの処理を実施したい場合には、今までのようにシェル等で自分で処理を用意しないといけないなど、印象と違う番勝手になっている面もあります。

そろそろ Pod の v2 の議論があっても良さそうですが、互換性の維持を考えると現実的にはこの状態がずっと続くのかなと思いあmした。

2
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
2
2