はじめに
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)- 📝 公式ブログの Kubernetes 1.30: Read-only volume mounts can be finally literally read-only | Kubernetes で詳しく解説されています
- 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は
v2beta1
とv2
の両方をサポートし、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)- 📝 公式ブログの Kubernetes 1.30: Structured Authentication Configuration Moves to Beta | Kubernetes で詳しく解説されています
- ユーザが
CSIDriver.Spec
のFSGroupPolicy
とPodInfoOnMount
を変更できるようになりました。(#116209) - ValidatingAdmissionPolicy がGAに昇格し、デフォルト有効になりました。(#123405)
- 📝 Validating Webhook無しにリソースのValidationを定義できる機能がGAしました。Validating 公式ブログの Kubernetes 1.30: Validating Admission Policy Is Generally Available | Kubernetes で詳しく解説されています
- 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/v1
とflowcontrol.apiserver.k8s.io/v1beta3
の両方のAPIでゼロ値を受け入れるようになりました。(#123001)- 📝 APFまわりの変更がおちついてきましたね。APFについては Kubernetes: API Priority and Fairness で解説しています。
-
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)