Kubernetes 1.28变更内容:SIG-API Machinery的变动

首先

Kubernetes v1.28已发布?

2019年から動きのあったSidecarsがついに入りました! (KEP番号も700番台) 前バージョンのv1.27のIn-Place Resizingにつづき、Podまわりの大きな変更が続いて楽しいですね。CEL(Common Expression Language)まわりも色々改善が続いており、AdmissionWebhookMatchConditionsはデフォルト有効になりました。Workaroundや運用で対処していたようなSidecarしかり、(SIG API外ではあるものの)Non Graceful Node Shutdownなどが標準機能として入ってきています(おそらく次バージョンなPreStop Hookも期待)。Kubernetesが成熟してきた感がありますね。

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

请参考此处有关SIG和KEP的信息。

API变更

    • Feature Gateの AdmissionWebhookMatchCondition がBetaに昇格しました。 (#119380)

 

    • Feature Gateの ValidtatingAdmissionPolicy がBetaに昇格しました。デフォルト無効です。 (#119409)

Betaになるとデフォルト有効になるケースが多いですが、ValidtaingAdmissionPolicyはデフォルト無効です。

APIグループの ValidatingAdmissionPolicy と ValidatingAdmissionPolicyBinding が v1beta1 に昇格しました。 (#118644)

admissionregistration.k8s.io/v1alpha1.ValidatingAdmissionPolicy に namespaceParamRef フィールドを追加しました。 (#119215)
ValidatingAdmissionPolicyのCEL expressionによるNamespaceアクセスをサポートしました。 namespaceObject 変数から設定できます。 (#118267)
Job APIに podReplacementPolicy と terminating フィールドを追加しました。 (#119301)

? 着々とMLワークロードでもJobがうまく使えるようにするための変更が続いていますね。実際どう使えるかについては公式ブログの Kubernetes 1.28: Improved failure handling for Jobs | Kubernetes で解説されています。

CRD Validation Ruleに reason と fieldPath フィールドを追加しました。これにより、バリデーションの失敗理由を定義できます。 (#118041)
Alpha機能の CRDValidationRatcheting を追加しました。PATCH/UPDATE Validation Ratcheting中に変更していない更箇所で発生したOpenAPI Schemaのバリデーションエラーを無視します。 (#118990)
バージョン差や該当のAPIがローカルのAPIサーバで無効化されている場合に、ピアのAPIサーバにリクエストをプロキシする機能をサポートしました。 (#117740)

? Kubernetes 1.28: A New (alpha) Mechanism For Safer Cluster Upgrades | Kubernetes のリクエストフロー図がとても分かりやすかったです。

新しくFeature Gateに”SidecarContainers”が追加されました。この機能では、sidecar containerという他のコンテナの前に起動する新しいタイプのinitコンテナが導入されました。ただし、削除時はPodのライフサイクルの最後まで動作し続け、また、Podの終了処理はブロックしません。(#116429)

? sidecarをinitコンテナとして起動する機能が追加されました。Sidecar導入モチベーションの一つである、コンテナ単位でRestartPolicyを制御や、起動時の順番制御ができるようになりました(終了時の順番制御はまだできません)。Sidecar ContainersについてはtoVersusさんのスライドが詳しいです。 KEP から眺める Kubernetes – KEP-753: Sidecar Containers (P13)

client-go: reflectorキャッシュが更新が低頻度な大量のオブジェクトをwatchする際のメモリ使用量を改善しました。 (#113362)

kube-controller-manager: Feature Gateの LegacyServiceAccountTokenCleanUp がAlphaに追加されました(デフォルト無効です)。有効の場合、 legacy-service-account-token-cleaner コントローラが –legacy-service-account-token-clean-up-period (デフォルト1年)で指定された期間に渡って未使用かつ、ServiceAccountオブジェクトの .secrets リストから参照されており、どのPodからも参照されていないのService Account Token Secretを削除します。 (#115554)
API Priority and Fairness機能において、 制限を免除されたPriorityレベルがNominalと貸与可能な同時実行数を受け渡し可能になりました。詳しくは KEP-1040: P&F (Dispatching) を参照してください。 (#118782)

CEL系统的更改总结

CEL系の変更が増えるに伴い、KEP番号とFeature名の迷子になることも増えてきたので表にまとめました。デフォルト値とステージについては、今回のv1.28の状態について記載しています。

KEPFeature NameDefaultStageSinceDescription2876CustomResourceValidationExpressionstrueBeta1.25CELを使って柔軟なCRのValidationを定義する機能。Validation失敗時のReasonを設定するフィールドが追加された。1.29でGA予定。3488ValidatingAdmissionPolicyfalseBeta1.28Validating Webhook無しにリソースのValidationを定義できるポリシ(ValidatingAdmissionPolicy)と、そのポリシをリソースに紐づける(ValidatingAdmissionPolicyBinding)を追加する機能。Betaに昇格、namespaceObject変数の利用とparamRefと排他なnamespaceParamRefフィールドが利用可能になった。3716AdmissionWebhookMatchConditionstrueBeta1.28AdmissionWebhookでも matchConditions フィールドを使ってCELによる柔軟なリソースとWebhookの紐づけを可能にする機能。Betaに昇格した。4008CRDValidationRatchetingfalseAlpha1.28リソースのPATCH/UPDATE時に、変更していないフィールドのバリデーションエラーを無視するための機能。Alphaとして新しく追加された。

特点 (功能增加)

    • ValidatingAdmissionPolicyの messageExpression フィールドが、解決した型をチェックするようになりました。 (#119209)

 

    • ValidatingAdmissionPolicyの型チェックで authorizer 変数を正しく扱えるようになりました。 (#118540)

validatingwebhookconfigurations と mutatingwebhookconfigurations リソースに対して、それぞれ vwc と mwc の省略名が導入されました。 (#117535)

? 補完も設定していない環境でkubectlを直接叩く時、両リソースの名前が長すぎて面倒だったので地味にうれしいですね! とか思っていたら, official shortnameの追加方針の議論の中でこの変更はRevertされていました。shortnameが衝突した場合の挙動が予測不可能となるため、組み込みリソースへのshortname追加は原則禁止されました。この議論の中で方針についてのドキュメントも追加されています。 (thanks @toVersus!)

オプションをサポートしました(詳しくは CEL spec proposal 246)。この機能は今後のKubernetesリリース(おそらくv1.29)まで完全には有効化されませんが、ダウングレードにおける安全なロールバックをサポートするためにv1.28に追加されました。 (#118339)
CELライブラリにKubernetes Quantitiesをサポートするための新しい機能が追加されました。 (#118803)

? メモリ 1.5G 等のKubernetes QuantitiesをCELで使う用の拡張です。

Feature Gateに、APiサーバが一貫性のあるキャッシュからのリストを提供するための ConsistentListFromCache が追加されました。 (#118508)
既存のPodが完全に終了するまで待機するための PodRecreationPolicy が実装されました。 (#117015)
Feature Gateの LegacyServiceAccountTokenTracking がGAに昇格しました。自動生成されたSecretベースのService Account Tokenが使われた場合、警告がでるようになります。また、該当のSecretには、最終利用時間がタイムスタンプとしてラベルに付与されます。(ラベルのキーは kubernetes.io/legacy-token-last-used です) (#117591)
1つのリクエストを認可する過程で、ValidatingAdmissionPolicyプラグインは、一意な認可式ごとに1回以上の認証を行いません。同一の認可式は同じ評価を返します。 (#116443)
APIサーバのデバッグエンドポイントである /debug/api_priority_and_fairness/dump_requests は、キューされたリクエストと同じように実行リクエストをダンプするように拡張されました。返却されるテーブルにStartTimeのカラムが追加されます。キューに入ったリクエストのStartTimeは”0001-01-01T00:00:00Z”です。実行リクエストは、-1のRequestIndexInQueueを持ちます。また、キューを持たないPriorityレベルのQueueIndexも-1になります。 (#119009)
KubernetesはGo 1.20.6 でビルドされるようになりました。 (#119324)
etcdのイメージが 3.5.9-0 に更新されました。 (#117999)

错误或回归

    • CEL式内の listOfStrings.join() の結果に内部エラーが返る問題が修正されました。 (#117593)

 

    • PriorityClassをそのスコープに持つResourceQuotaが不正に評価される問題が修正されました。 (#117677)

creationTimestamp: null がEtcdへ不要な書き込みを発生させる問題が修正されました。 (#116865)

kube-apiserver 起動時にCustom Resource用の APIService オブジェクトが削除・再生成される問題が修正されました。 (#118104)
KubernetesのAPIサーバがAPIServiceを処理している時に発生するメモリリークが修正されました。 (#117258)
Shared Informerの Run(), SetTransform(), SetWatchErrorHandler() 間における競合が解消されました。 (#117870)

OpenAPI contentを提供する際の競合が解消されました。 (#117705)
APIサーバがimpersonated UIDを認証Webhookに送信していない問題を修正しました。 (#116681)
戦略的マージパッチで存在しないフィールドを指定した場合、リソースにpath directiveが含まれてしまう問題が修正されました。 (#117568)
特定のフィールドの戦略的マージパッチで、$deleteFromPrimitiveList directiveを利用した場合、指定した値ではない他の値が削除されてしまう問題が修正されました。 (#110472)
コンポーネントステータスのため、HTTP経由で呼び出しているEtcdのHealthエンドポイントは、Kubernetesにwatch starvationと他の kube-apiserver のprobeによる非一貫性の問題があり、修正されました。 (#118460)

openapi/v3 における apiregistration.k8s.io の発見しやすさが修正されました。 (#118879)
Reflectorのexponential backoffが改善されました。ThrottlingリクエストによるKubernetes APIサーバの負荷が大幅に削減されます。 (#118132)
OpenAPI v2がどのクライアントからもアクセスされていない場合、 api-server のCPUとメモリ消費量が削減されます。また、多くのCRDsがインストールされているAPIサーバのパフォーマンスも向上します。 (#118212)
APIレスポンスのcontent-typeパラメータ拡張を許容することで、client-goによる間違った”Unknown discovery response content-type”エラーを解決しました。 (#117571)
終了中のNamespaceで発生したFailed eventは見えなくなります。 (#114849)

kube-apiserver の(残り1つでも)graceful shutdown中にエンドポイントが削除されるようになります。 (#116685)

wait.PollUntilContextTimeout 関数は、immediateがtrueの場合、conditionは待機前に呼び出されます。また、contextがキャンセルされるかどうかに関係なく、conditionは少なくとも1回は呼び出されることが保証されます。 (#118686)

其他 (其他更正)

    • k8s.io/code-generatorの generate-groups と generate-internal-groups.sh を使っているプロジェクトでは、新しい、よりシンプルなスクリプト(kube_codegen.sh)が使えます。古いスクリプトは非推奨になりますが、そのまま残ります。 (#117262)

 

    • OpenAPI proto deserializations では、gnosticライブラリではなく gnostic-models を使ってください。 (#118384)

 

    • CustomResourceDefinitionsの OpenAPI v2 fetchingが修正されました。CRDはlazyにaggregateされるようになりました。これにより、大くのCRDがインストールされるときのリソース使用量が改善されます。結果として、OpenAPIへの初回リクエストは遅くなることがあります。 (#118808)

 

    • 主にCPUリソース使用量を50%削減するため、 OpenAPI v2 の仕様を50%ほど縮小しました。 (#118204)

 

    • eventリソースを取得する際に、 reportingController と reportingInstance フィールドが値をもつようになります。 (#116506)

kube-apiserver: キャッシュ上の GetList を実行する際のメモリ消費量が改善されました。 (#116327)

kube-controller-manager と cloud-controller-manager のコントローラ名が変更されました。これは、 –controllers フラグからon/offできます(e.g., pod-garbage-collector-controller)。古い名称(e.g., podgc)は新しい名前にaliasできます。(#115813)

? コントローラ名に一貫性がなかったのでcontextual loggingに移行するこのタイミング修正したようです。以前は名前にcontrollerが入っていないものもありましたが、新名称は -controller に統一されています。名称の定義一覧はこちらを参照してください。