はじめに
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) -
⭐
StorageVersionMigrationv1beta1API を追加し、v1alpha1API を削除しました。 [アップグレード前の注意]v1alpha1API はサポートされなくなりました。ユーザーはアップグレード前にすべてのv1alpha1リソースを削除する必要があります。 (#134784)📝 KEP4192 は、外部コンポーネントとして開発されていたetcdに保存されているオブジェクトのStorage Versionが変わった時に更新してくれる StorageVersionMigrator をk8s本体にいれるというものです。ひきつづきFeatureGateはデフォルト無効です。
: -
CSI ドライバーにおいて、CSIDriver オブジェクトの
spec.serviceAccountTokenInSecrets: trueを設定することで、ボリュームコンテキストの代わりに secrets フィールド経由でサービスアカウントトークンを受け取ることができるようになりました。これにより、ログやその他の出力にトークンが露出するのを防ぐことができます。この機能はCSIServiceAccountTokenSecretsFeatureGate(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/v1のTolerationを拡張し、数値比較演算子(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/v1alpha1Workload 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/v1alpha1Workload API を導入しました。 (#134564) -
Kube-apiserver: 数値および整数プロパティにおける認識されないフォーマットについて誤って警告を出していた
CustomResourceDefinition処理のv1.34のデグレード(リグレッション)を修正しました。 (#133896) -
Persistent Volume におけるノードアフィニティを可変(mutable)にしました。 (#134339)
-
必要な CSI ドライバーが不足しているノードに Pod がスケジューリングされるのを防止しました。 (#135012)
-
HPA の設定可能な許容値(configurable tolerance)をベータに昇格させました。
HPAConfigurableToleranceFeatureGateはデフォルトで有効になりました。 (#133128)📝 HPAでは、アップダウンが激しくなりすぎないように現在値/目標値の比率が許容値を越えたときのみスケールさせます。今まではこの許容値は10%固定でしたが、10%で数十Pod変動するような大規模なワークロードでは動きが荒くなりすぎるため、
.spec.behaviour.scaleDown(/Up).toleranceフィールドから個別に変更できるよう導入されました。 -
ReplicaSet および Deployment の
.status.terminatingReplicas追跡をベータに昇格させました。DeploymentReplicaSetTerminatingReplicasFeatureGateはデフォルトで有効になりました。 (#133087)📝 Podをリストしなくても ReplicaSetとDeploymentの削除中のPod数を該当フィールドから確認できるようになりました。この機能は、KEP-3973の削除中のPod数を考慮してローリングアップデートする新しい
podReplacementPolicyのために追加されています。現在はPodがTerminatingになった瞬間に代りのPodが生成されますが、完全にTerminatedになったあとに生成するというポリシが追加されます。 -
PodObservedGenerationTrackingを GA(一般公開)に昇格させました。 (#134948) -
JobManagedBy機能を一般公開(GA)に昇格させました。JobManagedByFeatureGateはtrueに固定され、将来の Kubernetes リリースで削除される予定です。 (#135080) -
MaxUnavailableStatefulSet機能をベータに昇格させ、デフォルトで有効にしました。 (#133153)📝 DeploymentのようにStatefulSetでも
maxUnavailableを指定できるようにするFeature Gateが導入されていましたが、ベータに昇格しデフォルト有効になりました。 -
v1.32以降ロックされていたStrictCostEnforcementForVAPおよびStrictCostEnforcementForWebhooksFeatureGateを削除しました。 (#134994) -
DRA デバイスの Taints と Toleration 機能に、
DeviceTaintRulesのサポートを制御する個別のFeatureGateDRADeviceTaintRulesが用意されました。これにより、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フォーマットか検証されます。 -
CloudControllerManagerWatchBasedRoutesReconciliationFeatureGateを追加しました。 (#131220) -
WaitForNamedCacheSyncをWaitForNamedCacheSyncWithContextに変更しました。 (#133904) -
DRA:
resource.k8s.ioAPIは、デフォルトのストレージバージョンとして(1.34で導入された)=v1= APIバージョンを使用するようになりました。1.33へのダウングレードはサポートされていません。 (#133876) -
informersとcontrollersで使用されるreal-FIFOキューにおいて、ウォッチイベントを処理するためのバッチ処理を追加することでスループットを向上させました。 (#132240)📝 今までのDeltaFIFOの
processDeltas関数では、1イベントtごとにwrite lockをとっていましたが、大規模環境ではRead Lockの競合でスループットが大幅に低下するという問題がありました。これを解決するため、1回のロックで複数のイベントを処理できるようになりました。 -
Kube-apiserver: サブリソースである
pods/exec、pods/attach、およびpods/portforwardにおいて、SPDY と Websocket の両方の API リクエストでcreate権限を必要とするように変更しました。以前は、SPDY リクエストにはcreate権限が必要でしたが、Websocket リクエストにはget権限のみが必要でした。この変更はAuthorizePodWebsocketUpgradeCreatePermissionFeatureGateによって制御され、デフォルトで有効になっています。1.35 にアップグレードする前に、pods/exec、pods/attach、またはpods/portforwardの権限を付与することを意図したカスタムの ClusterRole および Role にcreate動詞が含まれていることを確認してください。 (#134577) -
resource.k8s.ioのバリデーションを宣言的バリデーション(declarative validation)に移行しました。DeclarativeValidationFeatureGateが有効な場合、既存のバリデーションとの不一致がメトリクス経由で報告されます。DeclarativeValidationTakeoverFeatureGateが有効な場合、移行されたフィールドのエラーの主な発生源は宣言的バリデーションになります。 (#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)
-
ConfigFlagsにCertFileやKeyFileが含まれ、かつ元の設定にCertFileDataやKeyFileDataも含まれている場合に発生するバリデーションエラーを修正しました。 (#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/v1alpha1API からVolumeAttributesClassリソースを削除しました。 (#134625) -
AggregatedDiscoveryRemoveBetaTypeFeatureGateが非推奨となり、trueに固定されました。 (#134230) -
etcdをv3.6.5に更新しました。 (#134251) - etcd クライアントライブラリを
v3.6.5に更新しました。 (#134780) -
kubeadm: コントロールプレーンのバージョンv1.32、v1.33、およびv1.34に対して、サポートされる etcd バージョンをv3.5.24に更新しました。 (#134779) - etcd:
etcdをv3.6.6に更新しました。 (#135271)