diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index ffc24bdb23e..9497fa1f27f 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -27,6 +27,7 @@ import ( apiserveroptions "k8s.io/apiserver/pkg/server/options" utilfeature "k8s.io/apiserver/pkg/util/feature" utilversion "k8s.io/apiserver/pkg/util/version" + 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" @@ -35,10 +36,12 @@ import ( cpnames "k8s.io/cloud-provider/names" cpoptions "k8s.io/cloud-provider/options" cliflag "k8s.io/component-base/cli/flag" + "k8s.io/component-base/featuregate" "k8s.io/component-base/logs" logsapi "k8s.io/component-base/logs/api/v1" "k8s.io/component-base/metrics" 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" @@ -285,6 +288,16 @@ func (s *KubeControllerManagerOptions) Flags(allControllers []string, disabledBy fs := fss.FlagSet("misc") 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 874a4292fe9..82638720ca1 100644 --- a/cmd/kube-controller-manager/app/options/options_test.go +++ b/cmd/kube-controller-manager/app/options/options_test.go @@ -1455,8 +1455,8 @@ func TestWatchListClientFlagChange(t *testing.T) { func assertWatchListClientFeatureDefaultValue(t *testing.T) { watchListClientDefaultValue := clientgofeaturegate.FeatureGates().Enabled(clientgofeaturegate.WatchListClient) - if watchListClientDefaultValue { - t.Fatalf("expected %q feature gate to be disabled for KCM", clientgofeaturegate.WatchListClient) + if !watchListClientDefaultValue { + t.Fatalf("expected %q feature gate to be enabled for KCM", clientgofeaturegate.WatchListClient) } } @@ -1467,7 +1467,7 @@ func assertWatchListCommandLineDefaultValue(t *testing.T, fs *pflag.FlagSet) { t.Fatalf("didn't find %q flag", fgFlagName) } - expectedWatchListClientString := "WatchListClient=true|false (BETA - default=false)" + expectedWatchListClientString := "WatchListClient=true|false (BETA - default=true)" if !strings.Contains(fg.Usage, expectedWatchListClientString) { t.Fatalf("%q flag doesn't contain the expected usage for %v feature gate.\nExpected = %v\nUsage = %v", fgFlagName, clientgofeaturegate.WatchListClient, expectedWatchListClientString, fg.Usage) } diff --git a/pkg/features/versioned_kube_features.go b/pkg/features/versioned_kube_features.go index 7db027c4614..4f5e999a7df 100644 --- a/pkg/features/versioned_kube_features.go +++ b/pkg/features/versioned_kube_features.go @@ -335,6 +335,7 @@ 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}, }, genericfeatures.ZeroLimitedNominalConcurrencyShares: { 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 f576e5254f0..c17f2849a62 100644 --- a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go @@ -396,6 +396,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}, }, ZeroLimitedNominalConcurrencyShares: { diff --git a/test/e2e/apimachinery/watchlist.go b/test/e2e/apimachinery/watchlist.go index 5e41f2a9c86..c99e79d8488 100644 --- a/test/e2e/apimachinery/watchlist.go +++ b/test/e2e/apimachinery/watchlist.go @@ -44,11 +44,10 @@ import ( "k8s.io/client-go/util/consistencydetector" "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" - "k8s.io/kubernetes/test/e2e/feature" "k8s.io/kubernetes/test/e2e/framework" ) -var _ = SIGDescribe("API Streaming (aka. WatchList)", framework.WithSerial(), feature.WatchList, func() { +var _ = SIGDescribe("API Streaming (aka. WatchList)", framework.WithSerial(), func() { f := framework.NewDefaultFramework("watchlist") ginkgo.It("should be requested by informers when WatchListClient is enabled", func(ctx context.Context) { featuregatetesting.SetFeatureGateDuringTest(ginkgo.GinkgoTB(), utilfeature.DefaultFeatureGate, featuregate.Feature(clientfeatures.WatchListClient), true) diff --git a/test/featuregates_linter/test_data/versioned_feature_list.yaml b/test/featuregates_linter/test_data/versioned_feature_list.yaml index c0b8a1d17b0..554b1dd043e 100644 --- a/test/featuregates_linter/test_data/versioned_feature_list.yaml +++ b/test/featuregates_linter/test_data/versioned_feature_list.yaml @@ -1320,6 +1320,10 @@ lockToDefault: false preRelease: Alpha version: "1.27" + - default: true + lockToDefault: false + preRelease: Beta + version: "1.32" - name: WindowsHostNetwork versionedSpecs: - default: true