Skip to content

Commit 2b79d28

Browse files
authored
Merge pull request kubernetes#84066 from Huang-Wei/eps-migration
Migrate EvenPodsSpread Predicate to Filter plugin
2 parents 578d061 + 64ff958 commit 2b79d28

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
@@ -17,6 +17,7 @@ go_library(
1717
"//pkg/scheduler/framework/plugins/nodepreferavoidpods:go_default_library",
1818
"//pkg/scheduler/framework/plugins/noderesources:go_default_library",
1919
"//pkg/scheduler/framework/plugins/nodevolumelimits:go_default_library",
20+
"//pkg/scheduler/framework/plugins/podtopologyspread:go_default_library",
2021
"//pkg/scheduler/framework/plugins/tainttoleration:go_default_library",
2122
"//pkg/scheduler/framework/plugins/volumebinding:go_default_library",
2223
"//pkg/scheduler/framework/plugins/volumerestrictions:go_default_library",
@@ -49,6 +50,7 @@ filegroup(
4950
"//pkg/scheduler/framework/plugins/nodepreferavoidpods:all-srcs",
5051
"//pkg/scheduler/framework/plugins/noderesources:all-srcs",
5152
"//pkg/scheduler/framework/plugins/nodevolumelimits:all-srcs",
53+
"//pkg/scheduler/framework/plugins/podtopologyspread:all-srcs",
5254
"//pkg/scheduler/framework/plugins/tainttoleration:all-srcs",
5355
"//pkg/scheduler/framework/plugins/volumebinding:all-srcs",
5456
"//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
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodepreferavoidpods"
3232
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources"
3333
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodevolumelimits"
34+
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread"
3435
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration"
3536
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumebinding"
3637
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumerestrictions"
@@ -58,6 +59,7 @@ func NewDefaultRegistry(args *RegistryArgs) framework.Registry {
5859
nodeports.Name: nodeports.New,
5960
nodepreferavoidpods.Name: nodepreferavoidpods.New,
6061
nodeaffinity.Name: nodeaffinity.New,
62+
podtopologyspread.Name: podtopologyspread.New,
6163
volumebinding.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
6264
return volumebinding.NewFromVolumeBinder(args.VolumeBinder), nil
6365
},
@@ -94,6 +96,7 @@ func NewDefaultConfigProducerRegistry() *ConfigProducerRegistry {
9496
PredicateToConfigProducer: make(map[string]ConfigProducer),
9597
PriorityToConfigProducer: make(map[string]ConfigProducer),
9698
}
99+
// Register Predicates.
97100
registry.RegisterPredicate(predicates.GeneralPred,
98101
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
99102
// GeneralPredicate is a combination of predicates.
@@ -153,25 +156,27 @@ func NewDefaultConfigProducerRegistry() *ConfigProducerRegistry {
153156
plugins.Filter = appendToPluginSet(plugins.Filter, interpodaffinity.Name, nil)
154157
return
155158
})
156-
159+
registry.RegisterPredicate(predicates.EvenPodsSpreadPred,
160+
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
161+
plugins.Filter = appendToPluginSet(plugins.Filter, podtopologyspread.Name, nil)
162+
return
163+
})
164+
// Register Priorities.
157165
registry.RegisterPriority(priorities.TaintTolerationPriority,
158166
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
159167
plugins.Score = appendToPluginSet(plugins.Score, tainttoleration.Name, &args.Weight)
160168
return
161169
})
162-
163170
registry.RegisterPriority(priorities.NodeAffinityPriority,
164171
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
165172
plugins.Score = appendToPluginSet(plugins.Score, nodeaffinity.Name, &args.Weight)
166173
return
167174
})
168-
169175
registry.RegisterPriority(priorities.ImageLocalityPriority,
170176
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
171177
plugins.Score = appendToPluginSet(plugins.Score, imagelocality.Name, &args.Weight)
172178
return
173179
})
174-
175180
registry.RegisterPriority(priorities.NodePreferAvoidPodsPriority,
176181
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
177182
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)