3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes 1.35: SIG-API Machineryの変更内容

3
Last updated at Posted at 2026-01-03

はじめに

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

今回は(sig-schedulingがメインではありますが)新たにgang用のWorkload APIが追加されたり、細かいもののDeployment/ReplicaSet/Podといった主要リソースのフィールドがちょくちょく追加されてます。validation-genも引き続き強化されており、applyconfiguration-genの方もたまに必要になっていたscale含むstatus以外のサブリソース対応も入っています。

それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(📝がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です)

SIG, KEPについてはこちらを参照ください。

🌏 API Changes (API周りの変更)

  • CustomResourceDefinition の conditions に ObservedGeneration を追加しました。 (#134984)

    📝 下にでてくる Storage Version Migration で使うために追加されました
    :

  • kube-apiserver / kube-controller-manager / kube-scheduler--min-compatibility-version フラグを追加しました。 (#133980)

  • StorageVersionMigration v1beta1 API を追加し、 v1alpha1 API を削除しました。 [アップグレード前の注意] v1alpha1 API はサポートされなくなりました。ユーザーはアップグレード前にすべての v1alpha1 リソースを削除する必要があります。 (#134784)

    📝 KEP4192 は、外部コンポーネントとして開発されていたetcdに保存されているオブジェクトのStorage Versionが変わった時に更新してくれる StorageVersionMigrator をk8s本体にいれるというものです。ひきつづきFeatureGateはデフォルト無効です。
    :

  • CSI ドライバーにおいて、CSIDriver オブジェクトの spec.serviceAccountTokenInSecrets: true を設定することで、ボリュームコンテキストの代わりに secrets フィールド経由でサービスアカウントトークンを受け取ることができるようになりました。これにより、ログやその他の出力にトークンが露出するのを防ぐことができます。この機能は CSIServiceAccountTokenSecrets FeatureGate( v1.35 でベータ)によって制御されます。 (#134826)

  • DRA デバイスの Taints: DeviceTaintRule のステータスが、Pod を退避させる必要があるかどうか( EvictionInProgress 条件)を含む、ルールに関する情報を提供するようになりました。新しく追加された None エフェクトは、 NoExecute エフェクトを使用した場合の DeviceTaintRule の動作をプレビューしたり、スケジューリングや実行中の Pod に即座に影響を与えずにデバイスをテイント( device health )したりするために使用できます。 (#134152)

  • UnknownVersionInteroperabilityProxy 機能が有効な場合、すべてのピア apiserver からの API グループとリソースをマージするようにディスカバリレスポンスを強化しました。 (#133648)

    📝 KEP-4020のUpgrade時のAPIサーバ間のskew問題対応用の修正のひとつです。HA構成の場合も、リクエスト先APIサーバだけではなく、他のAPIサーバがもっているリソース情報もマージして返すようになりました。

  • core/v1Toleration を拡張し、数値比較演算子( Gt / Lt )をサポートしました。 (#134665)

    📝 いままでTolerationの operator はキーが存在するか(Exists) or 値の完全一致 (Equal) の2通りで設定していましたが、AWSなどのSLAレベルが異なるノードが混在しているさいに、「N以上のノードに配置したい」といった選択ができるように導入されました。この機能は現在アルファの FeatureGateの TaintTolerationComparisonOperators です。

  • FeatureGateの依存関係が明示的になり、起動時に検証されるようになりました。依存する機能が停止している場合、その機能を有効化できません。特に、 AllAlpha=true は、依存されている「デフォルトで無効なベータ機能」を( AllBeta=true にするか、無効な依存関係を明示的に列挙して)有効にしない限り機能しません。 (#133697)

    📝 FeatureGate には依存関係があるケースがありますが(e.g., InPlacePodVerticalScalingExclusiveCPUs は InPlacePodVerticalScalingに依存している)、その場合、依存している FeatureGate も正しく有効化していないと挙動がおかしくなってしまいますが、実装を詳しく把握していないと正しく有効化できているかの判断が難しいという問題がありました。そこで、Feature Gateにdependencyを定義できるようにし、依存先が有効化されていない場合はエラーをだすようになりました。

  • KEP-5284 で説明されている制限付きの借用(constrained impersonation)を実装しました。 (#134803)

    📝 いままでも kubectl --as フラグなどからつかえるimpersonation機能はありましたが、指定したUserやServiceAccountの権限をそのまま全て付与する仕組みでした。今回アルファのFeature Gateとして導入されたConstrained Impersonationでは、その名のとおり対象リソースをPodにしぼるなどの制限がかけられるようになりました。

  • 一意性を制御するための新しい宣言的バリデータタグ +k8s:customUnique を導入しました。 (#134279)

    📝 validation-genにlistmap形式フィールドの一意性の検証を無効化するためのタグが追加されました。通常時は、一致するキーがないかが検証されます。

  • scheduling.k8s.io/v1alpha1 Workload API を使用して「オール・オア・ナッシング」スケジューリングをサポートする GangScheduling kube-scheduler プラグインを導入しました。 (#134722)

    📝 ついにcoreスケジューラへ初版のgang schedulingが追加されました。APIとしては、複数のPodを束ねる Workload APIリソースが追加され、Pod側にはそのWorkloadを参照する .spec.workloadRef フィールドが追加されています。

        apiVersion: scheduling.k8s.io/v1alpha1
        kind: Workload
        metadata:
          name: my-gang-workload
        spec:
          podGroups:
          - name: workers # Pod の .spec.workloadRef 側で指定する値
            policy:
              gang:
                minCount: 3
    
  • ノードの宣言された機能に対して Pod の更新を検証する NodeDeclaredFeatureValidator アドミッションプラグインを導入しました。 (#133389)

  • ワークロードレベルのスケジューリング要件を表現し、kube-scheduler がそれに基づいて動作できるようにする scheduling.k8s.io/v1alpha1 Workload API を導入しました。 (#134564)

  • Kube-apiserver: 数値および整数プロパティにおける認識されないフォーマットについて誤って警告を出していた CustomResourceDefinition 処理の v1.34 のデグレード(リグレッション)を修正しました。 (#133896)

  • Persistent Volume におけるノードアフィニティを可変(mutable)にしました。 (#134339)

  • 必要な CSI ドライバーが不足しているノードに Pod がスケジューリングされるのを防止しました。 (#135012)

  • HPA の設定可能な許容値(configurable tolerance)をベータに昇格させました。 HPAConfigurableTolerance FeatureGateはデフォルトで有効になりました。 (#133128)

    📝 HPAでは、アップダウンが激しくなりすぎないように現在値/目標値の比率が許容値を越えたときのみスケールさせます。今まではこの許容値は10%固定でしたが、10%で数十Pod変動するような大規模なワークロードでは動きが荒くなりすぎるため、 .spec.behaviour.scaleDown(/Up).tolerance フィールドから個別に変更できるよう導入されました。

  • ReplicaSet および Deployment の .status.terminatingReplicas 追跡をベータに昇格させました。 DeploymentReplicaSetTerminatingReplicas FeatureGateはデフォルトで有効になりました。 (#133087)

    📝 Podをリストしなくても ReplicaSetとDeploymentの削除中のPod数を該当フィールドから確認できるようになりました。この機能は、KEP-3973の削除中のPod数を考慮してローリングアップデートする新しい podReplacementPolicy のために追加されています。現在はPodがTerminatingになった瞬間に代りのPodが生成されますが、完全にTerminatedになったあとに生成するというポリシが追加されます。

  • PodObservedGenerationTracking を GA(一般公開)に昇格させました。 (#134948)

  • JobManagedBy 機能を一般公開(GA)に昇格させました。 JobManagedBy FeatureGateは true に固定され、将来の Kubernetes リリースで削除される予定です。 (#135080)

  • MaxUnavailableStatefulSet 機能をベータに昇格させ、デフォルトで有効にしました。 (#133153)

    📝 DeploymentのようにStatefulSetでも maxUnavailable を指定できるようにするFeature Gateが導入されていましたが、ベータに昇格しデフォルト有効になりました。

  • v1.32 以降ロックされていた StrictCostEnforcementForVAP および StrictCostEnforcementForWebhooks FeatureGateを削除しました。 (#134994)

  • DRA デバイスの Taints と Toleration 機能に、 DeviceTaintRules のサポートを制御する個別のFeatureGate DRADeviceTaintRules が用意されました。これにより、 DRADeviceTaints を有効にしたままこの機能を無効にでき、 ResourceSlices 経由のテイントを引き続き動作させることが可能になります。 (#135068)

  • Service の trafficDistribution フィールドの PreferSameZone および PreferSameNode の値が一般公開(GA)に昇格しました。 PreferClose の値は、より明示的な PreferSameZone に取って代わられ、非推奨となりました。 (#134457)

  • 拡張リソース(extended resource)にマッピングされるデバイスクラスは、 requests.<拡張リソース名> を消費するようになりました。 (#134210)

  • MutatingAdmissionPolicy のストレージバージョンを v1beta1 に更新しました。 (#133715)

  • 同じリソースプール内の ResourceSlices をまたいだカウンターセットの参照をサポートするように Partitionable Devices 機能を更新しました。不完全なプールのデバイスは割り当ての対象外となりました。この変更によりアルファ機能に後方互換性のない更新が導入されたため、この機能を使用している ResourceSlices は v1.34 と v1.35 の間でのアップグレードまたはダウングレードの前に削除する必要があります。 (#134189)

✨ Features (機能追加)

  • DNSラベルおよびDNSサブドメインへの準拠を強制するため、 k8s-short-name および k8s-long-name 形式のバリデーションタグを追加しました。 (#133894)

    📝 validation-genへRFC 1123 DNS Label に準拠しているかをチェックする +k8s:format=k8s-short-name と、RFC 1123 DNS Subdomain に準拠しているかをチェックする +k8s:format=k8s-long-name のマーカーが追加されました。

  • UUID形式のバリデーションのサポートを追加しました。 (#133948)

    📝 こちらもvalidation-genへの機能追加で、 +k8s:format=uuid のマーカを付与するとUUIDフォーマットか検証されます。

  • CloudControllerManagerWatchBasedRoutesReconciliation FeatureGateを追加しました。 (#131220)

  • WaitForNamedCacheSyncWaitForNamedCacheSyncWithContext に変更しました。 (#133904)

  • DRA: resource.k8s.io APIは、デフォルトのストレージバージョンとして(1.34で導入された)=v1= APIバージョンを使用するようになりました。1.33へのダウングレードはサポートされていません。 (#133876)

  • informerscontrollers で使用される real-FIFO キューにおいて、ウォッチイベントを処理するためのバッチ処理を追加することでスループットを向上させました。 (#132240)

    📝 今までのDeltaFIFOの processDeltas 関数では、1イベントtごとにwrite lockをとっていましたが、大規模環境ではRead Lockの競合でスループットが大幅に低下するという問題がありました。これを解決するため、1回のロックで複数のイベントを処理できるようになりました。

  • Kube-apiserver: サブリソースである pods/execpods/attach、および pods/portforward において、SPDY と Websocket の両方の API リクエストで create 権限を必要とするように変更しました。以前は、SPDY リクエストには create 権限が必要でしたが、Websocket リクエストには get 権限のみが必要でした。この変更は AuthorizePodWebsocketUpgradeCreatePermission FeatureGateによって制御され、デフォルトで有効になっています。1.35 にアップグレードする前に、 pods/execpods/attach 、または pods/portforward の権限を付与することを意図したカスタムの ClusterRole および Role に create 動詞が含まれていることを確認してください。 (#134577)

  • resource.k8s.io のバリデーションを宣言的バリデーション(declarative validation)に移行しました。 DeclarativeValidation FeatureGateが有効な場合、既存のバリデーションとの不一致がメトリクス経由で報告されます。 DeclarativeValidationTakeover FeatureGateが有効な場合、移行されたフィールドのエラーの主な発生源は宣言的バリデーションになります。 (#134072)

  • InPlacePodVerticalScaling を GA(一般公開)に昇格させました。 (#134949)

  • すべてのサブリソースに対して抽出関数(extract functions)を生成するように applyconfiguration-gen を更新しました。 (#132665)

    📝 applyconfiguration-gen ではいままで ExtractStatusFrom で Status のextractだけをサポートしていましたが、Scaleなど他のサブリソースにも対応しました

  • 生成されたコード内で、ソース型からの構造体およびフィールドのコメントを保持するように applyconfiguration-gen を更新しました。 (#132663)

🐛 Bug or Regression (バグ修正)

  • ValidatingAdmissionPolicy において、 additionalProperties: true を持つスキーマが kube-controller-manager を nil ポインタ例外でクラッシュさせる可能性があるバグを修正しました。 (#135155)
  • アルファ版の client-go FeatureGate「ClientsPreferCBOR」が有効な際、apiserver が認可、トークン認証、imagepolicy admission、および監査(audit)の Webhook に対して不適切な Content-Type リクエストヘッダーを送信してしまうバグを修正しました。 (#132960)
  • 深くネストされた JSON フィールドを更新する際にセグメンテーションフォールトが発生するのを防ぐため、バグを修正しました。 (#134381)
  • デフォルトの v1.30+ 構成において、新規作成された名前空間内のオブジェクトを ValidatingAdmissionPolicy または MutatingAdmissionPolicy でインターセプトする際に発生していた、誤った namespace not found エラーを修正しました。 (#135359)
  • API の replacement タグが、ストレージバージョンのセレクターとして機能しなくなるよう修正しました。 (#135197)
  • ConfigFlagsCertFileKeyFile が含まれ、かつ元の設定に CertFileDataKeyFileData も含まれている場合に発生するバリデーションエラーを修正しました。 (#133917)
  • Kube-apiserver: 「Error getting keys」という誤ったログメッセージが表示される v1.34 のデグレード(リグレッション)を修正しました。 (#133817)
  • Kube-apiserver: ウォッチキャッシュから提供されないリソース(通常は Events のみ)のオブジェクトサイズ統計を計算する際に発生していた、 v1.34 でのパフォーマンス低下の可能性がある問題を修正しました。 (#133873)
  • Kube-apiserver: CEL バリデーションルールを持つカスタムリソースのバリデーションエラーメッセージを改善し、バリデーションに失敗した値が含まれるようにしました。 (#132798)
    • 📝 CELでは今まで検証に失敗したルールとフィールドは表示されませんでしたが、実際の値も表示されるようになりました。
  • Kube-apiserver: --requestheader-client-ca-file--client-ca-file に重複する証明書が含まれている場合、通常のクライアント証明書が任意のユーザーに対して認証プロキシヘッダーを設定できないよう、 --requestheader-allowed-names の指定を必須にしました。 (#131411)
  • Kube-apiserver: API サーバーの起動中に、有効化されたアルファ版 API に関する不要な警告ログメッセージが表示される問題を解決しました。 (#135327)
  • Kube-controller-manager: ガベージコレクションコントローラーにおけるデータレースの可能性を修正しました。 (#134379)
  • Kubeadm: IPv6 環境でホスト名の構築に失敗する可能性があったプリフライトチェックを修正しました。 (#134588)
  • init-events を生成するレガシーなウォッチコール( ResourceVersion = 0 または未設定)について、 API Priority and Fairness (APF) のシート使用量の重みを高くしました。これらのコストを適切に計算することで、API サーバーを CPU 過負荷から保護します。結果として、ユーザーはこれらの呼び出しに対するスロットリングが増加する可能性があります。 (#134601)
  • 型定義された workqueue が、シャットダウン前にゴルーチンをクリーンアップするようになりました。 (#135072)
  • MutatingAdmissionPolicy が、重複するリストアイテム(環境変数など)を持つオブジェクトへの適用に失敗するバグを修正しました。 (#135560)
  • K8s.io/client-go: Informer が設定された Transformer 関数を使用できなくなっていた 1.34+ のデグレード(リグレッション)を修正しました。 (#135580)

🔬 Others (その他修正)

  • Kube-apiserver: 無効な DeleteOptions を渡した際に、誤って 400 ステータスではなく 500 ステータスが返される問題を修正しました。 (#133358)
  • k8s.io/kubelet/pkg/apis/dra から非推奨の gogo プロトコル定義を削除し、 google.golang.org/protobuf に置き換えました。 (#133026)
  • v1.35 において、 storage.k8s.io/v1alpha1 API から VolumeAttributesClass リソースを削除しました。 (#134625)
  • AggregatedDiscoveryRemoveBetaType FeatureGateが非推奨となり、 true に固定されました。 (#134230)
  • etcdv3.6.5 に更新しました。 (#134251)
  • etcd クライアントライブラリを v3.6.5 に更新しました。 (#134780)
  • kubeadm: コントロールプレーンのバージョン v1.32v1.33 、および v1.34 に対して、サポートされる etcd バージョンを v3.5.24 に更新しました。 (#134779)
  • etcd: etcdv3.6.6 に更新しました。 (#135271)
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?