From 660df229bf3929741cf31659187060d0c651dcf9 Mon Sep 17 00:00:00 2001 From: David Eads Date: Thu, 17 Apr 2025 16:34:46 -0400 Subject: [PATCH] Stop exposing list-via-watch from the server With StreamingCollectionEncodingToJSON and StreamingCollectionEncodingToProtobuf, the WatchList must re-justify its necessity. To prevent an ecosystem from building around a feature that may not be promoted, we will stop serving list-via-watch until performance numbers can justify its inclusion. This also stops the kube-controller-manager from using the list-via-watch by default. The fallback is a regular list, so during the skew during an upgrade the "right" thing will happen and the new StreamingCollectionEncoding will be used. --- cmd/kube-controller-manager/app/options/options.go | 12 ------------ .../app/options/options_test.go | 4 ++++ pkg/features/kube_features.go | 2 ++ .../k8s.io/apiserver/pkg/features/kube_features.go | 2 ++ .../reference/versioned_feature_list.yaml | 4 ++++ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index e21f9b4fdbf..a062aca0f67 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -27,7 +27,6 @@ import ( apiserveroptions "k8s.io/apiserver/pkg/server/options" "k8s.io/apiserver/pkg/util/compatibility" utilfeature "k8s.io/apiserver/pkg/util/feature" - clientgofeaturegate "k8s.io/client-go/features" clientset "k8s.io/client-go/kubernetes" clientgokubescheme "k8s.io/client-go/kubernetes/scheme" restclient "k8s.io/client-go/rest" @@ -38,13 +37,11 @@ import ( cpoptions "k8s.io/cloud-provider/options" cliflag "k8s.io/component-base/cli/flag" basecompatibility "k8s.io/component-base/compatibility" - "k8s.io/component-base/featuregate" "k8s.io/component-base/logs" logsapi "k8s.io/component-base/logs/api/v1" "k8s.io/component-base/metrics" "k8s.io/component-base/zpages/flagz" cmoptions "k8s.io/controller-manager/options" - "k8s.io/klog/v2" kubectrlmgrconfigv1alpha1 "k8s.io/kube-controller-manager/config/v1alpha1" kubecontrollerconfig "k8s.io/kubernetes/cmd/kube-controller-manager/app/config" "k8s.io/kubernetes/cmd/kube-controller-manager/names" @@ -297,15 +294,6 @@ func (s *KubeControllerManagerOptions) Flags(allControllers []string, disabledBy fs.StringVar(&s.Master, "master", s.Master, "The address of the Kubernetes API server (overrides any value in kubeconfig).") fs.StringVar(&s.Generic.ClientConnection.Kubeconfig, "kubeconfig", s.Generic.ClientConnection.Kubeconfig, "Path to kubeconfig file with authorization and master location information (the master location can be overridden by the master flag).") - if !utilfeature.DefaultFeatureGate.Enabled(featuregate.Feature(clientgofeaturegate.WatchListClient)) { - if err := utilfeature.DefaultMutableFeatureGate.OverrideDefault(featuregate.Feature(clientgofeaturegate.WatchListClient), true); err != nil { - // it turns out that there are some integration tests that start multiple control plane components which - // share global DefaultFeatureGate/DefaultMutableFeatureGate variables. - // in those cases, the above call will fail (FG already registered and cannot be overridden), and the error will be logged. - klog.Errorf("unable to set %s feature gate, err: %v", clientgofeaturegate.WatchListClient, err) - } - } - s.ComponentGlobalsRegistry.AddFlags(fss.FlagSet("generic")) return fss diff --git a/cmd/kube-controller-manager/app/options/options_test.go b/cmd/kube-controller-manager/app/options/options_test.go index 3c1ce4e39f4..4214baec048 100644 --- a/cmd/kube-controller-manager/app/options/options_test.go +++ b/cmd/kube-controller-manager/app/options/options_test.go @@ -1469,6 +1469,8 @@ func TestControllerManagerAliases(t *testing.T) { } func TestWatchListClientFlagUsage(t *testing.T) { + t.Skip("skip this test until we either bring back WatchListClient or remove it") + fs := pflag.NewFlagSet("addflagstest", pflag.ContinueOnError) s, _ := NewKubeControllerManagerOptions() for _, f := range s.Flags([]string{""}, []string{""}, nil).FlagSets { @@ -1480,6 +1482,8 @@ func TestWatchListClientFlagUsage(t *testing.T) { } func TestWatchListClientFlagChange(t *testing.T) { + t.Skip("skip this test until we either bring back WatchListClient or remove it") + fs := pflag.NewFlagSet("addflagstest", pflag.ContinueOnError) s, err := NewKubeControllerManagerOptions() if err != nil { diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index b92deb5e7f9..c942dfea9a1 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -1339,6 +1339,8 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate genericfeatures.WatchList: { {Version: version.MustParse("1.27"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, + // switch this back to false because the json and proto streaming encoders appear to work better. + {Version: version.MustParse("1.33"), Default: false, PreRelease: featuregate.Beta}, }, GitRepoVolumeDriver: { diff --git a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go index ec5df437951..0ede8f9cb95 100644 --- a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go @@ -415,5 +415,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate WatchList: { {Version: version.MustParse("1.27"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, + // switch this back to false because the json and proto streaming encoders appear to work better. + {Version: version.MustParse("1.33"), Default: false, PreRelease: featuregate.Beta}, }, } diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index 141f80d0c68..14f7e04fbb8 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -1687,6 +1687,10 @@ lockToDefault: false preRelease: Beta version: "1.32" + - default: false + lockToDefault: false + preRelease: Beta + version: "1.33" - name: WindowsCPUAndMemoryAffinity versionedSpecs: - default: false