はじめに
このページではKubernetes v1.29 における 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 が対象。
- 詳細について知りたい方はこちらをご参照ください。
SIG-Apps 以外の SIG に関する変更は以下にまとめてありますので、合わせてご参照下さい。
注目の変更
Feature Gatesの中で今回Stageに変更のあったSig-Appsに関連する機能は以下になります。
- Job
-
JobReadyPods:GAhttps://github.com/kubernetes/enhancements/issues/2879 -
JobBackoffLimitPerIndex:Betahttps://github.com/kubernetes/enhancements/issues/3850 -
JobPodReplacementPolicy:Betahttps://github.com/kubernetes/enhancements/issues/3939
-
- StatefulSet
-
MaxUnavailableStatefulSet:Betahttps://github.com/kubernetes/enhancements/issues/961
-
今回は既存の機能が昇格されただけで新機能の追加はありませんでした。
v1.29 Release Notes
v1.29 Release Notes の中で SIG-Apps に関するものについて以下に和訳したものを記載します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
Deprecation(非推奨)
-
v1.22から新しくCronJobを作成する際に.spec.scheduleでTZかCRON_TZを指定できましたが、指定できなくなります。v1.25+から利用可能な.spec.timeZoneを代わりに使用するようにしてください。 詳細はこちらを参照ください https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#unsupported-timezone-specification (#116252, @soltysh) [sig/apps]-
.spec.scheduleでタイムゾーンが指定できるようになった経緯は以前こちらで書いたので興味がある人は参照ください。意図せずできるようになっていたので元々非推奨だったのですが、今回から validation が追加されたという話になります。
-
-
networking
alphaAPIClusterCIDRが削除されました。 (#121229, @aojea) [sig/network,sig/apps,sig/cli,sig/testing,sig/cloud-provider]-
既存のコントローラーに追加するのではなく、別途 CRD と新しい node-ipam controller を作成する方法で進めていくようになったので、既存の alphaAPI を削除されたようです。詳細が気になる方はこちらを参照ください。
-
API Changes(変更)
-
PreStoplifecycle で新たにsleepのアクションが追加されました。 これによりコンテナが termination する前の指定した期間でコンテナを pause することができるようになりました。 (#119026, @AxeZhan) [sig/node,sig/api-machinery,sig/apps,sig/testing]-
これで PreStop のためにコンテナに sleepコマンドを追加しなくてもよくなるのでいいですね。
-
-
ServiceCIDRが新たに追加され、動的にService ClusterIPsアドレスを設定できるようになります。 (#116516, @aojea) [sig/network,sig/api-machinery,sig/auth,sig/apps,sig/cli,sig/testing] -
新しく
LoadBalancerIPModefeature gate のフィールドが追加されました。 (#119937, @RyanAoh) [SIG API Machinery, Apps, Cloud Provider, Network and Testing] [sig/network,sig/api-machinery,sig/apps,sig/testing,sig/cloud-provider] -
新しく
certificates.k8s.io/v1alpha1ClusterTrustBundle objects が pod でサポートされました。 (#113374, @ahmedtd) [sig/storage,sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing] -
新しく
DisableNodeKubeProxyVersionfeature gate が追加されました。もしDisableNodeKubeProxyVersionを有効化した場合はkubeProxyVersionフィールドが設定されなくなります。 (#120954, @HirazawaUi) [sig/node,sig/api-machinery,sig/apps]-
node.Status.NodeInfo.KubeProxyVersionのバージョンが実際の kube-proxy のバージョンと異なっていたり、そもそも kube-proxy を使用しない構成になっていることもあるので、このフィールドを kubelet で管理するのを辞めていこうという話になります。
-
-
Job の status の
Readyフィールドに書かれているコメントを修正しました。 (#121765, @mimowo) [sig/api-machinery,sig/apps] -
Job pod failure policy action の
FailIndexの API に書かれているコメントを修正しました。(#121764, @mimowo) [sig/api-machinery,sig/apps] -
Go API: volume を使用する際に
ResourceRequirementsの構造体ではなくVolumeResourceRequirementsを利用するようにリプレイスされました。 (#118653, @pohly) [sig/scheduling,sig/storage,sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing] -
Job BackoffLimitPerIndexがbetaになりました。 (#121356, @mimowo) [sig/apps] -
Jobの pod failure policy のonPodConditionsが optional とマークされました 。(#120204, @mimowo) [sig/api-machinery,sig/apps]-
onExitCodesを指定するケースもあるので、onPodConditionsが必ず必要というわけではないので、必須(required)だったのが任意(optional)という形に修正されています。
-
-
matchLabelKeys/mismatchLabelKeysに hard/softPodAffinity/PodAntiAffinityが導入されました。 (#116065, @sanposhiho) [sig/scheduling,sig/api-machinery,sig/apps,sig/testing,sig/cloud-provider] -
CSINodeExpandSecretがGAとなりデフォルトで有効化されます。CSI ドライバーは、このリリース以降、CSI Client によってオプションで送信されるNodeExpansionリクエストで渡されるsecretRefの値を利用できるようになります。(#121303, @humblec) [sig/storage,sig/api-machinery,sig/apps] -
CSI node driver が動作していない場合に
NodeStageVolumeが再度呼ばれるようになりました。 (#120330, @rohitssingh) [sig/storage,sig/apps,sig/testing] -
ValidatingAdmissionPolicyの型チェックで CRDs と API extensions types がサポートされました。 (#119109, @jiahuif) [sig/api-machinery,sig/auth,sig/apps,sig/testing]
Feature(機能追加)
-
Pod 作成のイベントをトリガーに Job controller からラベル付けされて作成された Pod をトラッキングするメトリクス
job_pods_creation_totalが追加されました。 (#121481, @dejanzele) [sig/apps,sig/testing] -
NodeLifeCycleControllerからTaintManagerを分離しました。 (KEP-3902). (#119208, @atosatto) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/instrumentation,sig/testing] -
ReadWriteOncePodがGAになりました。 (#121077, @chrishenzie) [sig/scheduling,sig/storage,sig/node,sig/apps,sig/testing] -
BackoffLimitPerIndexの機能にjob_finished_indexes_totalのメトリクスが追加されました。(#121292, @mimowo) [sig/apps,sig/testing] -
PodReplacementPolicyがbetaになりました。 (#121491, @dejanzele) [sig/apps,sig/testing] -
Pod に含まれる再起動可能な init container の resource が autoscaler によって再計算されるようになりました。 (#120001, @qingwave) [sig/autoscaling,sig/apps]
-
これは init container を sidecar として利用できるようになったので、init container のコンテナもずっと起動したままのケースが発生するようになりました。そのため、そのリソースを autoscaler でも計算する必要性が出てきたので修正されたという話になります。
-
-
ノードに直接 token を bind する
TokenRequestsがalphaでサポートされました、token 使用時ノード名と uid が存在しているかチェックします。(該当の機能はServiceAccountTokenNodeBindingとServiceAccountTokenNodeBindingValidationで保護されています )(#120780, @munnerz) [sig/api-machinery,sig/auth,sig/apps,sig/cli,sig/testing] -
kube-controller-manager:LegacyServiceAccountTokenCleanUpがbetaになり、デフォルトで有効化されます。有効化されている時--legacy-service-account-token-clean-up-period(デフォルト1年) で指定した期間を使用されておらず、.secretslist of a ServiceAccount object から参照もされておらず、pods からも参照されていない legacy service account token secrets には自動でkubernetes.io/legacy-token-invalid-sinceラベルが付与されます。このラベルにより authentication layer は credentials を拒否します。 無効としてラベル付けされて--legacy-service-account-token-clean-up-period(デフォルト1年) 経過した credential と利用されていない secret は自動で削除されます。ラベルが付与された Secrets からkubernetes.io/legacy-token-invalid-sinceのラベルを削除すると再アクティブ化します。 (#120682, @yt2985) [sig/auth,sig/apps,sig/testing]
Bug or Regression(バグ修正)
-
Job で作成された Pod から tracking finalizers 削除する冗長な処理を追加しました。この処理は Job が完了したと control plane からマークされた後に実行されます。 (#119944, @Sharpz7) [sig/apps]
-
ExternalIPsを使用するServicesでExternalTrafficPolicyを使用できるようになりました。 (#119150, @tnqn) [sig/network,sig/api-machinery,sig/apps,sig/cli,sig/testing,sig/release,sig/cloud-provider] -
Parallelpolicy と PVC labels を持つ StatefulSet がスケールアップするときにクラッシュする可能性があるkube-controller-managerのv1.28.0における regression を修正しました。(#121142, @aleksandra-malinowska) [sig/apps] -
cronjob controller が既に作成された Job の status を見失う可能性があるバグを修正しました。(#120649, @andrewsykim) [sig/apps]
-
PodDisruptionConditionsがデフォルトで有効になったことによって発生した regression を修正しました。重複した key を持つ Pod が garbage collector により削除されないケースが修正されました。
(#121103, @mimowo) [sig/scheduling,sig/node,sig/auth,sig/apps,sig/testing]-
以下のように containerPort と protocol を重複しているなどの時にガベージコレクションがされなかったようです。containers: - name: nginx image: "nginx:latest" imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: http protocol: TCP - containerPort: 8080 name: metrics protocol: TCP
-
-
TopologyCacheのHasPopulatedHintsmethod で同時に map にアクセスする不具合を修正しました。(#118189, @Miciah) [sig/network,sig/apps] -
Pod Disruption Budget (PDB) で "{}," のような空の値が selector に設定されている場合に該当の namespace の pod がドレインされない問題が修正されました。(#119732, @sairameshv) [sig/apps]
-
以下のように selector を設定しているケースの話になります。期待としては {}と書いた時に全ての Pod を対象になることを期待しているとのことです。apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: pdb spec: minAvailable: 100% selector: {}そもそもこれは作成時に拒否されるのかな?と思っていたのでこういう書き方をして作成できることを知らなかったです。個人的にはこの不具合がずっと気づかれなかったことを考えるに、PDB は対象の Pod の特性に合わせて label 毎に指定しておいた方が無難かなと思いました。
-
-
eviction やノード障害の後に
StatefulSetの pod が再起動しなくなる不具合を修正しました。(#120398, @aleksandra-malinowska) [sig/apps] -
JobsがResourceQuotaに達した時にCronJobが clean up に失敗する可能性があるバグを修正しました。 (#119776, @ASverdlov) [sig/apps] -
discovery requests に失敗した時に
garbagecollectioncontroller が重複したイベントを登録する不具合を修正しました。(#117992, @liggitt) [sig/api-machinery,sig/apps] -
detach 失敗後の volume への attach が修正されました。detach 失敗後の volume を attach されたものとして扱わないようになりました。Kubernetes は pod で利用する前にそれらが完全に attach されているか確認するようになります。(#120595, @jsafrane) [sig/storage,sig/apps]
-
podRecreationPolicy: Failedが使用され、terminating pods の数が parallelism を超過した場合に Job controller が panic になる不具合を修正しました。 (#121147, @kannon92) [sig/apps] -
cronjob controller の requeue time の計算が修正され、, failed や stuck した job のリキューが改善しました。
(#121327, @soltysh) [sig/apps] -
StatefulSet で image の更新時に partitioning 数より番号が小さい pod が削除されるケースを修正しました。(#120731, @adilGhaffarDev) [sig/apps,sig/testing]
-
terminating Pods を tracking する Job status を修正しました。 この field は他の変更がない限り更新されません。(#121342, @dejanzele) [sig/apps,sig/testing]
-
これについてはちょっと内容を見ると changelog のメッセージと修正内容がマッチしてないように思えていて、ここでは主に job controller のテストの方に修正が入っています。
-
-
pod とそれぞれの namespace を host を共有する sysctls が禁止され、pod の作成・更新時に sysctls がチェックされるようになりました。 (#118705, @pacoxu) [sig/node,sig/apps]
-
Kubernetes では Unsafe Sysctls というのがあって、kubelet 側で変更できないようになっています。kubelt 側で制限されているものを Pod 作成時に API Server のタイミングでチェックすることで、無駄な Pod の作成をなくすという話になります。apiVersion: v1 kind: Pod metadata: name: sysctl-2 spec: hostNetwork: true securityContext: sysctls: - name: net.ipv4.ip_local_port_range value: "40000 65535" containers: - name: sysctl image: docker.m.daocloud.io/library/nginx:1.14.1 securityContext: privileged: true
-
-
DaemonSetのローリングアップデート時にスケジールの制約に合わないノードを対象から除外するように修正しました。DaemonSetのローリングアップデートが tolerations 等の起因でスタック する問題が解消されました。 (#119317, @mochizuki875) [sig/apps,sig/testing] -
以前は
spec.typeがLoadBalancer出ない場合にもstatus.loadBalancerが設定できましたが、metadataかspecが更新されると削除されていました。spec.typeがLoadBalancerでない時は設定できないようになります。稀にこれが期待しない動作になる場合はAllowServiceLBStatusOnNonLBfeature gate を有効化することで元の挙動に戻すことができます。この機能を有効化する場合は、コントリビューターが問題を理解できるように Kubernetes プロジェクトの issue に起票して下さい。(#119789, @thockin) [sig/apps,sig/testing] -
scheduler: taint manager から報告されたイベントからapiVersionが欠落していたイベントを修正しました。(#114095, @aimuz) [sig/scheduling,sig/node,sig/apps]
Other (その他の修正)
-
ResourceClaimのランダムなサフィックスの前にハイフンが追加されたので名前が読みやすくなりました。 (<pod name>-<claim name>-<random suffix>). (#120336, @pohly) [sig/node,sig/apps] -
JobReadyPodsがstableになりました。 feature gate を使って無効化することもできなくなります。 (#121302, @stuton) [sig/apps,sig/testing] -
以前のバージョンの Kubernetes on Google Cloud で workloads (e.g. Deployments, DaemonSets, etc.) 利用時に
PersistentDiskvolumes を利用時に read-only mode で使う必要がありました。このバリデーションはホストの実行コストが少なく殆どバリデーションをされていませんでした。もし特定のユースケースで問題となる場合はSkipReadOnlyValidationGCEを有効化して、Kubernete の bug として報告して下さい。 (#121083, @thockin) [sig/apps] -
v1.28で GA となったJobTrackingWithFinalizersの feature gate が削除されました。 (#119100, @bzsuni) [sig/apps] -
LegacyServiceAccountTokenNoAutoGenerationfeature gate が削除されました。(この機能は stable となり、常時有効化されます) (#120192, @SataQiu) [SIG Apps, Auth and Scheduling] [sig/scheduling,sig/auth,sig/apps] -
DownwardAPIHugePagesfeature gate が削除されました。(この機能は stable となり、常時有効化されます) (#120249, @pacoxu) [SIG Apps and Node] [sig/node,sig/apps] -
job_controller_job_sync_duration_secondsmetric の resolution が4msに1min変更されました。 (#120577, @alculquicondor) [sig/apps,sig/instrumentation] -
GetPodQOS(pod *core.Pod)function はPodStatus.QOSClassの値が設定されていた場合に格納されている値を返すようになりますQOSClassの値を計算や評価に使いたい場合はComputePodQOS(pod*core.Pod)を使うようにして下さい。 (#119665, @vinaykul) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/cli,sig/testing] -
Statefulsetは.start.ordinalを削除するときのテストで新しい replicas の作成を待つようになりました。 (#119761, @soltysh) [sig/apps,sig/testing]
所感
今回は sig-apps がメインで開発する機能については新機能追加もなく、機能の安定化のみを行なった落ち着いたリリースになったのかなと思います。sig-apps がレビューで入っている物の中では個人的に印象的だったのは PreStop で sleep が使えるようになったのが便利だったので、必要に応じては自分もこの機能は使っていきたいなと思いました。