mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #108278 from kerthcet/feature/graduate-defaultPodTopologySpread-to-ga
graduate default pod topology spread to ga
This commit is contained in:
		@@ -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,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -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},
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -227,15 +227,9 @@ 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
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesFitArgs(obj *v1beta2.NodeResourcesFitArgs) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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{},
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -227,15 +227,9 @@ 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
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesFitArgs(obj *v1beta3.NodeResourcesFitArgs) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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{},
 | 
			
		||||
 
 | 
			
		||||
@@ -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"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user