diff --git a/go.mod b/go.mod index 252979992..fd25de355 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( gopkg.in/go-jose/go-jose.v2 v2.6.3 gopkg.in/natefinch/lumberjack.v2 v2.2.1 k8s.io/api v0.0.0-20250309133059-a634b5da20f8 - k8s.io/apimachinery v0.0.0-20250309132801-e25aab096bf1 + k8s.io/apimachinery v0.0.0-20250311012723-56015c7e0a4c k8s.io/client-go v0.0.0-20250309133502-a50f4a61f1fe k8s.io/component-base v0.0.0-20250309134709-8856f5121e0f k8s.io/klog/v2 v2.130.1 diff --git a/go.sum b/go.sum index 6d1210c61..c1322f926 100644 --- a/go.sum +++ b/go.sum @@ -369,8 +369,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20250309133059-a634b5da20f8 h1:jiMSGVqkId+uu7ZytgmVIKmi0JpSxEnvLpEWREXANF0= k8s.io/api v0.0.0-20250309133059-a634b5da20f8/go.mod h1:PInlXJ1egb20DkfXa0bXGEDngGOImO/YqhnFd5AI3GA= -k8s.io/apimachinery v0.0.0-20250309132801-e25aab096bf1 h1:d/VoopIHn2M/gpBlYCIbjmypEAy2v+5E2rM4eyqoGhI= -k8s.io/apimachinery v0.0.0-20250309132801-e25aab096bf1/go.mod h1:S2OIkExGqJOXYSYcAJwQ9zWcc6BkBUdTJUu4M7z0cvo= +k8s.io/apimachinery v0.0.0-20250311012723-56015c7e0a4c h1:he1Z3jPl/VLtSc0TPJX0nVrZ15/fd8Ri87Nh4Q4jqjw= +k8s.io/apimachinery v0.0.0-20250311012723-56015c7e0a4c/go.mod h1:S2OIkExGqJOXYSYcAJwQ9zWcc6BkBUdTJUu4M7z0cvo= k8s.io/client-go v0.0.0-20250309133502-a50f4a61f1fe h1:z8Vy9OfF439ZSdA2VAkvJuwwmQRMViVFBUCMmwOTjYY= k8s.io/client-go v0.0.0-20250309133502-a50f4a61f1fe/go.mod h1:upRE5ReMBvvnk8vF0rotPqiFmZibsjm6DQleUoG0L8M= k8s.io/component-base v0.0.0-20250309134709-8856f5121e0f h1:p5iwVOxDbA+veZGM1SompAZtmmEl4hfSGtoVA1ZvwC4= diff --git a/pkg/endpoints/discovery/aggregated/wrapper.go b/pkg/endpoints/discovery/aggregated/wrapper.go index 25fe90fa4..c9f0907e7 100644 --- a/pkg/endpoints/discovery/aggregated/wrapper.go +++ b/pkg/endpoints/discovery/aggregated/wrapper.go @@ -28,8 +28,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" - genericfeatures "k8s.io/apiserver/pkg/features" - utilfeature "k8s.io/apiserver/pkg/util/feature" ) type WrappedHandler struct { @@ -39,13 +37,11 @@ type WrappedHandler struct { } func (wrapped *WrappedHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { - if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.AggregatedDiscoveryEndpoint) { - mediaType, _ := negotiation.NegotiateMediaTypeOptions(req.Header.Get("Accept"), wrapped.s.SupportedMediaTypes(), DiscoveryEndpointRestrictions) - // mediaType.Convert looks at the request accept headers and is used to control whether the discovery document will be aggregated. - if IsAggregatedDiscoveryGVK(mediaType.Convert) { - wrapped.aggHandler.ServeHTTP(resp, req) - return - } + mediaType, _ := negotiation.NegotiateMediaTypeOptions(req.Header.Get("Accept"), wrapped.s.SupportedMediaTypes(), DiscoveryEndpointRestrictions) + // mediaType.Convert looks at the request accept headers and is used to control whether the discovery document will be aggregated. + if IsAggregatedDiscoveryGVK(mediaType.Convert) { + wrapped.aggHandler.ServeHTTP(resp, req) + return } wrapped.handler.ServeHTTP(resp, req) } diff --git a/pkg/endpoints/discovery/aggregated/wrapper_test.go b/pkg/endpoints/discovery/aggregated/wrapper_test.go index 3db842afb..91071b647 100644 --- a/pkg/endpoints/discovery/aggregated/wrapper_test.go +++ b/pkg/endpoints/discovery/aggregated/wrapper_test.go @@ -24,9 +24,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - genericfeatures "k8s.io/apiserver/pkg/features" - utilfeature "k8s.io/apiserver/pkg/util/feature" - featuregatetesting "k8s.io/component-base/featuregate/testing" ) const discoveryPath = "/apis" @@ -60,8 +57,6 @@ func (f fakeHTTPHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) } func TestAggregationEnabled(t *testing.T) { - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.AggregatedDiscoveryEndpoint, true) - unaggregated := fakeHTTPHandler{data: "unaggregated"} aggregated := fakeHTTPHandler{data: "aggregated"} wrapped := WrapAggregatedDiscoveryToHandler(unaggregated, aggregated) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 8e4153d10..5da529e1e 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -34,20 +34,6 @@ const ( // of code conflicts because changes are more likely to be scattered // across the file. - // owner: @ivelichkovich, @tallclair - // stable: v1.30 - // kep: https://kep.k8s.io/3716 - // - // Enables usage of MatchConditions fields to use CEL expressions for matching on admission webhooks - AdmissionWebhookMatchConditions featuregate.Feature = "AdmissionWebhookMatchConditions" - - // owner: @jefftree @alexzielenski - // stable: v1.30 - // - // Enables an single HTTP endpoint /discovery/ which supports native HTTP - // caching with ETags containing all APIResources known to the apiserver. - AggregatedDiscoveryEndpoint featuregate.Feature = "AggregatedDiscoveryEndpoint" - // owner: @modulitos // // Allow user.DefaultInfo.UID to be set from x509 cert during cert auth. @@ -142,13 +128,6 @@ const ( // in the spec returned from kube-apiserver. OpenAPIEnums featuregate.Feature = "OpenAPIEnums" - // owner: @caesarxuchao - // stable: 1.29 - // - // Allow apiservers to show a count of remaining items in the response - // to a chunking list request. - RemainingItemCount featuregate.Feature = "RemainingItemCount" - // owner: @stlaz // // Enable kube-apiserver to accept UIDs via request header authentication. @@ -267,18 +246,6 @@ func init() { // Entries are alphabetized and separated from each other with blank lines to avoid sweeping gofmt changes // when adding or removing one entry. var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{ - AdmissionWebhookMatchConditions: { - {Version: version.MustParse("1.27"), Default: false, PreRelease: featuregate.Alpha}, - {Version: version.MustParse("1.28"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.30"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - }, - - AggregatedDiscoveryEndpoint: { - {Version: version.MustParse("1.26"), Default: false, PreRelease: featuregate.Alpha}, - {Version: version.MustParse("1.27"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.30"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - }, - AllowParsingUserUIDFromCertAuth: { {Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.Beta}, }, @@ -357,12 +324,6 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.24"), Default: true, PreRelease: featuregate.Beta}, }, - RemainingItemCount: { - {Version: version.MustParse("1.15"), Default: false, PreRelease: featuregate.Alpha}, - {Version: version.MustParse("1.16"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.29"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - }, - RemoteRequestHeaderUID: { {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, diff --git a/pkg/server/config.go b/pkg/server/config.go index 9e9bf4e3d..c2f885948 100644 --- a/pkg/server/config.go +++ b/pkg/server/config.go @@ -845,14 +845,12 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G muxAndDiscoveryCompleteSignals: map[string]<-chan struct{}{}, } - if c.FeatureGate.Enabled(genericfeatures.AggregatedDiscoveryEndpoint) { - manager := c.AggregatedDiscoveryGroupManager - if manager == nil { - manager = discoveryendpoint.NewResourceManager("apis") - } - s.AggregatedDiscoveryGroupManager = manager - s.AggregatedLegacyDiscoveryGroupManager = discoveryendpoint.NewResourceManager("api") + manager := c.AggregatedDiscoveryGroupManager + if manager == nil { + manager = discoveryendpoint.NewResourceManager("apis") } + s.AggregatedDiscoveryGroupManager = manager + s.AggregatedLegacyDiscoveryGroupManager = discoveryendpoint.NewResourceManager("api") for { if c.JSONPatchMaxCopyBytes <= 0 { break @@ -1111,12 +1109,8 @@ func installAPI(name string, s *GenericAPIServer, c *Config) { routes.Version{Version: c.EffectiveVersion.BinaryVersion().Info()}.Install(s.Handler.GoRestfulContainer) if c.EnableDiscovery { - if c.FeatureGate.Enabled(genericfeatures.AggregatedDiscoveryEndpoint) { - wrapped := discoveryendpoint.WrapAggregatedDiscoveryToHandler(s.DiscoveryGroupManager, s.AggregatedDiscoveryGroupManager) - s.Handler.GoRestfulContainer.Add(wrapped.GenerateWebService("/apis", metav1.APIGroupList{})) - } else { - s.Handler.GoRestfulContainer.Add(s.DiscoveryGroupManager.WebService()) - } + wrapped := discoveryendpoint.WrapAggregatedDiscoveryToHandler(s.DiscoveryGroupManager, s.AggregatedDiscoveryGroupManager) + s.Handler.GoRestfulContainer.Add(wrapped.GenerateWebService("/apis", metav1.APIGroupList{})) } if c.FlowControl != nil { c.FlowControl.Install(s.Handler.NonGoRestfulMux) diff --git a/pkg/server/genericapiserver.go b/pkg/server/genericapiserver.go index 82b9df944..c2d9f5c5b 100644 --- a/pkg/server/genericapiserver.go +++ b/pkg/server/genericapiserver.go @@ -785,28 +785,26 @@ func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *A } resourceInfos = append(resourceInfos, r...) - if s.FeatureGate.Enabled(features.AggregatedDiscoveryEndpoint) { - // Aggregated discovery only aggregates resources under /apis - if apiPrefix == APIGroupPrefix { - s.AggregatedDiscoveryGroupManager.AddGroupVersion( - groupVersion.Group, - apidiscoveryv2.APIVersionDiscovery{ - Freshness: apidiscoveryv2.DiscoveryFreshnessCurrent, - Version: groupVersion.Version, - Resources: discoveryAPIResources, - }, - ) - } else { - // There is only one group version for legacy resources, priority can be defaulted to 0. - s.AggregatedLegacyDiscoveryGroupManager.AddGroupVersion( - groupVersion.Group, - apidiscoveryv2.APIVersionDiscovery{ - Freshness: apidiscoveryv2.DiscoveryFreshnessCurrent, - Version: groupVersion.Version, - Resources: discoveryAPIResources, - }, - ) - } + // Aggregated discovery only aggregates resources under /apis + if apiPrefix == APIGroupPrefix { + s.AggregatedDiscoveryGroupManager.AddGroupVersion( + groupVersion.Group, + apidiscoveryv2.APIVersionDiscovery{ + Freshness: apidiscoveryv2.DiscoveryFreshnessCurrent, + Version: groupVersion.Version, + Resources: discoveryAPIResources, + }, + ) + } else { + // There is only one group version for legacy resources, priority can be defaulted to 0. + s.AggregatedLegacyDiscoveryGroupManager.AddGroupVersion( + groupVersion.Group, + apidiscoveryv2.APIVersionDiscovery{ + Freshness: apidiscoveryv2.DiscoveryFreshnessCurrent, + Version: groupVersion.Version, + Resources: discoveryAPIResources, + }, + ) } } @@ -844,12 +842,8 @@ func (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo // Install the version handler. // Add a handler at / to enumerate the supported api versions. legacyRootAPIHandler := discovery.NewLegacyRootAPIHandler(s.discoveryAddresses, s.Serializer, apiPrefix) - if s.FeatureGate.Enabled(features.AggregatedDiscoveryEndpoint) { - wrapped := discoveryendpoint.WrapAggregatedDiscoveryToHandler(legacyRootAPIHandler, s.AggregatedLegacyDiscoveryGroupManager) - s.Handler.GoRestfulContainer.Add(wrapped.GenerateWebService("/api", metav1.APIVersions{})) - } else { - s.Handler.GoRestfulContainer.Add(legacyRootAPIHandler.WebService()) - } + wrapped := discoveryendpoint.WrapAggregatedDiscoveryToHandler(legacyRootAPIHandler, s.AggregatedLegacyDiscoveryGroupManager) + s.Handler.GoRestfulContainer.Add(wrapped.GenerateWebService("/api", metav1.APIVersions{})) s.registerStorageReadinessCheck("", apiGroupInfo) return nil