diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index 27560d75213..185e927e869 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -52981,6 +52981,13 @@ func schema_k8sio_kube_scheduler_config_v1_Plugins(ref common.ReferenceCallback) Description: "Plugins include multiple extension points. When specified, the list of plugins for a particular extension point are the only ones enabled. If an extension point is omitted from the config, then the default set of plugins is used for that extension point. Enabled plugins are called in the order specified here, after default plugins. If they need to be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "preEnqueue": { + SchemaProps: spec.SchemaProps{ + Description: "PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/kube-scheduler/config/v1.PluginSet"), + }, + }, "queueSort": { SchemaProps: spec.SchemaProps{ Description: "QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue.", @@ -54085,6 +54092,13 @@ func schema_k8sio_kube_scheduler_config_v1beta2_Plugins(ref common.ReferenceCall Description: "Plugins include multiple extension points. When specified, the list of plugins for a particular extension point are the only ones enabled. If an extension point is omitted from the config, then the default set of plugins is used for that extension point. Enabled plugins are called in the order specified here, after default plugins. If they need to be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "preEnqueue": { + SchemaProps: spec.SchemaProps{ + Description: "PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/kube-scheduler/config/v1beta2.PluginSet"), + }, + }, "queueSort": { SchemaProps: spec.SchemaProps{ Description: "QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue.", @@ -55175,6 +55189,13 @@ func schema_k8sio_kube_scheduler_config_v1beta3_Plugins(ref common.ReferenceCall Description: "Plugins include multiple extension points. When specified, the list of plugins for a particular extension point are the only ones enabled. If an extension point is omitted from the config, then the default set of plugins is used for that extension point. Enabled plugins are called in the order specified here, after default plugins. If they need to be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "preEnqueue": { + SchemaProps: spec.SchemaProps{ + Description: "PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/kube-scheduler/config/v1beta3.PluginSet"), + }, + }, "queueSort": { SchemaProps: spec.SchemaProps{ Description: "QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue.", diff --git a/pkg/scheduler/apis/config/types.go b/pkg/scheduler/apis/config/types.go index 2c5567f2189..8db4e35c987 100644 --- a/pkg/scheduler/apis/config/types.go +++ b/pkg/scheduler/apis/config/types.go @@ -138,6 +138,9 @@ type KubeSchedulerProfile struct { // Enabled plugins are called in the order specified here, after default plugins. If they need to // be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order. type Plugins struct { + // PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue. + PreEnqueue PluginSet + // QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue. QueueSort PluginSet @@ -231,6 +234,7 @@ func (p *Plugins) Names() []string { return nil } extensions := []PluginSet{ + p.PreEnqueue, p.PreFilter, p.Filter, p.PostFilter, diff --git a/pkg/scheduler/apis/config/v1/default_plugins.go b/pkg/scheduler/apis/config/v1/default_plugins.go index 73c3635b57e..daeb3370ed0 100644 --- a/pkg/scheduler/apis/config/v1/default_plugins.go +++ b/pkg/scheduler/apis/config/v1/default_plugins.go @@ -18,8 +18,10 @@ package v1 import ( "k8s.io/apimachinery/pkg/util/sets" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" v1 "k8s.io/kube-scheduler/config/v1" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -52,10 +54,17 @@ func getDefaultPlugins() *v1.Plugins { }, }, } + applyFeatureGates(plugins) return plugins } +func applyFeatureGates(config *v1.Plugins) { + if utilfeature.DefaultFeatureGate.Enabled(features.PodSchedulingReadiness) { + config.MultiPoint.Enabled = append(config.MultiPoint.Enabled, v1.Plugin{Name: names.SchedulingGates}) + } +} + // mergePlugins merges the custom set into the given default one, handling disabled sets. func mergePlugins(defaultPlugins, customPlugins *v1.Plugins) *v1.Plugins { if customPlugins == nil { @@ -63,6 +72,7 @@ func mergePlugins(defaultPlugins, customPlugins *v1.Plugins) *v1.Plugins { } defaultPlugins.MultiPoint = mergePluginSet(defaultPlugins.MultiPoint, customPlugins.MultiPoint) + defaultPlugins.PreEnqueue = mergePluginSet(defaultPlugins.PreEnqueue, customPlugins.PreEnqueue) defaultPlugins.QueueSort = mergePluginSet(defaultPlugins.QueueSort, customPlugins.QueueSort) defaultPlugins.PreFilter = mergePluginSet(defaultPlugins.PreFilter, customPlugins.PreFilter) defaultPlugins.Filter = mergePluginSet(defaultPlugins.Filter, customPlugins.Filter) diff --git a/pkg/scheduler/apis/config/v1/default_plugins_test.go b/pkg/scheduler/apis/config/v1/default_plugins_test.go index b459000ad3e..d9ceb2ae527 100644 --- a/pkg/scheduler/apis/config/v1/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1/default_plugins_test.go @@ -24,6 +24,7 @@ import ( "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" v1 "k8s.io/kube-scheduler/config/v1" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -63,6 +64,39 @@ func TestApplyFeatureGates(t *testing.T) { }, }, }, + { + name: "Feature gate PodSchedulingReadiness enabled", + features: map[featuregate.Feature]bool{ + features.PodSchedulingReadiness: true, + }, + wantConfig: &v1.Plugins{ + MultiPoint: v1.PluginSet{ + Enabled: []v1.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.SchedulingGates}, + }, + }, + }, + }, } for _, test := range tests { diff --git a/pkg/scheduler/apis/config/v1/defaults.go b/pkg/scheduler/apis/config/v1/defaults.go index d85e78222c2..8e86712fa25 100644 --- a/pkg/scheduler/apis/config/v1/defaults.go +++ b/pkg/scheduler/apis/config/v1/defaults.go @@ -53,6 +53,7 @@ func pluginsNames(p *configv1.Plugins) []string { p.Bind, p.PostBind, p.Permit, + p.PreEnqueue, p.QueueSort, } n := sets.NewString() diff --git a/pkg/scheduler/apis/config/v1/zz_generated.conversion.go b/pkg/scheduler/apis/config/v1/zz_generated.conversion.go index 3fca82d3a1f..d9dbc31adbc 100644 --- a/pkg/scheduler/apis/config/v1/zz_generated.conversion.go +++ b/pkg/scheduler/apis/config/v1/zz_generated.conversion.go @@ -712,6 +712,9 @@ func Convert_config_PluginSet_To_v1_PluginSet(in *config.PluginSet, out *v1.Plug } func autoConvert_v1_Plugins_To_config_Plugins(in *v1.Plugins, out *config.Plugins, s conversion.Scope) error { + if err := Convert_v1_PluginSet_To_config_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_v1_PluginSet_To_config_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } @@ -757,6 +760,9 @@ func Convert_v1_Plugins_To_config_Plugins(in *v1.Plugins, out *config.Plugins, s } func autoConvert_config_Plugins_To_v1_Plugins(in *config.Plugins, out *v1.Plugins, s conversion.Scope) error { + if err := Convert_config_PluginSet_To_v1_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_config_PluginSet_To_v1_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } diff --git a/pkg/scheduler/apis/config/v1beta2/conversion.go b/pkg/scheduler/apis/config/v1beta2/conversion.go index 0a6b6e779f2..c0d89d75ee9 100644 --- a/pkg/scheduler/apis/config/v1beta2/conversion.go +++ b/pkg/scheduler/apis/config/v1beta2/conversion.go @@ -111,3 +111,7 @@ func convertToExternalPluginConfigArgs(out *v1beta2.KubeSchedulerConfiguration) func Convert_config_KubeSchedulerProfile_To_v1beta2_KubeSchedulerProfile(in *config.KubeSchedulerProfile, out *v1beta2.KubeSchedulerProfile, s conversion.Scope) error { return autoConvert_config_KubeSchedulerProfile_To_v1beta2_KubeSchedulerProfile(in, out, s) } + +func Convert_config_Plugins_To_v1beta2_Plugins(in *config.Plugins, out *v1beta2.Plugins, s conversion.Scope) error { + return autoConvert_config_Plugins_To_v1beta2_Plugins(in, out, s) +} diff --git a/pkg/scheduler/apis/config/v1beta2/default_plugins.go b/pkg/scheduler/apis/config/v1beta2/default_plugins.go index 5b2a2017bb6..37341a4233e 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins.go @@ -116,6 +116,9 @@ 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.Int32(1)}) } + if utilfeature.DefaultFeatureGate.Enabled(features.PodSchedulingReadiness) { + config.PreEnqueue.Enabled = append(config.PreEnqueue.Enabled, v1beta2.Plugin{Name: names.SchedulingGates}) + } } // 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 27f6e53db44..aaa5d44d15a 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go @@ -24,6 +24,7 @@ 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" ) @@ -113,6 +114,93 @@ func TestApplyFeatureGates(t *testing.T) { }, }, }, + { + name: "Feature gate PodSchedulingReadiness enabled", + features: map[featuregate.Feature]bool{ + features.PodSchedulingReadiness: true, + }, + wantConfig: &v1beta2.Plugins{ + PreEnqueue: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: names.SchedulingGates}, + }, + }, + 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}, + }, + }, + Score: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32(1)}, + {Name: names.ImageLocality, Weight: pointer.Int32(1)}, + {Name: names.InterPodAffinity, Weight: pointer.Int32(1)}, + {Name: names.NodeResourcesFit, Weight: pointer.Int32(1)}, + {Name: names.NodeAffinity, Weight: pointer.Int32(1)}, + {Name: names.PodTopologySpread, Weight: pointer.Int32(2)}, + {Name: names.TaintToleration, Weight: pointer.Int32(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/zz_generated.conversion.go b/pkg/scheduler/apis/config/v1beta2/zz_generated.conversion.go index 953d61b19f9..642729e388f 100644 --- a/pkg/scheduler/apis/config/v1beta2/zz_generated.conversion.go +++ b/pkg/scheduler/apis/config/v1beta2/zz_generated.conversion.go @@ -160,11 +160,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*config.Plugins)(nil), (*v1beta2.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_Plugins_To_v1beta2_Plugins(a.(*config.Plugins), b.(*v1beta2.Plugins), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta2.PodTopologySpreadArgs)(nil), (*config.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(a.(*v1beta2.PodTopologySpreadArgs), b.(*config.PodTopologySpreadArgs), scope) }); err != nil { @@ -235,6 +230,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*config.Plugins)(nil), (*v1beta2.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_Plugins_To_v1beta2_Plugins(a.(*config.Plugins), b.(*v1beta2.Plugins), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.KubeSchedulerConfiguration)(nil), (*config.KubeSchedulerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(a.(*v1beta2.KubeSchedulerConfiguration), b.(*config.KubeSchedulerConfiguration), scope) }); err != nil { @@ -716,6 +716,9 @@ func Convert_config_PluginSet_To_v1beta2_PluginSet(in *config.PluginSet, out *v1 } func autoConvert_v1beta2_Plugins_To_config_Plugins(in *v1beta2.Plugins, out *config.Plugins, s conversion.Scope) error { + if err := Convert_v1beta2_PluginSet_To_config_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_v1beta2_PluginSet_To_config_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } @@ -761,6 +764,9 @@ func Convert_v1beta2_Plugins_To_config_Plugins(in *v1beta2.Plugins, out *config. } func autoConvert_config_Plugins_To_v1beta2_Plugins(in *config.Plugins, out *v1beta2.Plugins, s conversion.Scope) error { + if err := Convert_config_PluginSet_To_v1beta2_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_config_PluginSet_To_v1beta2_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } @@ -800,11 +806,6 @@ func autoConvert_config_Plugins_To_v1beta2_Plugins(in *config.Plugins, out *v1be return nil } -// Convert_config_Plugins_To_v1beta2_Plugins is an autogenerated conversion function. -func Convert_config_Plugins_To_v1beta2_Plugins(in *config.Plugins, out *v1beta2.Plugins, s conversion.Scope) error { - return autoConvert_config_Plugins_To_v1beta2_Plugins(in, out, s) -} - func autoConvert_v1beta2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1beta2.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error { out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints)) out.DefaultingType = config.PodTopologySpreadConstraintsDefaulting(in.DefaultingType) diff --git a/pkg/scheduler/apis/config/v1beta3/conversion.go b/pkg/scheduler/apis/config/v1beta3/conversion.go index 262f1e6ef2e..bbb8ff4f264 100644 --- a/pkg/scheduler/apis/config/v1beta3/conversion.go +++ b/pkg/scheduler/apis/config/v1beta3/conversion.go @@ -111,3 +111,8 @@ func convertToExternalPluginConfigArgs(out *v1beta3.KubeSchedulerConfiguration) func Convert_config_KubeSchedulerProfile_To_v1beta3_KubeSchedulerProfile(in *config.KubeSchedulerProfile, out *v1beta3.KubeSchedulerProfile, s conversion.Scope) error { return autoConvert_config_KubeSchedulerProfile_To_v1beta3_KubeSchedulerProfile(in, out, s) } + +// Convert_config_Plugins_To_v1beta3_Plugins is an autogenerated conversion function. +func Convert_config_Plugins_To_v1beta3_Plugins(in *config.Plugins, out *v1beta3.Plugins, s conversion.Scope) error { + return autoConvert_config_Plugins_To_v1beta3_Plugins(in, out, s) +} diff --git a/pkg/scheduler/apis/config/v1beta3/default_plugins.go b/pkg/scheduler/apis/config/v1beta3/default_plugins.go index ca360b78260..13d479fece5 100644 --- a/pkg/scheduler/apis/config/v1beta3/default_plugins.go +++ b/pkg/scheduler/apis/config/v1beta3/default_plugins.go @@ -18,8 +18,10 @@ 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" ) @@ -52,10 +54,17 @@ func getDefaultPlugins() *v1beta3.Plugins { }, }, } + applyFeatureGates(plugins) return plugins } +func applyFeatureGates(config *v1beta3.Plugins) { + if utilfeature.DefaultFeatureGate.Enabled(features.PodSchedulingReadiness) { + config.MultiPoint.Enabled = append(config.MultiPoint.Enabled, v1beta3.Plugin{Name: names.SchedulingGates}) + } +} + // 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 66e5f81235a..e1ab9d84a02 100644 --- a/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1beta3/default_plugins_test.go @@ -24,6 +24,7 @@ import ( "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kube-scheduler/config/v1beta3" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/utils/pointer" ) @@ -63,6 +64,39 @@ func TestApplyFeatureGates(t *testing.T) { }, }, }, + { + name: "Feature gate PodSchedulingReadiness enabled", + features: map[featuregate.Feature]bool{ + features.PodSchedulingReadiness: true, + }, + 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.SchedulingGates}, + }, + }, + }, + }, } for _, test := range tests { diff --git a/pkg/scheduler/apis/config/v1beta3/zz_generated.conversion.go b/pkg/scheduler/apis/config/v1beta3/zz_generated.conversion.go index 48800c0ec75..1e8fd12ba64 100644 --- a/pkg/scheduler/apis/config/v1beta3/zz_generated.conversion.go +++ b/pkg/scheduler/apis/config/v1beta3/zz_generated.conversion.go @@ -160,11 +160,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*config.Plugins)(nil), (*v1beta3.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_Plugins_To_v1beta3_Plugins(a.(*config.Plugins), b.(*v1beta3.Plugins), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta3.PodTopologySpreadArgs)(nil), (*config.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta3_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(a.(*v1beta3.PodTopologySpreadArgs), b.(*config.PodTopologySpreadArgs), scope) }); err != nil { @@ -235,6 +230,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*config.Plugins)(nil), (*v1beta3.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_Plugins_To_v1beta3_Plugins(a.(*config.Plugins), b.(*v1beta3.Plugins), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta3.KubeSchedulerConfiguration)(nil), (*config.KubeSchedulerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta3_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(a.(*v1beta3.KubeSchedulerConfiguration), b.(*config.KubeSchedulerConfiguration), scope) }); err != nil { @@ -706,6 +706,9 @@ func Convert_config_PluginSet_To_v1beta3_PluginSet(in *config.PluginSet, out *v1 } func autoConvert_v1beta3_Plugins_To_config_Plugins(in *v1beta3.Plugins, out *config.Plugins, s conversion.Scope) error { + if err := Convert_v1beta3_PluginSet_To_config_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_v1beta3_PluginSet_To_config_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } @@ -751,6 +754,9 @@ func Convert_v1beta3_Plugins_To_config_Plugins(in *v1beta3.Plugins, out *config. } func autoConvert_config_Plugins_To_v1beta3_Plugins(in *config.Plugins, out *v1beta3.Plugins, s conversion.Scope) error { + if err := Convert_config_PluginSet_To_v1beta3_PluginSet(&in.PreEnqueue, &out.PreEnqueue, s); err != nil { + return err + } if err := Convert_config_PluginSet_To_v1beta3_PluginSet(&in.QueueSort, &out.QueueSort, s); err != nil { return err } @@ -790,11 +796,6 @@ func autoConvert_config_Plugins_To_v1beta3_Plugins(in *config.Plugins, out *v1be return nil } -// Convert_config_Plugins_To_v1beta3_Plugins is an autogenerated conversion function. -func Convert_config_Plugins_To_v1beta3_Plugins(in *config.Plugins, out *v1beta3.Plugins, s conversion.Scope) error { - return autoConvert_config_Plugins_To_v1beta3_Plugins(in, out, s) -} - func autoConvert_v1beta3_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1beta3.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error { out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints)) out.DefaultingType = config.PodTopologySpreadConstraintsDefaulting(in.DefaultingType) diff --git a/pkg/scheduler/apis/config/validation/validation.go b/pkg/scheduler/apis/config/validation/validation.go index 47d85717be2..1dcfc699e80 100644 --- a/pkg/scheduler/apis/config/validation/validation.go +++ b/pkg/scheduler/apis/config/validation/validation.go @@ -198,6 +198,7 @@ func validatePluginConfig(path *field.Path, apiVersion string, profile *config.K if profile.Plugins != nil { stagesToPluginSet := map[string]config.PluginSet{ + "preEnqueue": profile.Plugins.PreEnqueue, "queueSort": profile.Plugins.QueueSort, "preFilter": profile.Plugins.PreFilter, "filter": profile.Plugins.Filter, diff --git a/pkg/scheduler/apis/config/validation/validation_test.go b/pkg/scheduler/apis/config/validation/validation_test.go index 679bb87484f..6dce867b3c6 100644 --- a/pkg/scheduler/apis/config/validation/validation_test.go +++ b/pkg/scheduler/apis/config/validation/validation_test.go @@ -543,6 +543,12 @@ func TestValidateKubeSchedulerConfigurationV1beta3(t *testing.T) { }, } + duplicatedPlugins := validConfig.DeepCopy() + duplicatedPlugins.Profiles[0].Plugins.PreEnqueue.Enabled = []config.Plugin{ + {Name: "CustomPreEnqueue"}, + {Name: "CustomPreEnqueue"}, + } + duplicatedPluginConfig := validConfig.DeepCopy() duplicatedPluginConfig.Profiles[0].PluginConfig = []config.PluginConfig{ { diff --git a/pkg/scheduler/apis/config/zz_generated.deepcopy.go b/pkg/scheduler/apis/config/zz_generated.deepcopy.go index b139c909333..f5baa62218c 100644 --- a/pkg/scheduler/apis/config/zz_generated.deepcopy.go +++ b/pkg/scheduler/apis/config/zz_generated.deepcopy.go @@ -394,6 +394,7 @@ func (in *PluginSet) DeepCopy() *PluginSet { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Plugins) DeepCopyInto(out *Plugins) { *out = *in + in.PreEnqueue.DeepCopyInto(&out.PreEnqueue) in.QueueSort.DeepCopyInto(&out.QueueSort) in.PreFilter.DeepCopyInto(&out.PreFilter) in.Filter.DeepCopyInto(&out.Filter) diff --git a/pkg/scheduler/framework/types.go b/pkg/scheduler/framework/types.go index 3b0e9514516..420aa8a73d5 100644 --- a/pkg/scheduler/framework/types.go +++ b/pkg/scheduler/framework/types.go @@ -102,6 +102,8 @@ type QueuedPodInfo struct { InitialAttemptTimestamp time.Time // If a Pod failed in a scheduling cycle, record the plugin names it failed by. UnschedulablePlugins sets.String + // Whether the Pod is scheduling gated (by PreEnqueuePlugins) or not. + Gated bool } // DeepCopy returns a deep copy of the QueuedPodInfo object. @@ -331,9 +333,9 @@ func getPodAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) { terms = affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution } // TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution. - //if len(affinity.PodAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { + // if len(affinity.PodAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { // terms = append(terms, affinity.PodAffinity.RequiredDuringSchedulingRequiredDuringExecution...) - //} + // } } return terms } @@ -344,9 +346,9 @@ func getPodAntiAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) terms = affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution } // TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution. - //if len(affinity.PodAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { + // if len(affinity.PodAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { // terms = append(terms, affinity.PodAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution...) - //} + // } } return terms } diff --git a/staging/src/k8s.io/kube-scheduler/config/v1/types.go b/staging/src/k8s.io/kube-scheduler/config/v1/types.go index 9fdec69d1ee..703516fb78c 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1/types.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1/types.go @@ -170,6 +170,9 @@ type KubeSchedulerProfile struct { // Enabled plugins are called in the order specified here, after default plugins. If they need to // be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order. type Plugins struct { + // PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue. + PreEnqueue PluginSet `json:"preEnqueue,omitempty"` + // QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue. QueueSort PluginSet `json:"queueSort,omitempty"` diff --git a/staging/src/k8s.io/kube-scheduler/config/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/kube-scheduler/config/v1/zz_generated.deepcopy.go index 48d2dffaef4..1203cdd3b93 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1/zz_generated.deepcopy.go @@ -436,6 +436,7 @@ func (in *PluginSet) DeepCopy() *PluginSet { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Plugins) DeepCopyInto(out *Plugins) { *out = *in + in.PreEnqueue.DeepCopyInto(&out.PreEnqueue) in.QueueSort.DeepCopyInto(&out.QueueSort) in.PreFilter.DeepCopyInto(&out.PreFilter) in.Filter.DeepCopyInto(&out.Filter) diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go index f561260e974..0e47967adb4 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go @@ -166,6 +166,9 @@ type KubeSchedulerProfile struct { // Enabled plugins are called in the order specified here, after default plugins. If they need to // be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order. type Plugins struct { + // PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue. + PreEnqueue PluginSet `json:"preEnqueue,omitempty"` + // QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue. QueueSort PluginSet `json:"queueSort,omitempty"` diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta2/zz_generated.deepcopy.go b/staging/src/k8s.io/kube-scheduler/config/v1beta2/zz_generated.deepcopy.go index 3b787773bf6..7ffacf0f3da 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta2/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta2/zz_generated.deepcopy.go @@ -441,6 +441,7 @@ func (in *PluginSet) DeepCopy() *PluginSet { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Plugins) DeepCopyInto(out *Plugins) { *out = *in + in.PreEnqueue.DeepCopyInto(&out.PreEnqueue) in.QueueSort.DeepCopyInto(&out.QueueSort) in.PreFilter.DeepCopyInto(&out.PreFilter) in.Filter.DeepCopyInto(&out.Filter) diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta3/types.go b/staging/src/k8s.io/kube-scheduler/config/v1beta3/types.go index 385109f16e8..45371c9d960 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta3/types.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta3/types.go @@ -159,6 +159,9 @@ type KubeSchedulerProfile struct { // Enabled plugins are called in the order specified here, after default plugins. If they need to // be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order. type Plugins struct { + // PreEnqueue is a list of plugins that should be invoked before adding pods to the scheduling queue. + PreEnqueue PluginSet `json:"preEnqueue,omitempty"` + // QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue. QueueSort PluginSet `json:"queueSort,omitempty"` diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta3/zz_generated.deepcopy.go b/staging/src/k8s.io/kube-scheduler/config/v1beta3/zz_generated.deepcopy.go index f1a3e7b2991..2b549d4990a 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta3/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta3/zz_generated.deepcopy.go @@ -431,6 +431,7 @@ func (in *PluginSet) DeepCopy() *PluginSet { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Plugins) DeepCopyInto(out *Plugins) { *out = *in + in.PreEnqueue.DeepCopyInto(&out.PreEnqueue) in.QueueSort.DeepCopyInto(&out.QueueSort) in.PreFilter.DeepCopyInto(&out.PreFilter) in.Filter.DeepCopyInto(&out.Filter)