💻

Kubernetes 1.33: SIG Appsの変更内容

に公開

Kubernetes v1.33がリリースされました🎉

本記事では、とくにSIG Appsに関係する変更点を、CHANGELOGからピックアップして紹介いたします。

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

📝 所感

やはり今回のアップデートで個人的にアツいのは、In-place Pod resize(In-Place Pod Vertical Scaling)のBeta昇格ですね!今までVerticalPodAutoscaler(VPA)で垂直スケーリングをしようと思うと、Podのローリングアップデートが走ってしまうため、可用性の観点からあまり積極的に使用できなかった方も多いと思います。v1.33からはデフォルトで有効となるため、VerticalPodAutoscaler(VPA)によるオートスケールの恩恵を受けやすくなりそうです。

アルファとして追加された新規機能

v1.33でアルファ版として追加された機能のうち、SIG Appsに関係するものをピックアップしました。それぞれの文頭には、対応するフィーチャーゲート名を記載しています。

フィーチャーゲートとは、特定の機能の有効・無効を管理するための仕組みです。詳しくは、Kubernetes公式ドキュメントをご参照ください。

  • MutableCSINodeAllocatableCount: このフィーチャーゲートを有効にすると、CSINode.Spec.Drivers[*].Allocatable.Countフィールドが可変になり、新しいフィールドNodeAllocatableUpdatePeriodSecondsCSIDriverオブジェクトで利用可能になります。これにより、ノードごとの割り当て可能なボリューム容量を定期的に更新できるようになり、kube-schedulerがより正確で最新の値をもとにStateful Podをスケジューリングできるようになります。
  • DRAPrioritizedList: 優先リスト機能のサポートを有効にします。これにより、ResourceClaim内のリクエストに対して、優先順位付けされたサブリクエストのリストを指定することが可能になります。このフィーチャーゲートは、DynamicResourceAllocationフィーチャーゲートを有効にしない限り効果はありません。
  • DRADeviceTaints: DRAを使用する際に、デバイスにtaintを設定し、それらのtaintを選択的に許容するサポートを有効にします。このフィーチャーゲートは、DynamicResourceAllocationフィーチャーゲートを有効にしない限り効果はありません。
  • HPAConfigurableTolerance: HorizontalPodAutoscalerオブジェクトに対して許容値を設定できるようにします。
  • ContainerStopSignals: コンテナの停止に使用するカスタム停止シグナルを設定するために、コンテナのStopSignalライフサイクルの使用を可能にします。
  • DeploymentReplicaSetTerminatingReplicas: DeploymentとReplicaSetに新しいステータスフィールド.status.terminatingReplicasを追加し、終了中のPodを追跡できるようにします。
  • StreamingCollectionEncodingToProtobuf: APIサーバーのProtobufエンコーダーが、一度にすべてではなく、コレクションをアイテムごとにエンコードできるようにします。
  • PodObservedGenerationTracking: kubeletがPodのステータスにobservedGenerationを設定し、他のコンポーネントがPod conditionにobservedGenerationを設定して、ステータスやconditionが記録される時点でのPodのmetadata.generationを反映できるようにします。
  • PreferSameTrafficDistribution: ServiceのtrafficDistributionフィールドでPreferSameZonePreferSameNodeの値を使用できるようにします。
  • StrictIPCIDRValidation: IPアドレスやCIDR値を含むフィールドに対して、より厳格なバリデーションを適用します。特に、このフィーチャーゲートを有効にすると、IPv4アドレス内のオクテットに先頭の0を含めることが許可されず、IPv4マッピングされたIPv6値(例: ::ffff:192.168.0.1)は禁止されます。これらの種類の値は、異なるコンポーネントが同じ文字列を異なるIPアドレスとして解釈する場合に、セキュリティ問題を引き起こす可能性があります(CVE-2021-29923)。この変更は、Kubernetesのビルトインリソースにのみ適用され、カスタムリソース、Kubernetesの設定ファイル、およびコマンドライン引数には適用されません。

フィーチャー昇格

v1.33で動きがあった機能のうち、SIG Appsに関係するものを記載しています。それぞれの文頭には、対応するフィーチャーゲート名を記載しています。

  • Beta
    • デフォルトでは無効
      • DeclarativeValidationTakeover
      • DisableAllocatorDualWrite
      • ClusterTrustBundle
      • ClusterTrustBundleProjection
    • デフォルトで有効
      • InPlacePodVerticalScaling
      • DeclarativeValidation
      • OrderedNamespaceDeletion
      • SupplementalGroupsPolicy
      • RelaxedDNSSearchValidation
  • GA
    • MatchLabelKeysInPodAffinity
    • RecursiveReadOnlyMounts
    • NodeInclusionPolicyInPodTopologySpread
    • JobSuccessPolicy
    • JobBackoffLimitPerIndex
    • AnyVolumeDataSource
    • MultiCIDRServiceAllocator
    • ServiceTrafficDistribution
    • HonorPVReclaimPolicy
    • SidecarContainers
  • GA後のフィーチャーゲート削除
    • CPUManager
    • PDBUnhealthyPodEvictionPolicy
    • JobPodFailurePolicy

⚠️ Urgent Upgrade Notes

📝 SIG Appsに関連するものはありません

🗑️ Deprecation (非推奨になった機能)

  • Podの status.resize フィールドは現在非推奨となり、今後は設定されなくなります。Podのリサイズステータスは、代わりに2つの新しいconditions: PodResizeInProgressPodResizePending の下で公開されます。 (#130733, @natasha41575)

  • 📝 以下はAPI Changesに記載がありますが、deprecationなのでこちらにも転記します。DRA関連です。

    • resource.k8s.io/v1beta1 APIは非推奨となり、1.36で削除されます。代わりに v1beta2 を使用してください。 (#129970, @mortent)

🌏 API Changes (API周りの変更)

  • 新しいアルファ版のフィーチャーゲートとして MutableCSINodeAllocatableCount が導入されました。
    このフィーチャーゲートが有効になると、CSINode.Spec.Drivers[*].Allocatable.Count フィールドが変更可能になり、CSIDriver オブジェクトに新しいフィールド NodeAllocatableUpdatePeriodSeconds が利用可能になります。これにより、ノードの報告された割り当て可能なボリューム容量を定期的に更新でき、kube-schedulerが依存する古い情報により、ステートフルなPodが停止するのを防ぎます。 (#130007, @torredil)
  • リソースクレームでデバイス要求を満たすための「いずれか一つ」の優先順位付けされた選択基準のリストのDRAサポートが追加されました。 (#128586, @mortent)
  • HorizontalPodAutoscalerに新しい tolerance フィールドが追加され、クラスター全体のデフォルト値をオーバーライドできるようになりました。アルファ版のフィーチャーゲートHPAConfigurableToleranceを通じて有効化されます。 (#130797, @jm-franc)
  • 新しいStopSignalコンテナライフサイクルによるカスタム停止シグナルの設定サポートが追加されました。 (#130556, @sreeram-venkitesh)
  • サイドカー(initContainers 内で restartPolicyAlways に設定されたコンテナ)を持つPodのインプレース垂直スケーリングのサポートを追加しました。 (#128367, @vivzbansal)
  • Podレベルのリソースのために、spec レベルで hugepage resources をサポートするようにPod APIが変更されました。 (#130577, @KevinTMtz)
  • DRA:Device taintにより、DRAドライバーまたは管理者がデバイスを使用不可としてマークすることができ、それらの割り当てを防ぎます。taintの重大度とクレームがtaintを許容するかどうかに応じて、デバイスが使用不可になった場合、Podは実行時に退避される場合もあります。 (#130447, @pohly)
  • DRA:Kubernetes 1.33からは、kubernetes.io/dra-admin-access ラベルを持つ管理者名前空間へのアクセス権を持つユーザーのみが、この管理者名前空間内で adminAccess フィールドを持つResourceClaimまたはResourceClaimTemplateオブジェクトを作成する権限を持ち、彼らだけがこれらのResourceClaimsまたはResourceClaimTemplatesをPodまたはDeploymentのspecで参照できます。 (#130225, @ritazh)
  • InPlacePodVerticalScaling 機能では、APIサーバーはリサイズリクエストを受け取ったときにリサイズステータスを Proposed に設定しなくなりました。 (#130574, @natasha41575)
  • PodAffinity(PodAntiAffinity)の MatchLabelKeys(MismatchLabelKeys)機能をGAに昇格させました (#130463, @sanposhiho)
  • kubeletメトリクス kubelet_image_volume_requested_totalkubelet_image_volume_mounted_succeed_total、および kubelet_image_volume_mounted_errors_total が追加されました (#130135, @saschagrunert)
  • DeploymentsとReplicaSetsに、終了中のPodを追跡するための新しいステータスフィールド .status.terminatingReplicas が実装されました。この新しいフィールドは、DeploymentPodReplacementPolicy フィーチャーゲートが有効な場合に表示されます。 (#128546, @atiratree)
    • 📝 フィーチャーゲートの名称がDeploymentPodReplacementPolicyとなっていますが、正しくはDeploymentReplicaSetTerminatingReplicasです。
  • Pod作成時にKubernetesで NodeSelectorRequirement 値の検証が実装されました。 (#128212, @AxeZhan)
  • レスポンス形式がProtobufになるlistリクエストに対するAPIサーバーの応答方法が改善されました。Protobufでのリスト応答は一度に1要素ずつマーシャリングされ、大きなコレクションを提供するために必要なメモリを大幅に削減します。ストリーミングリスト応答は StreamingCollectionEncodingToProtobuf フィーチャーゲートで無効にできます。 (#129407, @serathius)
  • InPlacePodVerticalScaling: メモリ制限は、メモリリサイズ再起動ポリシーが RestartContainer に設定されていない限り、減少させることはできません。コンテナのリサイズポリシーはもはや変更できません。 (#130183, @tallclair) [SIG Apps and Node] [sig/node,sig/apps]
  • 新しいスコープ名 VolumeAttributesClass が導入されました。特定のボリューム属性クラスを持つすべてのPVCオブジェクトに一致します。ボリューム属性クラスの特定のカウントを制限したい場合は、スコープ名 VolumeAttributesClass とボリューム属性クラスに一致する matchExpressions を持つクォータオブジェクトを作成できます。 (#124360, @carlory)
  • KEP-3857: 再帰的読み取り専用(RRO)マウント: GAに昇格 (#130116, @AkihiroSuda)
  • JobSuccessPolicy E2Eをコンフォーマンスに昇格 (#130658, @tenzen-y)
  • NodeInclusionPolicyInPodTopologySpread をv1.33で安定版に昇格 (#130920, @kerthcet)
  • JobSuccessPolicy を安定版に昇格。 (#130536, @tenzen-y)
  • Jobの JobBackoffLimitPerIndex フィーチャーゲートを安定版に昇格。 (#130061, @mimowo)
  • フィーチャーゲート AnyVolumeDataSource をGAに昇格。 (#129770, @sunnylovestiramisu)
  • 一般に利用可能なフィーチャーゲート CPUManager を削除しました。 (#129296, @carlory)
  • 一般に利用可能なフィーチャーゲート PDBUnhealthyPodEvictionPolicy を削除しました。 (#129500, @carlory)
  • スワップ容量を node.status.nodeSystemInfo の一部として報告し始めました。 (#129954, @iholder101)
  • MultiCIDRServiceAllocator フィーチャーゲートを安定版に昇格し、DisableAllocatorDualWrite フィーチャーゲートをベータ版に昇格(デフォルトでは無効)。
    アクションが必要 Kubernetesクラスター管理者およびクラスターService CIDRを管理するディストリビューション向け。
    Kubernetesは、ユーザーがAPIオブジェクトを介してクラスターService CIDRを定義できるようになりました: ServiceCIDR。
    Kubernetesのディストリビューションまたは管理者は、クラスターに追加される新しいService CIDRが他のネットワークと重複しないように、特定のIP範囲のみに属するように制御したり、クラスターごとに1つのServiceCIDRのみを持つ既存の動作を保持したりすることを好むかもしれません。これを達成するために ValidatingAdmissionPolicy を使用できます。 (#128971, @aojea)
  • ClusterTrustBundle APIは v1beta1 に移行中です。
    ClusterTrustBundleProjection 機能がkubelet側で機能するためには、ClusterTrustBundle APIが v1beta1 バージョンで利用可能であり、ClusterTrustBundleProjection フィーチャーゲートが有効である必要があります。APIがkubeletが起動した後に利用可能になった場合は、機能を有効にするためにkubeletを再起動してください。 (#128499, @stlaz)
  • ServiceのtrafficDistributionフィールド(PreferCloseオプションを含む)がGAに昇格しました。
    フィールドが構成されていないサービスは、既存の動作を維持します。詳細については、ドキュメントhttps://kubernetes.io/docs/concepts/services-networking/service/#traffic-distributionを参照してください。 (#130673, @gauravkghildiyal)
  • kube-controller-managerは、PodObservedGenerationTracking フィーチャーゲートが設定されているときに、Pod conditionに observedGeneration フィールドを設定します。 (#130650, @natasha41575)
  • kubeletは、PodObservedGenerationTracking フィーチャーゲートが設定されているときに、Pod conditionに observedGeneration フィールドを設定します。 (#130573, @natasha41575)
  • ReplicationControllerの replicas および minReadySeconds フィールドの最小値検証が宣言的検証に移行されました。両フィールドの必須性も宣言的に検証されます。
    DeclarativeValidation フィーチャーゲートが有効な場合、既存の検証との不一致がメトリクスを介して報告されます。
    DeclarativeValidationTakeover フィーチャーゲートが有効な場合、移行されたフィールドのエラーの主なソースは宣言的検証になります。 (#130725, @jpbetz)
  • resource.k8s.io/v1beta1 APIは非推奨となり、1.36で削除されます。代わりに v1beta2 を使用してください。 (#129970, @mortent)
  • 新しい .spec.serviceName フィールド値を持つStatefulSetは、DNS1123検証に合格する必要があります。以前に作成されたStatefulSetで無効な .spec.serviceName フィールド値を持つものは、Podを作成できず、削除する必要があります。
    • StatefulSetスキーマの公開OpenAPIが修正され、.spec.serviceName がオプションであることを示すようになりました。 (#130233, @soltysh)
  • PreferSameTrafficDistribution フィーチャーゲートが有効な場合、新しい trafficDistributionPreferSameNode が利用可能になり、Serviceへの接続を常にクライアントと同じノード上のエンドポイントにルーティングしようとします。さらに、PreferSameZonePreferClose のエイリアスとして導入されます。 (#130844, @danwinship)
  • PodObservedGenerationTracking フィーチャーゲートが設定されているとき、kubeletは status.observedGeneration を最新の metadata.generation を反映するように設定しました。 (#130352, @natasha41575)
  • StrictIPCIDRValidation フィーチャーゲートが有効な場合、KubernetesはIPアドレスおよびネットワークアドレス範囲(「CIDRブロック」)として受け入れられる値に対してわずかに厳しくなります。
    特に、IPv4アドレス内のオクテットは先頭に 0 を持つことは許可されず、IPv4マッピングされたIPv6値(例: ::ffff:192.168.0.1)は禁止されています。
    これらの値は、異なるコンポーネントが同じ文字列を異なるIPアドレスを指すものとして解釈する場合に、セキュリティ上の問題を引き起こす可能性があります(CVE-2021-29923参照)。
    この厳格化は、組み込みAPI種のフィールドにのみ適用され、カスタムリソース種、Kubernetes構成ファイル内の値、コマンドライン引数には適用されません。
    (フィーチャーゲートが無効な場合、そのような無効なIPまたはCIDR値を持つオブジェクトを作成すると、将来的に拒否されるというAPIサーバーからの警告が表示されます。) (#122550, #128786, @danwinship)

✨ Features (機能追加)

  • メモリ管理の変更により、Podの .metadata.generation が書き込み時に設定されるようになりました。新しいPodは metadata.generation が1に設定され、Pod .spec の可変フィールドへの更新は metadata.generation を1増加させます。 (#130181, @natasha41575)
  • OrderedNamespaceDeletion フィーチャーゲートがデフォルトで有効になりました。 (#130507, @cici37)
  • Endpointコントローラーによって作成されたEndpointリソースには、これを示すラベルが含まれるようになりました。
    手動でEndpointを作成するユーザーもこのラベルを追加できますが、代わりに EndpointSlice を使用することを検討するべきです。 (#130564, @danwinship)
  • コンテナ内でkube-controller-managerを実行する際のSELinuxWarningControllerのデフォルト設定が修正されました。 (#130037, @jsafrane)
  • KEP-3619: fine-grained(きめ細かい)補助グループポリシーがベータ版に昇格しました。 kubeletは、サポートされていないノードにスケジュールされると、.spec.securityContext.supplementalGroupsPolicy: Strict を持つPodを拒否します(.status.features.supplementalGroupsPolicy: false)。 (#130210, @everpeace)
  • RelaxedDNSSearchValidation がベータ版に昇格し、Podのサーチドメインに単一のドット "." またはアンダースコア "_" を含めることが許可されるようになりました。 (#130128, @adrianmoisey)
  • フィーチャーゲート HonorPVReclaimPolicy がGAに昇格しました。 (#129583, @carlory)
  • SidecarContainers 機能がGAに昇格しました。 'SidecarContainers' フィーチャーゲートはデフォルト値にロックされ、v1.36で削除されます。このフィーチャーゲートを明示的に設定していた場合は、今すぐ削除してください。 (#129731, @gjkim42)
  • IPアドレスまたはCIDR値をAPIオブジェクトに書き込むコントローラーのいくつかは、常にこれらの値を正規化された形式で書き込むようになります。 (#130101, @danwinship)

📃 Documentation

📝 SIG Appsに関連するものはありません

🐛 Bug or Regression (バグ修正)

  • StatefulSetの .spec 内の revisionHistoryLimit フィールドに対する検証が追加され、負の値に設定されるのを防ぎます。 (#129017, @ardaguclu)
    • 📝 後述のkube-controller-managerに対する修正#129301に関連した変更です。このようなバグ修正の際、Kubernetesでは後方互換性を維持することを重視します。そのため、検証ロジックの追加と、パニックを回避するための修正を分割し、後者はサポートされているマイナーバージョンにバックポートするという形をとっています。
  • HorizontalPodAutoscalerのバグが修正されました。 ContainerResource メトリクスを持つHPAは、コンテナメトリクスが欠如しているときにエラーを返さなくなりました。代わりに、Resource メトリクスと同じロジックを使用して計算を行います。 (#127193, @DP19)
  • revisionHistoryLimit が負の値のときにStatefulSetオブジェクトを処理する際のkube-controller-managerのパニックが修正されました。 (#129301, @ardaguclu)
  • サービスを使用してポート10250を外部に公開する際の制限が解除されました。 (#129174, @RyanAoh)

🔬 Others (その他修正)

  • TestNodeDeletionReleaseCIDR のリンティング問題が修正されました。 (#128856, @adrianmoisey)
  • Job、IPAM、およびReplicaSetコントローラーの高頻度で低価値のログエントリに対するログのverbosityレベルが、それぞれV(2)、V(4)、V(4)に調整され、ログノイズが最小限に抑えられましたが、必要に応じてこれらのログにアクセスできるようにします。 (#130591, @fmuyassarov)
  • GAに昇格し、1.31で無条件に有効にされた JobPodFailurePolicy フィーチャーゲートが削除されました。 (#129498, @carlory)

Discussion