Skip to content

Commit d99cc01

Browse files
committed
Register and enable defaultpreemption plugin
- Enable defaultpreemption as a PostFilter plugin - Remote legacy hard-coded preemption logic
1 parent f38ce57 commit d99cc01

File tree

14 files changed

+111
-35
lines changed

14 files changed

+111
-35
lines changed

cmd/kube-scheduler/app/server_test.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ profiles:
124124
filter:
125125
disabled:
126126
- name: "*"
127+
postFilter:
128+
disabled:
129+
- name: "*"
127130
preScore:
128131
disabled:
129132
- name: "*"
@@ -175,6 +178,9 @@ profiles:
175178
{Name: "PodTopologySpread"},
176179
{Name: "InterPodAffinity"},
177180
},
181+
"PostFilterPlugin": {
182+
{Name: "DefaultPreemption"},
183+
},
178184
"PreScorePlugin": {
179185
{Name: "InterPodAffinity"},
180186
{Name: "PodTopologySpread"},
@@ -221,16 +227,17 @@ profiles:
221227
},
222228
wantPlugins: map[string]map[string][]kubeschedulerconfig.Plugin{
223229
"default-scheduler": {
224-
"BindPlugin": {{Name: "DefaultBinder"}},
225-
"FilterPlugin": {{Name: "NodeResourcesFit"}, {Name: "NodePorts"}},
226-
"PreFilterPlugin": {{Name: "NodeResourcesFit"}, {Name: "NodePorts"}},
227-
"PreScorePlugin": {{Name: "InterPodAffinity"}, {Name: "TaintToleration"}},
228-
"QueueSortPlugin": {{Name: "PrioritySort"}},
229-
"ScorePlugin": {{Name: "InterPodAffinity", Weight: 1}, {Name: "TaintToleration", Weight: 1}},
230-
"ReservePlugin": {{Name: "VolumeBinding"}},
231-
"UnreservePlugin": {{Name: "VolumeBinding"}},
232-
"PreBindPlugin": {{Name: "VolumeBinding"}},
233-
"PostBindPlugin": {{Name: "VolumeBinding"}},
230+
"BindPlugin": {{Name: "DefaultBinder"}},
231+
"FilterPlugin": {{Name: "NodeResourcesFit"}, {Name: "NodePorts"}},
232+
"PreFilterPlugin": {{Name: "NodeResourcesFit"}, {Name: "NodePorts"}},
233+
"PostFilterPlugin": {{Name: "DefaultPreemption"}},
234+
"PreScorePlugin": {{Name: "InterPodAffinity"}, {Name: "TaintToleration"}},
235+
"QueueSortPlugin": {{Name: "PrioritySort"}},
236+
"ScorePlugin": {{Name: "InterPodAffinity", Weight: 1}, {Name: "TaintToleration", Weight: 1}},
237+
"ReservePlugin": {{Name: "VolumeBinding"}},
238+
"UnreservePlugin": {{Name: "VolumeBinding"}},
239+
"PreBindPlugin": {{Name: "VolumeBinding"}},
240+
"PostBindPlugin": {{Name: "VolumeBinding"}},
234241
},
235242
},
236243
},
@@ -307,6 +314,9 @@ profiles:
307314
{Name: "PodTopologySpread"},
308315
{Name: "InterPodAffinity"},
309316
},
317+
"PostFilterPlugin": {
318+
{Name: "DefaultPreemption"},
319+
},
310320
"PreScorePlugin": {
311321
{Name: "InterPodAffinity"},
312322
{Name: "PodTopologySpread"},

pkg/scheduler/algorithmprovider/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ go_library(
1515
"//pkg/scheduler/apis/config:go_default_library",
1616
"//pkg/scheduler/framework/plugins/defaultbinder:go_default_library",
1717
"//pkg/scheduler/framework/plugins/defaultpodtopologyspread:go_default_library",
18+
"//pkg/scheduler/framework/plugins/defaultpreemption:go_default_library",
1819
"//pkg/scheduler/framework/plugins/imagelocality:go_default_library",
1920
"//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library",
2021
"//pkg/scheduler/framework/plugins/nodeaffinity:go_default_library",
@@ -44,6 +45,7 @@ go_test(
4445
"//pkg/scheduler/apis/config:go_default_library",
4546
"//pkg/scheduler/framework/plugins/defaultbinder:go_default_library",
4647
"//pkg/scheduler/framework/plugins/defaultpodtopologyspread:go_default_library",
48+
"//pkg/scheduler/framework/plugins/defaultpreemption:go_default_library",
4749
"//pkg/scheduler/framework/plugins/imagelocality:go_default_library",
4850
"//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library",
4951
"//pkg/scheduler/framework/plugins/nodeaffinity:go_default_library",

pkg/scheduler/algorithmprovider/registry.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
2727
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
2828
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread"
29+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption"
2930
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/imagelocality"
3031
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/interpodaffinity"
3132
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity"
@@ -109,6 +110,11 @@ func getDefaultConfig() *schedulerapi.Plugins {
109110
{Name: interpodaffinity.Name},
110111
},
111112
},
113+
PostFilter: &schedulerapi.PluginSet{
114+
Enabled: []schedulerapi.Plugin{
115+
{Name: defaultpreemption.Name},
116+
},
117+
},
112118
PreScore: &schedulerapi.PluginSet{
113119
Enabled: []schedulerapi.Plugin{
114120
{Name: interpodaffinity.Name},

pkg/scheduler/algorithmprovider/registry_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/google/go-cmp/cmp"
2323
"k8s.io/component-base/featuregate"
24+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption"
2425

2526
utilfeature "k8s.io/apiserver/pkg/util/feature"
2627
featuregatetesting "k8s.io/component-base/featuregate/testing"
@@ -80,6 +81,11 @@ func TestClusterAutoscalerProvider(t *testing.T) {
8081
{Name: interpodaffinity.Name},
8182
},
8283
},
84+
PostFilter: &schedulerapi.PluginSet{
85+
Enabled: []schedulerapi.Plugin{
86+
{Name: defaultpreemption.Name},
87+
},
88+
},
8389
PreScore: &schedulerapi.PluginSet{
8490
Enabled: []schedulerapi.Plugin{
8591
{Name: interpodaffinity.Name},
@@ -177,6 +183,11 @@ func TestApplyFeatureGates(t *testing.T) {
177183
{Name: interpodaffinity.Name},
178184
},
179185
},
186+
PostFilter: &schedulerapi.PluginSet{
187+
Enabled: []schedulerapi.Plugin{
188+
{Name: defaultpreemption.Name},
189+
},
190+
},
180191
PreScore: &schedulerapi.PluginSet{
181192
Enabled: []schedulerapi.Plugin{
182193
{Name: interpodaffinity.Name},
@@ -262,6 +273,11 @@ func TestApplyFeatureGates(t *testing.T) {
262273
{Name: interpodaffinity.Name},
263274
},
264275
},
276+
PostFilter: &schedulerapi.PluginSet{
277+
Enabled: []schedulerapi.Plugin{
278+
{Name: defaultpreemption.Name},
279+
},
280+
},
265281
PreScore: &schedulerapi.PluginSet{
266282
Enabled: []schedulerapi.Plugin{
267283
{Name: interpodaffinity.Name},

pkg/scheduler/apis/config/testing/compatibility_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,9 @@ func TestAlgorithmProviderCompatibility(t *testing.T) {
14141414
{Name: "PodTopologySpread"},
14151415
{Name: "InterPodAffinity"},
14161416
},
1417+
"PostFilterPlugin": {
1418+
{Name: "DefaultPreemption"},
1419+
},
14171420
"PreScorePlugin": {
14181421
{Name: "InterPodAffinity"},
14191422
{Name: "PodTopologySpread"},
@@ -1483,6 +1486,9 @@ func TestAlgorithmProviderCompatibility(t *testing.T) {
14831486
{Name: "PodTopologySpread"},
14841487
{Name: "InterPodAffinity"},
14851488
},
1489+
"PostFilterPlugin": {
1490+
{Name: "DefaultPreemption"},
1491+
},
14861492
"PreScorePlugin": {
14871493
{Name: "InterPodAffinity"},
14881494
{Name: "PodTopologySpread"},
@@ -1572,6 +1578,9 @@ func TestPluginsConfigurationCompatibility(t *testing.T) {
15721578
{Name: "PodTopologySpread"},
15731579
{Name: "InterPodAffinity"},
15741580
},
1581+
"PostFilterPlugin": {
1582+
{Name: "DefaultPreemption"},
1583+
},
15751584
"PreScorePlugin": {
15761585
{Name: "InterPodAffinity"},
15771586
{Name: "PodTopologySpread"},
@@ -1771,6 +1780,11 @@ func TestPluginsConfigurationCompatibility(t *testing.T) {
17711780
{Name: "PodTopologySpread"},
17721781
},
17731782
},
1783+
PostFilter: &config.PluginSet{
1784+
Disabled: []config.Plugin{
1785+
{Name: "DefaultPreemption"},
1786+
},
1787+
},
17741788
PreScore: &config.PluginSet{
17751789
Disabled: []config.Plugin{
17761790
{Name: "InterPodAffinity"},
@@ -1917,6 +1931,9 @@ func TestPluginsConfigurationCompatibility(t *testing.T) {
19171931
{Name: "NodeResourcesFit"},
19181932
{Name: "NodeUnschedulable"},
19191933
},
1934+
"PostFilterPlugin": {
1935+
{Name: "DefaultPreemption"},
1936+
},
19201937
"PreScorePlugin": {
19211938
{Name: "TaintToleration"},
19221939
{Name: "DefaultPodTopologySpread"},

pkg/scheduler/eventhandlers.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
coreinformers "k8s.io/client-go/informers/core/v1"
3131
"k8s.io/client-go/tools/cache"
3232
"k8s.io/kubernetes/pkg/features"
33-
kubefeatures "k8s.io/kubernetes/pkg/features"
3433
"k8s.io/kubernetes/pkg/scheduler/internal/queue"
3534
"k8s.io/kubernetes/pkg/scheduler/profile"
3635
)
@@ -467,11 +466,6 @@ func addAllEventHandlers(
467466
AddFunc: sched.onStorageClassAdd,
468467
},
469468
)
470-
471-
// TODO(Huang-Wei): remove this hack when defaultpreemption plugin is enabled.
472-
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.PodDisruptionBudget) {
473-
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister()
474-
}
475469
}
476470

477471
func nodeSchedulingPropertiesChange(newNode *v1.Node, oldNode *v1.Node) string {

pkg/scheduler/framework/plugins/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go_library(
1212
"//pkg/scheduler/apis/config:go_default_library",
1313
"//pkg/scheduler/framework/plugins/defaultbinder:go_default_library",
1414
"//pkg/scheduler/framework/plugins/defaultpodtopologyspread:go_default_library",
15+
"//pkg/scheduler/framework/plugins/defaultpreemption:go_default_library",
1516
"//pkg/scheduler/framework/plugins/imagelocality:go_default_library",
1617
"//pkg/scheduler/framework/plugins/interpodaffinity:go_default_library",
1718
"//pkg/scheduler/framework/plugins/nodeaffinity:go_default_library",

pkg/scheduler/framework/plugins/defaultpreemption/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ go_library(
66
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption",
77
visibility = ["//visibility:public"],
88
deps = [
9+
"//pkg/features:go_default_library",
910
"//pkg/scheduler/core:go_default_library",
1011
"//pkg/scheduler/framework/v1alpha1:go_default_library",
12+
"//pkg/scheduler/metrics:go_default_library",
1113
"//staging/src/k8s.io/api/core/v1:go_default_library",
1214
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
15+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
1316
],
1417
)
1518

pkg/scheduler/framework/plugins/defaultpreemption/default_preemption.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ package defaultpreemption
1818

1919
import (
2020
"context"
21+
"time"
2122

2223
v1 "k8s.io/api/core/v1"
2324
"k8s.io/apimachinery/pkg/runtime"
25+
utilfeature "k8s.io/apiserver/pkg/util/feature"
26+
kubefeatures "k8s.io/kubernetes/pkg/features"
2427
"k8s.io/kubernetes/pkg/scheduler/core"
2528
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
29+
"k8s.io/kubernetes/pkg/scheduler/metrics"
2630
)
2731

2832
const (
@@ -45,11 +49,22 @@ func (pl *DefaultPreemption) Name() string {
4549
// New initializes a new plugin and returns it.
4650
func New(_ runtime.Object, fh framework.FrameworkHandle) (framework.Plugin, error) {
4751
pl := DefaultPreemption{fh}
52+
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.PodDisruptionBudget) {
53+
// A hack to initialize pdbLister in sharedInformerFactory.
54+
fh.SharedInformerFactory().Policy().V1beta1().PodDisruptionBudgets().Lister()
55+
}
4856
return &pl, nil
4957
}
5058

5159
// PostFilter invoked at the postFilter extension point.
5260
func (pl *DefaultPreemption) PostFilter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, m framework.NodeToStatusMap) (*framework.PostFilterResult, *framework.Status) {
61+
preemptionStartTime := time.Now()
62+
defer func() {
63+
metrics.PreemptionAttempts.Inc()
64+
metrics.SchedulingAlgorithmPreemptionEvaluationDuration.Observe(metrics.SinceInSeconds(preemptionStartTime))
65+
metrics.DeprecatedSchedulingDuration.WithLabelValues(metrics.PreemptionEvaluation).Observe(metrics.SinceInSeconds(preemptionStartTime))
66+
}()
67+
5368
nnn, err := core.Preempt(ctx, pl.fh, state, pod, m)
5469
if err != nil {
5570
return nil, framework.NewStatus(framework.Error, err.Error())

pkg/scheduler/framework/plugins/registry.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package plugins
1919
import (
2020
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
2121
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread"
22+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption"
2223
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/imagelocality"
2324
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/interpodaffinity"
2425
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity"
@@ -71,5 +72,6 @@ func NewInTreeRegistry() runtime.Registry {
7172
serviceaffinity.Name: serviceaffinity.New,
7273
queuesort.Name: queuesort.New,
7374
defaultbinder.Name: defaultbinder.New,
75+
defaultpreemption.Name: defaultpreemption.New,
7476
}
7577
}

0 commit comments

Comments
 (0)