はじめに
このページでは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
:GA
https://github.com/kubernetes/enhancements/issues/2879 -
JobBackoffLimitPerIndex
:Beta
https://github.com/kubernetes/enhancements/issues/3850 -
JobPodReplacementPolicy
:Beta
https://github.com/kubernetes/enhancements/issues/3939
-
- StatefulSet
-
MaxUnavailableStatefulSet
:Beta
https://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
alpha
APIClusterCIDR
が削除されました。 (#121229, @aojea) [sig/network,sig/apps,sig/cli,sig/testing,sig/cloud-provider]-
既存のコントローラーに追加するのではなく、別途 CRD と新しい node-ipam controller を作成する方法で進めていくようになったので、既存の
alpha
API を削除されたようです。詳細が気になる方はこちらを参照ください。
-
既存のコントローラーに追加するのではなく、別途 CRD と新しい node-ipam controller を作成する方法で進めていくようになったので、既存の
API Changes(変更)
-
PreStop
lifecycle で新たにsleep
のアクションが追加されました。 これによりコンテナが termination する前の指定した期間でコンテナを pause することができるようになりました。 (#119026, @AxeZhan) [sig/node,sig/api-machinery,sig/apps,sig/testing]-
これで PreStop のためにコンテナに
sleep
コマンドを追加しなくてもよくなるのでいいですね。
-
これで PreStop のためにコンテナに
-
ServiceCIDR
が新たに追加され、動的にService ClusterIPs
アドレスを設定できるようになります。 (#116516, @aojea) [sig/network,sig/api-machinery,sig/auth,sig/apps,sig/cli,sig/testing] -
新しく
LoadBalancerIPMode
feature 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/v1alpha1
ClusterTrustBundle objects が pod でサポートされました。 (#113374, @ahmedtd) [sig/storage,sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing] -
新しく
DisableNodeKubeProxyVersion
feature 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年) で指定した期間を使用されておらず、.secrets
list 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] -
Parallel
policy と 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
のHasPopulatedHints
method で同時に 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 に失敗した時に
garbagecollection
controller が重複したイベントを登録する不具合を修正しました。(#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
でない時は設定できないようになります。稀にこれが期待しない動作になる場合はAllowServiceLBStatusOnNonLB
feature gate を有効化することで元の挙動に戻すことがd系ます。この機能を有効化する場合は、コントリビューターが問題を理解できるように 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.) 利用時に
PersistentDisk
volumes を利用時に read-only mode で使う必要がありました。このバリデーションはホストの実行コストが少なく殆どバリデーションをされていませんでした。もし特定のユースケースで問題となる場合はSkipReadOnlyValidationGCE
を有効化して、Kubernete の bug として報告して下さい。 (#121083, @thockin) [sig/apps] -
v1.28
で GA となったJobTrackingWithFinalizers
の feature gate が削除されました。 (#119100, @bzsuni) [sig/apps] -
LegacyServiceAccountTokenNoAutoGeneration
feature gate が削除されました。(この機能は stable となり、常時有効化されます) (#120192, @SataQiu) [SIG Apps, Auth and Scheduling] [sig/scheduling,sig/auth,sig/apps] -
DownwardAPIHugePages
feature gate が削除されました。(この機能は stable となり、常時有効化されます) (#120249, @pacoxu) [SIG Apps and Node] [sig/node,sig/apps] -
job_controller_job_sync_duration_seconds
metric の 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
が使えるようになったのが便利だったので、必要に応じては自分もこの機能は使っていきたいなと思いました。