Skip to content

Commit 64ff958

Browse files
committed
migrate EvenPodsSpread Predicate to Filter plugin
1 parent de9a7d8 commit 64ff958

File tree

5 files changed

+591
-4
lines changed

5 files changed

+591
-4
lines changed

pkg/scheduler/framework/plugins/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ go_library(
1818
"//pkg/scheduler/framework/plugins/nodepreferavoidpods:go_default_library",
1919
"//pkg/scheduler/framework/plugins/noderesources:go_default_library",
2020
"//pkg/scheduler/framework/plugins/nodevolumelimits:go_default_library",
21+
"//pkg/scheduler/framework/plugins/podtopologyspread:go_default_library",
2122
"//pkg/scheduler/framework/plugins/tainttoleration:go_default_library",
2223
"//pkg/scheduler/framework/plugins/volumebinding:go_default_library",
2324
"//pkg/scheduler/framework/plugins/volumerestrictions:go_default_library",
@@ -52,6 +53,7 @@ filegroup(
5253
"//pkg/scheduler/framework/plugins/nodepreferavoidpods:all-srcs",
5354
"//pkg/scheduler/framework/plugins/noderesources:all-srcs",
5455
"//pkg/scheduler/framework/plugins/nodevolumelimits:all-srcs",
56+
"//pkg/scheduler/framework/plugins/podtopologyspread:all-srcs",
5557
"//pkg/scheduler/framework/plugins/tainttoleration:all-srcs",
5658
"//pkg/scheduler/framework/plugins/volumebinding:all-srcs",
5759
"//pkg/scheduler/framework/plugins/volumerestrictions:all-srcs",

pkg/scheduler/framework/plugins/default_registry.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodepreferavoidpods"
3535
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources"
3636
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodevolumelimits"
37+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread"
3738
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration"
3839
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumebinding"
3940
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumerestrictions"
@@ -73,6 +74,7 @@ func NewDefaultRegistry(args *RegistryArgs) framework.Registry {
7374
nodeports.Name: nodeports.New,
7475
nodepreferavoidpods.Name: nodepreferavoidpods.New,
7576
nodeaffinity.Name: nodeaffinity.New,
77+
podtopologyspread.Name: podtopologyspread.New,
7678
volumebinding.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
7779
return volumebinding.NewFromVolumeBinder(args.VolumeBinder), nil
7880
},
@@ -113,6 +115,7 @@ func NewDefaultConfigProducerRegistry() *ConfigProducerRegistry {
113115
PredicateToConfigProducer: make(map[string]ConfigProducer),
114116
PriorityToConfigProducer: make(map[string]ConfigProducer),
115117
}
118+
// Register Predicates.
116119
registry.RegisterPredicate(predicates.GeneralPred,
117120
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
118121
// GeneralPredicate is a combination of predicates.
@@ -172,25 +175,27 @@ func NewDefaultConfigProducerRegistry() *ConfigProducerRegistry {
172175
plugins.Filter = appendToPluginSet(plugins.Filter, interpodaffinity.Name, nil)
173176
return
174177
})
175-
178+
registry.RegisterPredicate(predicates.EvenPodsSpreadPred,
179+
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
180+
plugins.Filter = appendToPluginSet(plugins.Filter, podtopologyspread.Name, nil)
181+
return
182+
})
183+
// Register Priorities.
176184
registry.RegisterPriority(priorities.TaintTolerationPriority,
177185
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
178186
plugins.Score = appendToPluginSet(plugins.Score, tainttoleration.Name, &args.Weight)
179187
return
180188
})
181-
182189
registry.RegisterPriority(priorities.NodeAffinityPriority,
183190
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
184191
plugins.Score = appendToPluginSet(plugins.Score, nodeaffinity.Name, &args.Weight)
185192
return
186193
})
187-
188194
registry.RegisterPriority(priorities.ImageLocalityPriority,
189195
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
190196
plugins.Score = appendToPluginSet(plugins.Score, imagelocality.Name, &args.Weight)
191197
return
192198
})
193-
194199
registry.RegisterPriority(priorities.NodePreferAvoidPodsPriority,
195200
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
196201
plugins.Score = appendToPluginSet(plugins.Score, nodepreferavoidpods.Name, &args.Weight)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
2+
3+
go_library(
4+
name = "go_default_library",
5+
srcs = ["pod_topology_spread.go"],
6+
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread",
7+
visibility = ["//visibility:public"],
8+
deps = [
9+
"//pkg/scheduler/algorithm/predicates:go_default_library",
10+
"//pkg/scheduler/framework/plugins/migration:go_default_library",
11+
"//pkg/scheduler/framework/v1alpha1:go_default_library",
12+
"//pkg/scheduler/nodeinfo:go_default_library",
13+
"//staging/src/k8s.io/api/core/v1:go_default_library",
14+
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
15+
],
16+
)
17+
18+
go_test(
19+
name = "go_default_test",
20+
srcs = ["pod_topology_spread_test.go"],
21+
embed = [":go_default_library"],
22+
deps = [
23+
"//pkg/scheduler/algorithm/predicates:go_default_library",
24+
"//pkg/scheduler/framework/plugins/migration:go_default_library",
25+
"//pkg/scheduler/framework/v1alpha1:go_default_library",
26+
"//pkg/scheduler/nodeinfo:go_default_library",
27+
"//pkg/scheduler/testing:go_default_library",
28+
"//staging/src/k8s.io/api/core/v1:go_default_library",
29+
],
30+
)
31+
32+
filegroup(
33+
name = "package-srcs",
34+
srcs = glob(["**"]),
35+
tags = ["automanaged"],
36+
visibility = ["//visibility:private"],
37+
)
38+
39+
filegroup(
40+
name = "all-srcs",
41+
srcs = [":package-srcs"],
42+
tags = ["automanaged"],
43+
visibility = ["//visibility:public"],
44+
)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package podtopologyspread
18+
19+
import (
20+
"context"
21+
"fmt"
22+
23+
"k8s.io/api/core/v1"
24+
"k8s.io/apimachinery/pkg/runtime"
25+
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
26+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
27+
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
28+
"k8s.io/kubernetes/pkg/scheduler/nodeinfo"
29+
)
30+
31+
// PodTopologySpread is a plugin that ensures pod's topologySpreadConstraints is satisfied.
32+
type PodTopologySpread struct{}
33+
34+
var _ framework.FilterPlugin = &PodTopologySpread{}
35+
36+
// Name is the name of the plugin used in the plugin registry and configurations.
37+
const Name = "PodTopologySpread"
38+
39+
// Name returns name of the plugin. It is used in logs, etc.
40+
func (pl *PodTopologySpread) Name() string {
41+
return Name
42+
}
43+
44+
// Filter invoked at the filter extension point.
45+
func (pl *PodTopologySpread) Filter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeInfo *nodeinfo.NodeInfo) *framework.Status {
46+
meta, ok := migration.PredicateMetadata(cycleState).(predicates.PredicateMetadata)
47+
if !ok {
48+
return migration.ErrorToFrameworkStatus(fmt.Errorf("%+v convert to predicates.PredicateMetadata error", cycleState))
49+
}
50+
_, reasons, err := predicates.EvenPodsSpreadPredicate(pod, meta, nodeInfo)
51+
return migration.PredicateResultToFrameworkStatus(reasons, err)
52+
}
53+
54+
// New initializes a new plugin and returns it.
55+
func New(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
56+
return &PodTopologySpread{}, nil
57+
}

0 commit comments

Comments
 (0)