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フィールドが可変になり、新しいフィールドNodeAllocatableUpdatePeriodSecondsがCSIDriverオブジェクトで利用可能になります。これにより、ノードごとの割り当て可能なボリューム容量を定期的に更新できるようになり、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フィールドでPreferSameZoneとPreferSameNodeの値を使用できるようにします。 -
StrictIPCIDRValidation: IPアドレスやCIDR値を含むフィールドに対して、より厳格なバリデーションを適用します。特に、このフィーチャーゲートを有効にすると、IPv4アドレス内のオクテットに先頭の0を含めることが許可されず、IPv4マッピングされたIPv6値(例:::ffff:192.168.0.1)は禁止されます。これらの種類の値は、異なるコンポーネントが同じ文字列を異なるIPアドレスとして解釈する場合に、セキュリティ問題を引き起こす可能性があります(CVE-2021-29923)。この変更は、Kubernetesのビルトインリソースにのみ適用され、カスタムリソース、Kubernetesの設定ファイル、およびコマンドライン引数には適用されません。
フィーチャー昇格
v1.33で動きがあった機能のうち、SIG Appsに関係するものを記載しています。それぞれの文頭には、対応するフィーチャーゲート名を記載しています。
- Beta
- デフォルトでは無効
DeclarativeValidationTakeoverDisableAllocatorDualWriteClusterTrustBundleClusterTrustBundleProjection
- デフォルトで有効
InPlacePodVerticalScalingDeclarativeValidationOrderedNamespaceDeletionSupplementalGroupsPolicyRelaxedDNSSearchValidation
- デフォルトでは無効
- GA
MatchLabelKeysInPodAffinityRecursiveReadOnlyMountsNodeInclusionPolicyInPodTopologySpreadJobSuccessPolicyJobBackoffLimitPerIndexAnyVolumeDataSource-
MultiCIDRServiceAllocator ServiceTrafficDistributionHonorPVReclaimPolicySidecarContainers
- GA後のフィーチャーゲート削除
CPUManagerPDBUnhealthyPodEvictionPolicyJobPodFailurePolicy
⚠️ Urgent Upgrade Notes
📝 SIG Appsに関連するものはありません
🗑️ Deprecation (非推奨になった機能)
-
Podの
status.resizeフィールドは現在非推奨となり、今後は設定されなくなります。Podのリサイズステータスは、代わりに2つの新しいconditions:PodResizeInProgressとPodResizePendingの下で公開されます。 (#130733, @natasha41575)- 📝 SIG API Machinery編で詳しく解説されています。
-
📝 以下はAPI Changesに記載がありますが、deprecationなのでこちらにも転記します。DRA関連です。
🌏 API Changes (API周りの変更)
- 新しいアルファ版のフィーチャーゲートとして
MutableCSINodeAllocatableCountが導入されました。
このフィーチャーゲートが有効になると、CSINode.Spec.Drivers[*].Allocatable.Countフィールドが変更可能になり、CSIDriverオブジェクトに新しいフィールドNodeAllocatableUpdatePeriodSecondsが利用可能になります。これにより、ノードの報告された割り当て可能なボリューム容量を定期的に更新でき、kube-schedulerが依存する古い情報により、ステートフルなPodが停止するのを防ぎます。 (#130007, @torredil)- 📝 SIG Storage編で詳しく解説されています。
- リソースクレームでデバイス要求を満たすための「いずれか一つ」の優先順位付けされた選択基準のリストのDRAサポートが追加されました。 (#128586, @mortent)
- HorizontalPodAutoscalerに新しい
toleranceフィールドが追加され、クラスター全体のデフォルト値をオーバーライドできるようになりました。アルファ版のフィーチャーゲートHPAConfigurableToleranceを通じて有効化されます。 (#130797, @jm-franc)- 📝 SIG API Machinery編で詳しく解説されています。
- 新しいStopSignalコンテナライフサイクルによるカスタム停止シグナルの設定サポートが追加されました。 (#130556, @sreeram-venkitesh)
- 📝 SIG API Machinery編で詳しく解説されています。
- サイドカー(
initContainers内でrestartPolicyがAlwaysに設定されたコンテナ)を持つ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_total、kubelet_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)- 📝 SIG API Machinery編で詳しく解説されています。
- 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) -
ClusterTrustBundleAPIはv1beta1に移行中です。
ClusterTrustBundleProjection機能がkubelet側で機能するためには、ClusterTrustBundleAPIがv1beta1バージョンで利用可能であり、ClusterTrustBundleProjectionフィーチャーゲートが有効である必要があります。APIがkubeletが起動した後に利用可能になった場合は、機能を有効にするためにkubeletを再起動してください。 (#128499, @stlaz)- 📝 SIG Storage編で詳しく解説されています。
- 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)- 📝 SIG API Machinery編で詳しく解説されています。
- kubeletは、
PodObservedGenerationTrackingフィーチャーゲートが設定されているときに、Pod conditionにobservedGenerationフィールドを設定します。 (#130573, @natasha41575) - ReplicationControllerの
replicasおよびminReadySecondsフィールドの最小値検証が宣言的検証に移行されました。両フィールドの必須性も宣言的に検証されます。
DeclarativeValidationフィーチャーゲートが有効な場合、既存の検証との不一致がメトリクスを介して報告されます。
DeclarativeValidationTakeoverフィーチャーゲートが有効な場合、移行されたフィールドのエラーの主なソースは宣言的検証になります。 (#130725, @jpbetz)- 📝 SIG API Machinery編で詳しく解説されています。
-
resource.k8s.io/v1beta1APIは非推奨となり、1.36で削除されます。代わりにv1beta2を使用してください。 (#129970, @mortent) - 新しい
.spec.serviceNameフィールド値を持つStatefulSetは、DNS1123検証に合格する必要があります。以前に作成されたStatefulSetで無効な.spec.serviceNameフィールド値を持つものは、Podを作成できず、削除する必要があります。 -
PreferSameTrafficDistributionフィーチャーゲートが有効な場合、新しいtrafficDistribution値PreferSameNodeが利用可能になり、Serviceへの接続を常にクライアントと同じノード上のエンドポイントにルーティングしようとします。さらに、PreferSameZoneがPreferCloseのエイリアスとして導入されます。 (#130844, @danwinship)- 📝 SIG Network編で詳しく解説されています。
-
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)- 📝 SIG Network編で詳しく解説されています。
✨ Features (機能追加)
- メモリ管理の変更により、Podの
.metadata.generationが書き込み時に設定されるようになりました。新しいPodはmetadata.generationが1に設定され、Pod.specの可変フィールドへの更新はmetadata.generationを1増加させます。 (#130181, @natasha41575) -
OrderedNamespaceDeletionフィーチャーゲートがデフォルトで有効になりました。 (#130507, @cici37) - Endpointコントローラーによって作成されたEndpointリソースには、これを示すラベルが含まれるようになりました。
手動でEndpointを作成するユーザーもこのラベルを追加できますが、代わりにEndpointSliceを使用することを検討するべきです。 (#130564, @danwinship)- 📝 SIG Network編で詳しく解説されています。
- コンテナ内でkube-controller-managerを実行する際の
SELinuxWarningControllerのデフォルト設定が修正されました。 (#130037, @jsafrane) - KEP-3619: fine-grained(きめ細かい)補助グループポリシーがベータ版に昇格しました。 kubeletは、サポートされていないノードにスケジュールされると、
.spec.securityContext.supplementalGroupsPolicy: Strictを持つPodを拒否します(.status.features.supplementalGroupsPolicy: false)。 (#130210, @everpeace)- 📝 SIG Storage編を担当されている@everpeaceさんのKEPです。詳しくはKubernetesの公式ブログ記事をご参照ください。
-
RelaxedDNSSearchValidationがベータ版に昇格し、Podのサーチドメインに単一のドット "." またはアンダースコア "_" を含めることが許可されるようになりました。 (#130128, @adrianmoisey) - フィーチャーゲート
HonorPVReclaimPolicyがGAに昇格しました。 (#129583, @carlory) -
SidecarContainers機能がGAに昇格しました。 'SidecarContainers' フィーチャーゲートはデフォルト値にロックされ、v1.36で削除されます。このフィーチャーゲートを明示的に設定していた場合は、今すぐ削除してください。 (#129731, @gjkim42) - IPアドレスまたはCIDR値をAPIオブジェクトに書き込むコントローラーのいくつかは、常にこれらの値を正規化された形式で書き込むようになります。 (#130101, @danwinship)
- 📝 SIG Network編で詳しく解説されています。
📃 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)
- 📝 LoadBalancerタイプのServiceでポート10250が公開できないという制限があった模様です。ポート10250は、kubeletが自身のAPIを公開しているポートです。もともとは一部のクラウドプロバイダーが提供するLBの実装上の問題で、kubeletが「ノードのIPから来たトラフィック」と「LBのIPから来たトラフィック」を区別できず、結果としてインターネットからkubelet APIへの接続を許してしまう、という懸念を払拭するために制限されていた模様です。Issue自体は2023年2月に作成され、長い間動きがありませんでしたが、問題がないとの判断が最近されたことにより、無事v1.33で制限が解除されることとなりました。
🔬 Others (その他修正)
-
TestNodeDeletionReleaseCIDRのリンティング問題が修正されました。 (#128856, @adrianmoisey) - Job、IPAM、およびReplicaSetコントローラーの高頻度で低価値のログエントリに対するログのverbosityレベルが、それぞれV(2)、V(4)、V(4)に調整され、ログノイズが最小限に抑えられましたが、必要に応じてこれらのログにアクセスできるようにします。 (#130591, @fmuyassarov)
- GAに昇格し、1.31で無条件に有効にされた
JobPodFailurePolicyフィーチャーゲートが削除されました。 (#129498, @carlory)
Discussion