Kubernetes 1.35.0がリリースされました🎉
それでは、Kubernetes 1.35.0のCHANGELOGをベースにSIG Storageに関する変更について紹介します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
過去 3 リリースの変更内容:
- Kubernetes 1.34: SIG Storageの変更内容
- Kubernetes 1.33: SIG Storageの変更内容
- Kubernetes 1.32: SIG Storageの変更内容
所感
SIG Storageは今回も変更自体多くありませんが、下記の変更が新規にリリースされています。
| KEP | KEP-5538: CSI driver opt-in for service account tokens via secrets field |
|---|---|
| Status | Beta(default=true) |
| Feature Gate | CSIServiceAccountTokenSecrets |
| Feature Blog | Kubernetes v1.35: A Better Way to Pass Service Account Tokens to CSI Drivers |
| Description | ServiceAccount tokenを要求するCSI Driverにtokenを渡す場合に、セキュリティ懸念のあるvolume_contextではなくsecretsフィールドを使って渡すように変更します |
| Comment | CSI Driver実装者向けの変更ですが、利用者としては、自身の利用しているDriverの対応状況をウォッチすると良さそうです |
| KEP | KEP-5030: Integrate CSI Volume attach limits with cluster autoscaler |
|---|---|
| Status | Alpha |
| Feature Gate | VolumeLimitScaling |
| Feature Blog | なし |
| Description | kube-schedulerおよびCluster AutoscalerでCSINodeで定義されるVolume Attach Limitを考慮するように変更。Cluster AutoscalerでScale From Zeroする場合のスケジュール失敗の改善も期待できます |
| Comment | 自身の使っているCluster Providerの対応状況をウォッチすると良さそうです |
それ以外の昇格/廃止は以下のとおりです
| KEP | KEP-4876: Mutable CSINode Allocatable Property |
|---|---|
| Status | Beta(default=true) |
| Feature Gate | MutableCSINodeAllocatableCount |
| Feature Blog | なし |
| Comment | v1.34でBeta(default=false)でしたが、v1.35からBeta(default=true)になりました |
| KEP | KEP-1967: Support to size memory backed volumes |
|---|---|
| Status | GA |
| Feature Gate | 削除 |
| Feature Blog | なし |
| Comment | v1.32でGAしていたのでv1.35で削除 |
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
SIG Storage関連のものはありません
ただし、"
Others (その他修正)"セクションで紹介されていますが、storage.k8s.io/v1alpha1 APIからVolumeAttributesClassが削除されています(v1.34で既にGA, storage.k8s.io/v1に昇格)ので、利用している場合は注意が必要そうです。
Deprecation (非推奨になったAPI)
SIG Storage関連のものはありません
API Changes (API周りの変更)
- CSIドライバは、CSIDriverオブジェクトの
spec.serviceAccountTokenInSecrets: trueを設定することで、ボリュームコンテキストではなくsecretsフィールド経由でサービスアカウントトークンを受信できるようになりました。これにより、トークンがログやその他の出力に誤って公開されるのを防止できます。この機能はCSIServiceAccountTokenSecrets機能ゲートによって制御されています(v1.35ではベータ)。(#134826, @aramase)-
feature blog: Kubernetes v1.35: A Better Way to Pass Service Account Tokens to CSI Drivers
-
KEP-5538: CSI driver opt-in for service account tokens via secrets field
-
セキュリティの改善です。自身の利用しているCSI Driverの対応状況をウォッチされることをおすすめします。これまで TokenRequests featureを利用しているCSI DriverにServiceAccount tokenが渡される際、通常のvolume parameterが渡される volume_contextにServiceAccount tokenも一緒に渡されていました。protosanitizerというツールがあるのですが、volume_contextフィールドを機密情報として扱わないため、gRPCリクエストがログに記録される際に、ServiceAccount tokenが誤ってログに出力される可能性があり、これまでCVE-2023-2878(Secret Store CSI Driver)やCVE-2024-3744(Azure File CSI Driver)といった問題が発生していました。CSI Spec自体にはvolume_contextとは別のsecretsというフィールド(inNodePublishVolumeRequestメソッド)がすでに定義されているため、このフィールドを利用してService Account tokenを渡すようにします。CSI Driver specでのopt-inスタイルでの機能改善なのでいきなりbeta(default=true)です。
-
- kube-apiserverにおいて、デフォルトでClearingNominatedNodeNameAfterBinding機能を有効にしました。(#135103, @ania-borowiec)
- OpenAPI向けのモデルパッケージをzz_generated.model_name.goファイルに生成し、OpenAPIModelName()関数を通じてアクセス可能にしました。これにより、API開発者はGoパッケージパスに依存しないOpenAPIモデルパッケージを直接宣言できるようになります。 (#131755, @jpbetz)
- Kube-apiserver:
CustomResourceDefinitionでstatusサブリソースの存在が指定されているにもかかわらず、openAPIV3Schemaにstatusプロパティが定義されていないカスタムリソースのバリデーション時に発生する可能性があるパニック現象を修正しました。(#133721, @fusida) - Kubernetes APIのGoの型定義において、
github.com/gogo/protobufライブラリのランタイム使用が削除され、グローバルのgogo registryへの登録も行われなくなりました。Kubernetes APIのGoの定義はgoogle.golang.org/protobufライブラリとの互換性が不十分であるため、意図しない非互換使用を防ぐため、デフォルトでProtoMessage()メソッドを実装しなくなりました。これらのマーカーメソッドの削除が利用環境に影響を与える場合、kubernetes_protomessage_one_more_releaseビルドタグを使用することで、あと1リリース期間のみ再有効化することが可能です。ただし、この機能はv1.36リリース時に完全に削除される予定です。 (#134256, @liggitt)-
KEP-5589: Remove gogo protobuf dependency for Kubernetes API types
-
すでにDeprecatedなgogoprotobufへの依存
-
- 必要なCSIドライバがインストールされていないノードへPodがスケジュールされるのを修正しました。(#135012, @gnufied)
-
KEP-5030: Integrate CSI Volume attach limits with cluster autoscaler
-
これまで、kube-scheduler(その内部コードを利用しているCluster Autoscaler)は、
CSI Nodeがない→CSI Attach Limitがない、という意味で作られているため、Cluster Autoscalerで、特にScale from Zeroの場合に、CSI VolumeがAttachできないかもしれない課題に対する改善(CSI Nodeがpublishされていない→制限なくスケジュールできると判断される→Cluster AutoscalerはそのNodeを作る)。 -
このKEP(PR)では、CSI Nodeがない→スケジュールできないに変わる -
Cluster Autoscaler側のScale From ZeroはNode Templateで指定することが提案されている -
紐づいているCluster Autoscaler側のPR(kubernetes/autoscaler#8721) だと、Cluster APIのNode Template Providerのみが実装されていて、MachineDeploymentにcapacity.cluster-autoscaler.kubernetes.io/csi-driver: "ebs.csi.aws.com=25,efs.csi.aws.com=16"みたいなannotationを指定する形になっている。 -
各自自分の使っているCluster Providerでの対応はwatchしておくと良さそう
-
Features (機能追加)
- VolumeAttachmentLimitExceededによるポッド拒否のケースのストレステストをkubeletに追加しました(#133357, @torredil)
-
MutableCSINodeAllocatableCountフィーチャーゲートをベータとしてデフォルトで有効にしました(#134647, @torredil) - 同一のスケジューリング要件を持つポッドに対して、スケジューリング効率を最適化するためのopportunistic batching(KEP-5598)を実装しました (#135231, @bwsalmon)
- InformerやControllerが使用するreal-FIFOキューにおいて、ウォッチイベントの処理をバッチ化することで、スループットを向上させました。(#132240, @yue9944882)
-
KEP化されていませんが、InOrderInformersBatchProcessfeature gate(beta, default=true)があるので無効化は可能です
-
- k8s.io/apimachinery: 同一リソースタイプの2つのオブジェクト間で resourceVersion 文字列を比較するための補助関数を導入しました (#134330, @michaelasp)
- KubernetesはGo 1.25を利用します。これにはhttps://go.dev/blog/container-aware-gomaxprocsも含まれています(#134120, @BenTheElder)
-
Go 1.25でリリースされたGOMAXPROCSがコンテナに割り当てられているCPUを見て自動的にセットされる(これまではホストのCPU総数)様になるので嬉しいですね!
-
- 基盤となるイメージと依存関係を更新し、Goバージョン1.25.3に合わせました(#134611, @cpanato)
📃 Documentation (ドキュメント)
SIG Storage関連のものはありません
Bug or Regression (バグ修正)
- 同一の
PersistentVolumeClaimを参照する複数のVolumeを持つPodに対応しました(#122140, @huww98) - SELinux warningコントローラーでSELinuxラベルの競合が発生している場合にイベントを発行していなかった問題を修正しました(#133425, @jsafrane)
- PersistentVolumeClaims、VolumeAttachments、VolumeAttributesClasses更新時に行われていた重複したバリデーションを修正しました(#132549, @gavinkflam)
- StaticなPersistentVolumeが作成された際に発生していたスケジュール遅延の問題を修正しました(#133929, @huww98)
- kubelet:
LocalStorageCapacityIsolationFSQuotaMonitoringが有効になっている状態で、空のボリュームを持つポッドを作成する際に発生していた並行マップ書き込みエラーを修正しました (#135174, @carlory) - VAC(VolumeAttributeClass)のAPIテストをConformance testに昇格させました(#133615, @carlory)
Others (その他修正)
- テストフレームワークに
Stepフィールドを追加し、テスト時のボリューム拡張単位を設定できるようにしました(#134760, @Rishita-Golla) - md5アルゴリズムを廃止し、より適切なハッシュアルゴリズムの使用を推奨します(#133511, @BenTheElder)
-
k/k/pkg/scheduler/frameworkパッケージ内の以下の型を移動しました:Handle,Plugin,PreEnqueuePlugin,QueueSortPlugin,EnqueueExtensions,PreFilterExtensions,PreFilterPlugin,FilterPlugin,PostFilterPlugin,PreScorePlugin,ScorePlugin,ReservePlugin,PreBindPlugin,PostBindPlugin,PermitPlugin,BindPlugin,PodActivator,PodNominator,PluginsRunner,LessFunc,ScoreExtensions,NodeToStatusReader,NodeScoreList,NodeScore,NodePluginScores,PluginScore,NominatingMode,NominatingInfo,WaitingPod,PreFilterResult,PostFilterResult,Extender,NodeInfoLister,StorageInfoLister,SharedLister,ResourceSliceLister,DeviceClassLister,ResourceClaimTracker,SharedDRAManager
これらの型はk8s.io/kube-scheduler/frameworkパッケージに移動されました。ユーザーはインポートパスを更新する必要があります。ただし、これらの型のインターフェース自体は変更されていません。
k/k/pkg/scheduler/framework/parallelismパッケージ内のParallelizerは、インターフェース型Parallelizer(k8s.io/kube-scheduler/frameworkパッケージ内)と構造体型Parallelizer(k/kパッケージ内の位置は変更なし)に分割されました。プラグイン開発者の方は、インポートパスをステージングリポジトリ用のパスに更新してください(#133172, @ania-borowiec) - GAになっているフィーチャーゲート
SizeMemoryBackedVolumesを削除しました(#133720, @carlory) - v1.35 では、
storage.k8s.io/v1alpha1API からVolumeAttributesClassリソースを削除しました。(#134625, @liggitt)-
すでにv1.34でGA、storage.k8s.io/v1に昇格しているので、利用している人は少ないと思いますがAPIの削除なので念のため注意しておくと良いかもしれません
-
- etcdクライアントライブラリをv3.6.5に更新しました(#134780, @joshjms)