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
- デフォルトでは無効
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: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) -
ClusterTrustBundle
APIはv1beta1
に移行中です。
ClusterTrustBundleProjection
機能がkubelet側で機能するためには、ClusterTrustBundle
APIが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/v1beta1
APIは非推奨となり、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