From 4439fc35901d8baba4b48723c4a38a82f60c1df7 Mon Sep 17 00:00:00 2001 From: kerthcet Date: Wed, 23 Feb 2022 19:45:27 +0800 Subject: [PATCH] feat: graduate DefaultPodTopologySpread to GA Co-authored-by: drfish Signed-off-by: kerthcet --- cmd/kube-scheduler/app/server_test.go | 13 +-- pkg/features/kube_features.go | 2 +- pkg/scheduler/apis/config/types_pluginargs.go | 3 +- .../apis/config/v1beta2/default_plugins.go | 10 --- .../config/v1beta2/default_plugins_test.go | 85 ------------------- pkg/scheduler/apis/config/v1beta2/defaults.go | 8 +- .../apis/config/v1beta2/defaults_test.go | 10 --- .../apis/config/v1beta3/default_plugins.go | 13 --- .../config/v1beta3/default_plugins_test.go | 34 -------- pkg/scheduler/apis/config/v1beta3/defaults.go | 8 +- .../apis/config/v1beta3/defaults_test.go | 10 --- .../config/v1beta2/types_pluginargs.go | 3 +- .../config/v1beta3/types_pluginargs.go | 3 +- 13 files changed, 9 insertions(+), 193 deletions(-) diff --git a/cmd/kube-scheduler/app/server_test.go b/cmd/kube-scheduler/app/server_test.go index 749225b411b..b6bd1946471 100644 --- a/cmd/kube-scheduler/app/server_test.go +++ b/cmd/kube-scheduler/app/server_test.go @@ -39,7 +39,6 @@ import ( "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults" - "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" ) func TestSetup(t *testing.T) { @@ -217,10 +216,10 @@ leaderElection: wantLeaderElection *componentbaseconfig.LeaderElectionConfiguration }{ { - name: "default config with an alpha feature enabled and an beta feature disabled", + name: "default config with an alpha feature enabled", flags: []string{ "--kubeconfig", configKubeconfig, - "--feature-gates=VolumeCapacityPriority=true,DefaultPodTopologySpread=false", + "--feature-gates=VolumeCapacityPriority=true", }, wantPlugins: map[string]*config.Plugins{ "default-scheduler": func() *config.Plugins { @@ -235,17 +234,11 @@ leaderElection: PreBind: defaults.ExpandedPluginsV1beta3.PreBind, Reserve: defaults.ExpandedPluginsV1beta3.Reserve, } - plugins.PreScore.Enabled = append(plugins.PreScore.Enabled, config.Plugin{Name: names.SelectorSpread, Weight: 0}) - plugins.Score.Enabled = append( - plugins.Score.Enabled, - config.Plugin{Name: names.SelectorSpread, Weight: 1}, - ) return plugins }(), }, restoreFeatures: map[featuregate.Feature]bool{ - features.VolumeCapacityPriority: false, - features.DefaultPodTopologySpread: true, + features.VolumeCapacityPriority: false, }, }, { diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index d5f40a52660..42c8c708fe0 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -888,7 +888,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS DaemonSetUpdateSurge: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22 DownwardAPIHugePages: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22 AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha}, - DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.Beta}, + DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.26 WinOverlay: {Default: true, PreRelease: featuregate.Beta}, WinDSR: {Default: false, PreRelease: featuregate.Alpha}, DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta}, diff --git a/pkg/scheduler/apis/config/types_pluginargs.go b/pkg/scheduler/apis/config/types_pluginargs.go index a8143e019d7..4ea5ce1ec14 100644 --- a/pkg/scheduler/apis/config/types_pluginargs.go +++ b/pkg/scheduler/apis/config/types_pluginargs.go @@ -105,8 +105,7 @@ type PodTopologySpreadArgs struct { // Nodes and Zones. // - "List": Use constraints defined in .defaultConstraints. // - // Defaults to "List" if feature gate DefaultPodTopologySpread is disabled - // and to "System" if enabled. + // Defaults to "System". // +optional DefaultingType PodTopologySpreadConstraintsDefaulting } diff --git a/pkg/scheduler/apis/config/v1beta2/default_plugins.go b/pkg/scheduler/apis/config/v1beta2/default_plugins.go index 1d63003aa8b..0eb8af06e46 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins.go @@ -116,16 +116,6 @@ func applyFeatureGates(config *v1beta2.Plugins) { if utilfeature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) { config.Score.Enabled = append(config.Score.Enabled, v1beta2.Plugin{Name: names.VolumeBinding, Weight: pointer.Int32Ptr(1)}) } - - if !utilfeature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) { - // When feature is enabled, the default spreading is done by - // PodTopologySpread plugin, which is enabled by default. - klog.InfoS("Registering SelectorSpread plugin") - s := v1beta2.Plugin{Name: names.SelectorSpread} - config.PreScore.Enabled = append(config.PreScore.Enabled, s) - s.Weight = pointer.Int32Ptr(1) - config.Score.Enabled = append(config.Score.Enabled, s) - } } // mergePlugins merges the custom set into the given default one, handling disabled sets. diff --git a/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go b/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go index 934588833d7..6909fc74041 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go @@ -24,7 +24,6 @@ import ( "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kube-scheduler/config/v1beta2" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -114,90 +113,6 @@ func TestApplyFeatureGates(t *testing.T) { }, }, }, - { - name: "DefaultPodTopologySpread disabled", - features: map[featuregate.Feature]bool{ - features.DefaultPodTopologySpread: false, - }, - wantConfig: &v1beta2.Plugins{ - QueueSort: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.PrioritySort}, - }, - }, - PreFilter: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.NodeResourcesFit}, - {Name: names.NodePorts}, - {Name: names.VolumeRestrictions}, - {Name: names.PodTopologySpread}, - {Name: names.InterPodAffinity}, - {Name: names.VolumeBinding}, - {Name: names.NodeAffinity}, - }, - }, - Filter: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.NodeUnschedulable}, - {Name: names.NodeName}, - {Name: names.TaintToleration}, - {Name: names.NodeAffinity}, - {Name: names.NodePorts}, - {Name: names.NodeResourcesFit}, - {Name: names.VolumeRestrictions}, - {Name: names.EBSLimits}, - {Name: names.GCEPDLimits}, - {Name: names.NodeVolumeLimits}, - {Name: names.AzureDiskLimits}, - {Name: names.VolumeBinding}, - {Name: names.VolumeZone}, - {Name: names.PodTopologySpread}, - {Name: names.InterPodAffinity}, - }, - }, - PostFilter: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.DefaultPreemption}, - }, - }, - PreScore: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.InterPodAffinity}, - {Name: names.PodTopologySpread}, - {Name: names.TaintToleration}, - {Name: names.NodeAffinity}, - {Name: names.SelectorSpread}, - }, - }, - Score: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)}, - {Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)}, - {Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)}, - {Name: names.NodeResourcesFit, Weight: pointer.Int32Ptr(1)}, - {Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)}, - {Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)}, - {Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)}, - {Name: names.SelectorSpread, Weight: pointer.Int32Ptr(1)}, - }, - }, - Reserve: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.VolumeBinding}, - }, - }, - PreBind: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.VolumeBinding}, - }, - }, - Bind: v1beta2.PluginSet{ - Enabled: []v1beta2.Plugin{ - {Name: names.DefaultBinder}, - }, - }, - }, - }, } for _, test := range tests { diff --git a/pkg/scheduler/apis/config/v1beta2/defaults.go b/pkg/scheduler/apis/config/v1beta2/defaults.go index ebea4c4f62e..9e92a323412 100644 --- a/pkg/scheduler/apis/config/v1beta2/defaults.go +++ b/pkg/scheduler/apis/config/v1beta2/defaults.go @@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta2.NodeResourcesB } func SetDefaults_PodTopologySpreadArgs(obj *v1beta2.PodTopologySpreadArgs) { - if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) { - if obj.DefaultingType == "" { - obj.DefaultingType = v1beta2.SystemDefaulting - } - return - } if obj.DefaultingType == "" { - obj.DefaultingType = v1beta2.ListDefaulting + obj.DefaultingType = v1beta2.SystemDefaulting } } diff --git a/pkg/scheduler/apis/config/v1beta2/defaults_test.go b/pkg/scheduler/apis/config/v1beta2/defaults_test.go index 2e101dd618b..d25b5309365 100644 --- a/pkg/scheduler/apis/config/v1beta2/defaults_test.go +++ b/pkg/scheduler/apis/config/v1beta2/defaults_test.go @@ -586,16 +586,6 @@ func TestPluginArgsDefaults(t *testing.T) { DefaultingType: v1beta2.SystemDefaulting, }, }, - { - name: "PodTopologySpreadArgs empty, DefaultPodTopologySpread feature disabled", - features: map[featuregate.Feature]bool{ - features.DefaultPodTopologySpread: false, - }, - in: &v1beta2.PodTopologySpreadArgs{}, - want: &v1beta2.PodTopologySpreadArgs{ - DefaultingType: v1beta2.ListDefaulting, - }, - }, { name: "NodeResourcesFitArgs not set", in: &v1beta2.NodeResourcesFitArgs{}, diff --git a/pkg/scheduler/apis/config/v1beta3/default_plugins.go b/pkg/scheduler/apis/config/v1beta3/default_plugins.go index 9519eb3e693..ca360b78260 100644 --- a/pkg/scheduler/apis/config/v1beta3/default_plugins.go +++ b/pkg/scheduler/apis/config/v1beta3/default_plugins.go @@ -18,10 +18,8 @@ package v1beta3 import ( "k8s.io/apimachinery/pkg/util/sets" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" "k8s.io/kube-scheduler/config/v1beta3" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -54,21 +52,10 @@ func getDefaultPlugins() *v1beta3.Plugins { }, }, } - applyFeatureGates(plugins) return plugins } -func applyFeatureGates(config *v1beta3.Plugins) { - if !utilfeature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) { - // When feature is enabled, the default spreading is done by - // PodTopologySpread plugin, which is enabled by default. - klog.InfoS("Registering SelectorSpread plugin") - s := v1beta3.Plugin{Name: names.SelectorSpread, Weight: pointer.Int32Ptr(1)} - config.MultiPoint.Enabled = append(config.MultiPoint.Enabled, s) - } -} - // mergePlugins merges the custom set into the given default one, handling disabled sets. func mergePlugins(defaultPlugins, customPlugins *v1beta3.Plugins) *v1beta3.Plugins { if customPlugins == nil { diff --git a/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go b/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go index 4b73e21f631..30c32761c4d 100644 --- a/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go @@ -24,7 +24,6 @@ import ( "k8s.io/apiserver/pkg/util/feature" "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -64,39 +63,6 @@ func TestApplyFeatureGates(t *testing.T) { }, }, }, - { - name: "DefaultPodTopologySpread disabled", - features: map[featuregate.Feature]bool{ - features.DefaultPodTopologySpread: false, - }, - wantConfig: &v1beta3.Plugins{ - MultiPoint: v1beta3.PluginSet{ - Enabled: []v1beta3.Plugin{ - {Name: names.PrioritySort}, - {Name: names.NodeUnschedulable}, - {Name: names.NodeName}, - {Name: names.TaintToleration, Weight: pointer.Int32(3)}, - {Name: names.NodeAffinity, Weight: pointer.Int32(2)}, - {Name: names.NodePorts}, - {Name: names.NodeResourcesFit, Weight: pointer.Int32(1)}, - {Name: names.VolumeRestrictions}, - {Name: names.EBSLimits}, - {Name: names.GCEPDLimits}, - {Name: names.NodeVolumeLimits}, - {Name: names.AzureDiskLimits}, - {Name: names.VolumeBinding}, - {Name: names.VolumeZone}, - {Name: names.PodTopologySpread, Weight: pointer.Int32(2)}, - {Name: names.InterPodAffinity, Weight: pointer.Int32(2)}, - {Name: names.DefaultPreemption}, - {Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32(1)}, - {Name: names.ImageLocality, Weight: pointer.Int32(1)}, - {Name: names.DefaultBinder}, - {Name: names.SelectorSpread, Weight: pointer.Int32(1)}, - }, - }, - }, - }, } for _, test := range tests { diff --git a/pkg/scheduler/apis/config/v1beta3/defaults.go b/pkg/scheduler/apis/config/v1beta3/defaults.go index cc333e08667..cc785a92b49 100644 --- a/pkg/scheduler/apis/config/v1beta3/defaults.go +++ b/pkg/scheduler/apis/config/v1beta3/defaults.go @@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta3.NodeResourcesB } func SetDefaults_PodTopologySpreadArgs(obj *v1beta3.PodTopologySpreadArgs) { - if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) { - if obj.DefaultingType == "" { - obj.DefaultingType = v1beta3.SystemDefaulting - } - return - } if obj.DefaultingType == "" { - obj.DefaultingType = v1beta3.ListDefaulting + obj.DefaultingType = v1beta3.SystemDefaulting } } diff --git a/pkg/scheduler/apis/config/v1beta3/defaults_test.go b/pkg/scheduler/apis/config/v1beta3/defaults_test.go index 27b53fcdb92..f1c2a0fa27a 100644 --- a/pkg/scheduler/apis/config/v1beta3/defaults_test.go +++ b/pkg/scheduler/apis/config/v1beta3/defaults_test.go @@ -581,16 +581,6 @@ func TestPluginArgsDefaults(t *testing.T) { DefaultingType: v1beta3.SystemDefaulting, }, }, - { - name: "PodTopologySpreadArgs empty, DefaultPodTopologySpread feature disabled", - features: map[featuregate.Feature]bool{ - features.DefaultPodTopologySpread: false, - }, - in: &v1beta3.PodTopologySpreadArgs{}, - want: &v1beta3.PodTopologySpreadArgs{ - DefaultingType: v1beta3.ListDefaulting, - }, - }, { name: "NodeResourcesFitArgs not set", in: &v1beta3.NodeResourcesFitArgs{}, diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types_pluginargs.go b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types_pluginargs.go index 34768d3c9ab..96529a54e75 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types_pluginargs.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types_pluginargs.go @@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct { // Nodes and Zones. // - "List": Use constraints defined in .defaultConstraints. // - // Defaults to "List" if feature gate DefaultPodTopologySpread is disabled - // and to "System" if enabled. + // Defaults to "System". // +optional DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"` } diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta3/types_pluginargs.go b/staging/src/k8s.io/kube-scheduler/config/v1beta3/types_pluginargs.go index 2c3fa4cbbe0..54884d57057 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta3/types_pluginargs.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta3/types_pluginargs.go @@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct { // Nodes and Zones. // - "List": Use constraints defined in .defaultConstraints. // - // Defaults to "List" if feature gate DefaultPodTopologySpread is disabled - // and to "System" if enabled. + // Defaults to "System". // +optional DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"` }