2
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.30: SIG-API Machineryの変更内容

Last updated at Posted at 2024-05-14

はじめに

Kubernetes 1.30 がリリースされました 🎉

今回のリリースでもCELまわりの改善がすすんでいます。今回はFeatureGateの追加ですが、実際にMutatingAdmissionPolicyが入るとValidatingの方と含めて置き換えられるWebhooが増えるので嬉しいですね。他にも CustomResourceFieldSelectors など便利機能がいくつか入っています。

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

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

🎉 Major Changes

CRD validation ratcheting

この機能を利用するにはFeature GateのCRDValidationRatchetingの有効化が必要です。有効化すると、クラスタ内のすべてのCustomResourceDefinitionに適用されます。これにより、APIサーバは、バリデーションに失敗したフィールドが更新リクエストの変更対象でなければ、正常に変更するようになります。つまり、もともとバリデーションに失敗している箇所はそのまま残ります。この機能により、CRDの管理者はOpenAPIV3スキーマに新しい検証を安心して追加できます。ユーザーは、オブジェクトのバージョンアップや、ワークフローの破壊を気にせず新しいスキーマを利用できます。

📝 リソースのPATCH/UPDATE時に、変更していないフィールドのバリデーションエラーを無視するための機能です。ユーザ影響を気にしてCRDのバリデーションを変更できない…という悩みを解決してくれます。

Storage Version Migration

Kubernetes v1.30では、StorageVersionMigration用の新しいAPIが追加されました。Kubernetesは、ストレージ内のデータをメンテナンスするトリガとして、APIデータがアクティブに書き変えられることに依存しています。たとえば、保存されたリソースのバージョン管理スキーマの推奨バージョンがv1からv2に変更されると、保存されているデータの暗号化、つまり、データの暗号化方法の変更に基づいて古いデータが書き換えられます。StorageVersionMigrationはAlpha APIで、以前から利用可能でした。詳細はストレージのバージョン移行を参照してください。

📝 もともと kubernetes-sigs/kube-storage-version-migrator のリポジトリで管理されていたSVMがk8s本体に移動しました。今回は移動なため、SVMのHA APIサーバのハンドリングなどが追加されたわけではありません。SVMについては そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! で詳しく解説されています。

🗑️ Deprecation (非推奨になったAPI)

None

🌏 API Changes (API周りの変更)

  • Jobの managedBy フィールドを追加しました。このフィールドのカスタム値(kubernetes.io/job-controller 以外の値)を持つJobはJobコントローラによってスキップされ、フィールドの値で示される外部コントローラに委譲されます。このフィールドを持たないJobや、フィールドの値が予約文字列 kubernetes.io/job-controller であるJobは、ビルドインのJobコントローラに調整されます。(#123273)
    • 📝 kueueのmulticluster用
  • JobsのSuccessPolicyをAlphaでサポートしました。(#123412)
    • 📝 コンテナのexit codeやPodのconditionに応じて失敗条件を指定するFailurePolicyの方はv1.26からBetaでしたが、今回は成功条件の方もAlphaで入りました。詳しくは KEP-3998 参照。
  • IPアドレスとCIDR用の CEL ライブラリを追加しました。これはバージョン 1.31 から使えます。(#121912)
  • Dynamic Resource Allocation: DRA ドライバは、"構造化パラメータ" を使って、スケジューラがClaim割り当てを処理できるようになりました。(#123516)
  • AdmissionWebhookMatchConditions がGAに昇格しました。FeatureGateはデフォルト有効になっています。(#123560)
    • 📝 AdmissionWebhookのmatchConditionフィールドで、リソースとWebhookの紐づけをCELで記述できるようにした機能です。 KEP-3716
  • Structured Authentication Configurationが DiscoveryURL をサポートしました。指定された場合、 discoveryURL はDiscovery情報取得のためのURLを上書きします。これは、well-known と jwks のエンドポイントがissuerと別の場所(クラスタ内のローカルなど)でホストされている場合のためです。(#123527)
  • 以前はCustom Resource Definition(CRD)として利用できた StorageVersionMigration APIが、のビルトインAPIになりました。(#123344)
  • readOnly ボリュームがカーネルバージョン >= 5.12 で再帰的読み込み専用マウントをサポートしました。(#123180)
  • kube-apiserver: --authentication-config フラグで設定できる AuthenticationConfiguration が apiserver.config.k8s.io/v1beta1 に昇格しました。(#123696, #123640)
  • kubelet 設定の podLogsDir から(デフォルトの /var/log/pods の代わりに) Podログ用のカスタムルートディレクトリを指定できるようになりました。(#112957)
  • resource.k8s.io/ResourceClaim (AlphaAPI): status.reservedFor 配列用のStrategicMergePatchで個々のエントリーを追加できるようになりました。この変更により、StrategicMergePatchを利用しているクライアントがステータス変更時に以前の動作(配列全体を置き換える)に依存していると、破損する可能性があります。(#122276)
    • 📝 DRAでPod情報の更新で必要になって実装された機能です
  • runtime.Serializer にCBORの実装を追加しました。CBORがAlphaを卒業するまでは、CBORが設定されたAPIサーバは起動に失敗します。(#122881)
  • Service spec に新しいAlphaフィールド trafficDistribution を追加しました。これは ServiceTrafficDistribution FeatureGateで有効になります。(#123487)
  • AuthenticationConfigurationにaudienceMatchPolicyフィールドを追加し、複数のaudienceの設定をサポートしました。(#123165)
    • audiencesフィールドに単一のaudienceを指定する場合、audienceMatchPolicyは空(または未設定)にできます。
    • audiencesフィールドに複数のaudienceが指定されている場合、audienceMatchPolicyは MatchAny の設定が必要です。
  • MutableFeatureGate に、FeatureGateのデフォルト設定を上書きする機能を追加しました。これにより、全コンポーネントに影響をあたえることなく、個別に設定できるようになります。(#122647)
  • Aggregated Discoveryは v2beta1v2 の両方をサポートし、GA に昇格しました。(#122882)
  • Custom ResourceのフィールドセレクタがAlphaでサポートされました。 CustomResourceFieldSelectors FeatureGateを有効にすると、CustomResourceDefinition API で selectableFields を指定できます。設定すると、ListリクエストやWatchリクエストでその CustomResourceDefinition のCustom Resourceをフィルタできます。(#122717)
    • 📝 標準リソースではフィルタできるfield selectorがいくつかありましたが、CRDでも設定できるようになりました。
  • AppArmor プロファイルは PodSecurityContext とコンテナの SecurityContext のフィールドに設定できるようになります。Beta版の AppArmor アノテーションは非推奨となり、AppArmor のステータスはノードのReady条件に含まれなくなりました。(#123435)
  • kubeletでConcurrent Log Rotationを有効にします。 containerLogMaxWorkers 設定で同時ローテーションの最大数、 containerLogMonitorInterval で監視間隔を調整できるようになりました。(#114301)
  • Pod Scheduling GateがGAしました。FeatureGateの PodSchedulingReadiness の設定にかかわらず、 .spec.schedulingGates フィールドは、PodとPodTemplate APIで常に有効になります。(#123575)
  • PodのTopology Spread Constraintsにおける minDomains がGAしました。 FeatureGateの MinDomainsInPodTopologySpread の設定にかかわらず、PodとPodTopologySpreadは常に有効になります。(#123481)
  • kubelet の設定で、 .memorySwap.swapBehavior フィールドに NoSwap が指定できるようになりました。これまで設定できていた UnlimitedSwap は削除されます。(#122745)
  • CEL式でチェックされるユーザ名が空文字列の場合OIDC認証を失敗させます。 以前はユーザ名が空文字列であっても認証されていました。(#123568)
  • PodSpecAPIから、 hostAliases がhostNetworkPodではサポートされないという注意書きを削除しました。この機能は、v1.8からサポートされています。(#122422)
  • authentication-config フラグで設定された JWT認証の設定は、ディスク上のファイルが変更されると自動的に再読み込みされるようになりました。(#123525)
  • StructuredAuthenticationConfiguration 機能がBetaに昇格し、デフォルト有効になりました。(#123719)
  • ユーザが CSIDriver.SpecFSGroupPolicyPodInfoOnMount を変更できるようになりました。(#116209)
  • ValidatingAdmissionPolicy がGAに昇格し、デフォルト有効になりました。(#123405)
  • client-goでEventを扱うとき、Contextual Loggingのサポートが必要な場合は NewEventBroadcasterAdapter ではなく NewEventBroadcasterAdapterWithContext の利用が推奨になりました。(#122142)

✨ Features (機能追加)

  • WatchListClient FeatureGateを client-go に追加しました。これを有効にすると、クライアントはサーバからチャンキングではなく、ストリームを取得できます。(#122571)
  • Informersが起動後にIndexersを追加できるようになりました。(#117046)
  • FeatureGateの CRDValidationRatcheting がBetaに昇格し、デフォルト有効になりました。(#121461)
  • sendInitialEventsが要求された場合、Watchキャッシュは少なくとも指定されたrequestedWatchRVと同じになるまで待機するようになりました。(#122830)
  • client-go でsub-resourceのフィールドをクライアントサイドからサーバーサイドにアップグレードをサポートしました。(#123484)
  • AdmissionChainでMutatingPolicyを有効にするためのFeatureGate MutatingAdmissionPolicy を追加しました。(#123425)
  • PriorityLevelConfigurationオブジェクトの nominalConcurrencyShares フィールドが、 flowcontrol.apiserver.k8s.io/v1flowcontrol.apiserver.k8s.io/v1beta3 の両方のAPIでゼロ値を受け入れるようになりました。(#123001)
  • client-go にFeatureGateメカニズムを導入しました。 ユーザーは、環境変数やコマンドラインオプションで機能を制御できるようになります。(#122555)
  • 監査ログに apiserver.latency.k8s.io/decode-response-object アノテーションが追加され、デコード時間が記録されるようになりました。(#121512)
  • ValidatingAdmissionPolicyで、tokenReview、SelfSubjectReview、LocalSubjectAccessReview、およびSubjectAccessReviewが、すべてのバージョンのauthentication.k8s.ioおよび、authorization.k8s.ioグループから除外されるようになりました。(#123543)
  • kube-apiserverで RetryGenerateName FeatureGateが有効な場合、generateNameを使用した作成リクエストが既存のリソース名と競合すると、apiserverによって自動的に再試行されるようになりました。この機能はAlphaです。(#122887)
  • ValidatingAdmissionPolicy がType Check Policyで変数が使えるようになりました。(#123083)

🐛 Bug or Regression (バグ修正)

  • CRDValidationRatcheting FeatureGateが有効な場合にのみ設定できるはずの CustomResourceDefinition 検証ルールで、新しいAlpha値 optionalOldSelf API フィールドが誤って有効になっていたのを修正しました。(#122329)
  • ValidatingAdmissionPolicy でCRDパラメータを利用するポリシーの同期に失敗するバグを修正しました。(#123003)
  • キャッシュからのConsistent Listingを有効にした場合に、非再帰リストが "resource version too high" エラーを返す問題を修正しました。(#123674)
  • etcdのレスポンスをデコードするときに、コンテキストのタイムアウトを尊重するようになりました。(#121815)
  • Etcd: v3.5.11 に更新しました。(#122393)
  • APIServicesがAggregated Discoveryから欠落している場合も、ヘルスチェックに成功することがあるバグを修正しました。(#122883)
  • CRD検証ルールにFieldPathを提供すると、同じスキーマ上の他の無関係なCRD検証ルールのフィールドパスに影響してしまうバグを修正しました。(#123475)
  • resourceVersion=0で動作していたWatchキャッシュから、ConsistentListingを有効にするように修正しました。(#123676)
  • InPlacePodVerticalScaling がオンの場合に、クォータ計算エラーによってリソース削除に失敗する問題を修正しました。(#122701)
  • Kube-apiserver: <=1.27 のようにデフォルトでWatchキャッシュから resourceVersion なしのWatchリクエストを許可することで、 1.27+ からあったWatchの安定性 のリグレッションを修正したました。(PR 115096 の変更をデフォルトで無効にしました)。これにより、EtcdのWatchのバグ (https://github.com/etcd-io/etcd/pull/17555) の影響が緩和されます。Watchの安定性を犠牲にしてでも、PR 115096 の 1.27 の変更が必要な場合は、 WatchFromStorageWithoutResourceVersion FeatureGateから再度有効にしてください。(#123935)
  • OpenAPI V2 は、APIService で指定されたグループバージョンと一致しないAggregated APIServiceのOpenAPIを非公開にします。(#123570)
  • Aggregated APIServiceがそのSpec.Serviceフィールドを変更したまま戻さなかった場合に発生する、Discovery Documentのリークを修正します。(#123517)
  • Watchキャッシュが飢餓状態になるのを防ぐため、Watchを別のRPCに移動しました。この動作を無効にするための SeparateCacheWatchRPC 機能フラグを追加しました。(#123532)
  • CVE-2024-24786 を解決するため、 google.golang.org/protobuf を v1.33.0 に更新しました。(#123758)

🔬 Others (その他修正)

  • client-go: リーダがLeaseを更新するときに、APIサーバからレコードを取得せずにリーダロックを楽観的に更新するよう最適化しました。また、新しいメトリック leader_election_slowpath_total が追加されました。これにより、ユーザはLeader Electionで楽観的に更新されてない数を監視できます。(#122069)
  • client-go/metadata がコンテキストロギングに移行しました。(#122225)
  • FeatureGateからGAしている RemoveSelfLink を削除しました。(#122468)
  • Watchリクエストのスタックメモリ利用量を削減する最適化を追加しました。 これは、 APIServingWithRoutine=false で無効化できます。 (#120902)
  • FeatureGate LegacyServiceAccountTokenCleanUp がGAに昇格し、デフォルトで常時有効になりました。 (#122635)
  • kube-controller-manager--cidr-allocator-type オプションを CloudAllocator に設定していましたが、将来のリリースで非推奨になり削除予定です。外部のクラウドプロバイダが提供するオプションへの移行を検討してください。(#123011)
2
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
2
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?