From dea9e917b25da34ef299bf0fc438a34c37efa3e0 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Tue, 10 Nov 2020 17:46:37 -0800 Subject: [PATCH] Fix a bug that DefaultPreemption plugin is disabled when using scheduler policy --- cmd/kube-scheduler/app/server_test.go | 1 + pkg/scheduler/BUILD | 2 ++ .../apis/config/testing/compatibility_test.go | 25 +++++++++++++++---- pkg/scheduler/factory.go | 6 ++++- pkg/scheduler/factory_test.go | 6 +++++ test/integration/scheduler/scheduler_test.go | 10 ++++++-- 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/cmd/kube-scheduler/app/server_test.go b/cmd/kube-scheduler/app/server_test.go index 37fd74a1549..90adf19fba4 100644 --- a/cmd/kube-scheduler/app/server_test.go +++ b/cmd/kube-scheduler/app/server_test.go @@ -351,6 +351,7 @@ profiles: {Name: "TaintToleration"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, }, diff --git a/pkg/scheduler/BUILD b/pkg/scheduler/BUILD index f6f77557d85..49d1785867d 100644 --- a/pkg/scheduler/BUILD +++ b/pkg/scheduler/BUILD @@ -19,6 +19,7 @@ go_library( "//pkg/scheduler/core:go_default_library", "//pkg/scheduler/framework/plugins:go_default_library", "//pkg/scheduler/framework/plugins/defaultbinder:go_default_library", + "//pkg/scheduler/framework/plugins/defaultpreemption:go_default_library", "//pkg/scheduler/framework/plugins/noderesources:go_default_library", "//pkg/scheduler/framework/plugins/queuesort:go_default_library", "//pkg/scheduler/framework/runtime:go_default_library", @@ -65,6 +66,7 @@ go_test( "//pkg/scheduler/core:go_default_library", "//pkg/scheduler/framework/plugins:go_default_library", "//pkg/scheduler/framework/plugins/defaultbinder:go_default_library", + "//pkg/scheduler/framework/plugins/defaultpreemption:go_default_library", "//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library", "//pkg/scheduler/framework/plugins/nodelabel:go_default_library", "//pkg/scheduler/framework/plugins/nodeports:go_default_library", diff --git a/pkg/scheduler/apis/config/testing/compatibility_test.go b/pkg/scheduler/apis/config/testing/compatibility_test.go index 18644c422ed..689c6a2061c 100644 --- a/pkg/scheduler/apis/config/testing/compatibility_test.go +++ b/pkg/scheduler/apis/config/testing/compatibility_test.go @@ -75,7 +75,8 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "NodeAffinity"}, {Name: "TaintToleration"}, }, - "BindPlugin": {{Name: "DefaultBinder"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "BindPlugin": {{Name: "DefaultBinder"}}, }, }, // This is a special test for the case where a policy is specified without specifying any filters. @@ -95,7 +96,8 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "NodeUnschedulable"}, {Name: "TaintToleration"}, }, - "BindPlugin": {{Name: "DefaultBinder"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "BindPlugin": {{Name: "DefaultBinder"}}, }, }, // Do not change this JSON after the corresponding release has been tagged. @@ -136,7 +138,8 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "NodeLabel"}, {Name: "ServiceAffinity"}, }, - "PreScorePlugin": {{Name: "SelectorSpread"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "PreScorePlugin": {{Name: "SelectorSpread"}}, "ScorePlugin": { {Name: "NodeResourcesLeastAllocated", Weight: 1}, {Name: "NodeLabel", Weight: 4}, @@ -191,7 +194,8 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "NodeLabel"}, {Name: "ServiceAffinity"}, }, - "PreScorePlugin": {{Name: "SelectorSpread"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "PreScorePlugin": {{Name: "SelectorSpread"}}, "ScorePlugin": { {Name: "NodeResourcesBalancedAllocation", Weight: 2}, {Name: "NodeResourcesLeastAllocated", Weight: 2}, @@ -254,7 +258,8 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "AzureDiskLimits"}, {Name: "VolumeZone"}, }, - "PreScorePlugin": {{Name: "SelectorSpread"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "PreScorePlugin": {{Name: "SelectorSpread"}}, "ScorePlugin": { {Name: "NodeResourcesBalancedAllocation", Weight: 2}, {Name: "ImageLocality", Weight: 2}, @@ -324,6 +329,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -400,6 +406,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -487,6 +494,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -585,6 +593,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -686,6 +695,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -792,6 +802,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -910,6 +921,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -1031,6 +1043,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -1152,6 +1165,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, @@ -1277,6 +1291,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "VolumeZone"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "InterPodAffinity"}, {Name: "SelectorSpread"}, diff --git a/pkg/scheduler/factory.go b/pkg/scheduler/factory.go index 8165968d28a..05489680ca8 100644 --- a/pkg/scheduler/factory.go +++ b/pkg/scheduler/factory.go @@ -42,6 +42,7 @@ import ( "k8s.io/kubernetes/pkg/scheduler/core" frameworkplugins "k8s.io/kubernetes/pkg/scheduler/framework/plugins" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder" + "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort" frameworkruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime" @@ -290,12 +291,15 @@ func (c *Configurator) createFromConfig(policy schedulerapi.Policy) (*Scheduler, // Combine all framework configurations. If this results in any duplication, framework // instantiation should fail. var defPlugins schedulerapi.Plugins - // "PrioritySort" and "DefaultBinder" were neither predicates nor priorities + // "PrioritySort", "DefaultPreemption" and "DefaultBinder" were neither predicates nor priorities // before. We add them by default. defPlugins.Append(&schedulerapi.Plugins{ QueueSort: &schedulerapi.PluginSet{ Enabled: []schedulerapi.Plugin{{Name: queuesort.Name}}, }, + PostFilter: &schedulerapi.PluginSet{ + Enabled: []schedulerapi.Plugin{{Name: defaultpreemption.Name}}, + }, Bind: &schedulerapi.PluginSet{ Enabled: []schedulerapi.Plugin{{Name: defaultbinder.Name}}, }, diff --git a/pkg/scheduler/factory_test.go b/pkg/scheduler/factory_test.go index 3ab7608945b..2335c667f70 100644 --- a/pkg/scheduler/factory_test.go +++ b/pkg/scheduler/factory_test.go @@ -40,6 +40,7 @@ import ( "k8s.io/kubernetes/pkg/scheduler/apis/config/scheme" frameworkplugins "k8s.io/kubernetes/pkg/scheduler/framework/plugins" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder" + "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/interpodaffinity" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodelabel" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort" @@ -113,6 +114,11 @@ func TestCreateFromConfig(t *testing.T) { if diff := cmp.Diff(wantQueuePls, queueSortPls); diff != "" { t.Errorf("Unexpected QueueSort plugins (-want, +got): %s", diff) } + postFilterPls := prof.ListPlugins()["PostFilterPlugin"] + wantPostFilterPls := []schedulerapi.Plugin{{Name: defaultpreemption.Name}} + if diff := cmp.Diff(wantPostFilterPls, postFilterPls); diff != "" { + t.Errorf("Unexpected PostFilter plugins (-want, +got): %s", diff) + } bindPls := prof.ListPlugins()["BindPlugin"] wantBindPls := []schedulerapi.Plugin{{Name: defaultbinder.Name}} if diff := cmp.Diff(wantBindPls, bindPls); diff != "" { diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index 4b15ffcc9ff..0cc7e7f46bb 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -91,6 +91,7 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { {Name: "NodeResourcesFit"}, {Name: "TaintToleration"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "ScorePlugin": { {Name: "ImageLocality", Weight: 1}, }, @@ -128,6 +129,7 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { {Name: "PodTopologySpread"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "PodTopologySpread"}, {Name: "InterPodAffinity"}, @@ -163,7 +165,8 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { {Name: "NodeUnschedulable"}, {Name: "TaintToleration"}, }, - "BindPlugin": {{Name: "DefaultBinder"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "BindPlugin": {{Name: "DefaultBinder"}}, }, }, { @@ -185,6 +188,7 @@ priorities: {Name: "NodeResourcesFit"}, {Name: "TaintToleration"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "ScorePlugin": { {Name: "ImageLocality", Weight: 1}, }, @@ -221,6 +225,7 @@ kind: Policy {Name: "PodTopologySpread"}, {Name: "InterPodAffinity"}, }, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, "PreScorePlugin": { {Name: "PodTopologySpread"}, {Name: "InterPodAffinity"}, @@ -255,7 +260,8 @@ priorities: [] {Name: "NodeUnschedulable"}, {Name: "TaintToleration"}, }, - "BindPlugin": {{Name: "DefaultBinder"}}, + "PostFilterPlugin": {{Name: "DefaultPreemption"}}, + "BindPlugin": {{Name: "DefaultBinder"}}, }, }, } {