Skip to content

Commit 133dde6

Browse files
committed
Remove EvenPodsSpread featuregate and related logic
1 parent 3995c1a commit 133dde6

File tree

19 files changed

+65
-104
lines changed

19 files changed

+65
-104
lines changed

api/openapi-spec/swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kube-scheduler/app/server_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ profiles:
154154
"PreFilterPlugin": {
155155
{Name: "NodeResourcesFit"},
156156
{Name: "NodePorts"},
157-
{Name: "InterPodAffinity"},
158157
{Name: "PodTopologySpread"},
158+
{Name: "InterPodAffinity"},
159159
},
160160
"FilterPlugin": {
161161
{Name: "NodeUnschedulable"},
@@ -171,14 +171,14 @@ profiles:
171171
{Name: "AzureDiskLimits"},
172172
{Name: "VolumeBinding"},
173173
{Name: "VolumeZone"},
174-
{Name: "InterPodAffinity"},
175174
{Name: "PodTopologySpread"},
175+
{Name: "InterPodAffinity"},
176176
},
177177
"PreScorePlugin": {
178178
{Name: "InterPodAffinity"},
179+
{Name: "PodTopologySpread"},
179180
{Name: "DefaultPodTopologySpread"},
180181
{Name: "TaintToleration"},
181-
{Name: "PodTopologySpread"},
182182
},
183183
"ScorePlugin": {
184184
{Name: "NodeResourcesBalancedAllocation", Weight: 1},
@@ -187,9 +187,9 @@ profiles:
187187
{Name: "NodeResourcesLeastAllocated", Weight: 1},
188188
{Name: "NodeAffinity", Weight: 1},
189189
{Name: "NodePreferAvoidPods", Weight: 10000},
190+
{Name: "PodTopologySpread", Weight: 2},
190191
{Name: "DefaultPodTopologySpread", Weight: 1},
191192
{Name: "TaintToleration", Weight: 1},
192-
{Name: "PodTopologySpread", Weight: 2},
193193
},
194194
"BindPlugin": {{Name: "DefaultBinder"}},
195195
"ReservePlugin": {{Name: "VolumeBinding"}},
@@ -285,8 +285,8 @@ profiles:
285285
"PreFilterPlugin": {
286286
{Name: "NodeResourcesFit"},
287287
{Name: "NodePorts"},
288-
{Name: "InterPodAffinity"},
289288
{Name: "PodTopologySpread"},
289+
{Name: "InterPodAffinity"},
290290
},
291291
"FilterPlugin": {
292292
{Name: "NodeUnschedulable"},
@@ -302,14 +302,14 @@ profiles:
302302
{Name: "AzureDiskLimits"},
303303
{Name: "VolumeBinding"},
304304
{Name: "VolumeZone"},
305-
{Name: "InterPodAffinity"},
306305
{Name: "PodTopologySpread"},
306+
{Name: "InterPodAffinity"},
307307
},
308308
"PreScorePlugin": {
309309
{Name: "InterPodAffinity"},
310+
{Name: "PodTopologySpread"},
310311
{Name: "DefaultPodTopologySpread"},
311312
{Name: "TaintToleration"},
312-
{Name: "PodTopologySpread"},
313313
},
314314
"ScorePlugin": {
315315
{Name: "NodeResourcesBalancedAllocation", Weight: 1},
@@ -318,9 +318,9 @@ profiles:
318318
{Name: "NodeResourcesMostAllocated", Weight: 1},
319319
{Name: "NodeAffinity", Weight: 1},
320320
{Name: "NodePreferAvoidPods", Weight: 10000},
321+
{Name: "PodTopologySpread", Weight: 2},
321322
{Name: "DefaultPodTopologySpread", Weight: 1},
322323
{Name: "TaintToleration", Weight: 1},
323-
{Name: "PodTopologySpread", Weight: 2},
324324
},
325325
"BindPlugin": {{Name: "DefaultBinder"}},
326326
"ReservePlugin": {{Name: "VolumeBinding"}},

pkg/api/pod/util.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -438,11 +438,6 @@ func dropDisabledFields(
438438
// does not specify any values for these fields.
439439
podSpec.PreemptionPolicy = nil
440440
}
441-
442-
if !utilfeature.DefaultFeatureGate.Enabled(features.EvenPodsSpread) && !topologySpreadConstraintsInUse(oldPodSpec) {
443-
// Set TopologySpreadConstraints to nil only if feature is disabled and it is not used
444-
podSpec.TopologySpreadConstraints = nil
445-
}
446441
}
447442

448443
// dropDisabledRunAsGroupField removes disabled fields from PodSpec related
@@ -558,14 +553,6 @@ func overheadInUse(podSpec *api.PodSpec) bool {
558553
return false
559554
}
560555

561-
// topologySpreadConstraintsInUse returns true if the pod spec is non-nil and has a TopologySpreadConstraints slice
562-
func topologySpreadConstraintsInUse(podSpec *api.PodSpec) bool {
563-
if podSpec == nil {
564-
return false
565-
}
566-
return len(podSpec.TopologySpreadConstraints) > 0
567-
}
568-
569556
// procMountInUse returns true if the pod spec is non-nil and has a SecurityContext's ProcMount field set to a non-default value
570557
func procMountInUse(podSpec *api.PodSpec) bool {
571558
if podSpec == nil {

pkg/apis/core/types.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2764,7 +2764,6 @@ type PodSpec struct {
27642764
EnableServiceLinks *bool
27652765
// TopologySpreadConstraints describes how a group of pods ought to spread across topology
27662766
// domains. Scheduler will schedule pods in a way which abides by the constraints.
2767-
// This field is only honored by clusters that enable the EvenPodsSpread feature.
27682767
// All topologySpreadConstraints are ANDed.
27692768
// +optional
27702769
TopologySpreadConstraints []TopologySpreadConstraint

pkg/apis/core/validation/validation_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14866,7 +14866,6 @@ func TestAlphaVolumePVCDataSource(t *testing.T) {
1486614866
}
1486714867

1486814868
func TestValidateTopologySpreadConstraints(t *testing.T) {
14869-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, true)()
1487014869
testCases := []struct {
1487114870
name string
1487214871
constraints []core.TopologySpreadConstraint

pkg/features/kube_features.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,9 @@ const (
504504
EndpointSliceProxying featuregate.Feature = "EndpointSliceProxying"
505505

506506
// owner: @Huang-Wei
507+
// alpha: v1.16
507508
// beta: v1.18
509+
// GA: v1.19
508510
//
509511
// Schedule pods evenly across available topology domains.
510512
EvenPodsSpread featuregate.Feature = "EvenPodsSpread"
@@ -653,7 +655,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
653655
IPv6DualStack: {Default: false, PreRelease: featuregate.Alpha},
654656
EndpointSlice: {Default: true, PreRelease: featuregate.Beta},
655657
EndpointSliceProxying: {Default: false, PreRelease: featuregate.Alpha},
656-
EvenPodsSpread: {Default: true, PreRelease: featuregate.Beta},
658+
EvenPodsSpread: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21
657659
StartupProbe: {Default: true, PreRelease: featuregate.Beta},
658660
AllowInsecureBackendProxy: {Default: true, PreRelease: featuregate.Beta},
659661
PodDisruptionBudget: {Default: true, PreRelease: featuregate.Beta},

pkg/scheduler/algorithmprovider/registry.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func getDefaultConfig() *schedulerapi.Plugins {
8585
Enabled: []schedulerapi.Plugin{
8686
{Name: noderesources.FitName},
8787
{Name: nodeports.Name},
88+
{Name: podtopologyspread.Name},
8889
{Name: interpodaffinity.Name},
8990
},
9091
},
@@ -103,12 +104,14 @@ func getDefaultConfig() *schedulerapi.Plugins {
103104
{Name: nodevolumelimits.AzureDiskName},
104105
{Name: volumebinding.Name},
105106
{Name: volumezone.Name},
107+
{Name: podtopologyspread.Name},
106108
{Name: interpodaffinity.Name},
107109
},
108110
},
109111
PreScore: &schedulerapi.PluginSet{
110112
Enabled: []schedulerapi.Plugin{
111113
{Name: interpodaffinity.Name},
114+
{Name: podtopologyspread.Name},
112115
{Name: defaultpodtopologyspread.Name},
113116
{Name: tainttoleration.Name},
114117
},
@@ -121,6 +124,10 @@ func getDefaultConfig() *schedulerapi.Plugins {
121124
{Name: noderesources.LeastAllocatedName, Weight: 1},
122125
{Name: nodeaffinity.Name, Weight: 1},
123126
{Name: nodepreferavoidpods.Name, Weight: 10000},
127+
// Weight is doubled because:
128+
// - This is a score coming from user preference.
129+
// - It makes its signal comparable to NodeResourcesLeastAllocated.
130+
{Name: podtopologyspread.Name, Weight: 2},
124131
{Name: defaultpodtopologyspread.Name, Weight: 1},
125132
{Name: tainttoleration.Name, Weight: 1},
126133
},
@@ -165,20 +172,6 @@ func getClusterAutoscalerConfig() *schedulerapi.Plugins {
165172
}
166173

167174
func applyFeatureGates(config *schedulerapi.Plugins) {
168-
// Only add EvenPodsSpread if the feature is enabled.
169-
if utilfeature.DefaultFeatureGate.Enabled(features.EvenPodsSpread) {
170-
klog.Infof("Registering EvenPodsSpread predicate and priority function")
171-
f := schedulerapi.Plugin{Name: podtopologyspread.Name}
172-
config.PreFilter.Enabled = append(config.PreFilter.Enabled, f)
173-
config.Filter.Enabled = append(config.Filter.Enabled, f)
174-
config.PreScore.Enabled = append(config.PreScore.Enabled, f)
175-
// Weight is doubled because:
176-
// - This is a score coming from user preference.
177-
// - It makes its signal comparable to NodeResourcesLeastAllocated.
178-
s := schedulerapi.Plugin{Name: podtopologyspread.Name, Weight: 2}
179-
config.Score.Enabled = append(config.Score.Enabled, s)
180-
}
181-
182175
// Prioritizes nodes that satisfy pod's resource limits
183176
if utilfeature.DefaultFeatureGate.Enabled(features.ResourceLimitsPriorityFunction) {
184177
klog.Infof("Registering resourcelimits priority function")

pkg/scheduler/algorithmprovider/registry_test.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ func TestClusterAutoscalerProvider(t *testing.T) {
5555
Enabled: []schedulerapi.Plugin{
5656
{Name: noderesources.FitName},
5757
{Name: nodeports.Name},
58-
{Name: interpodaffinity.Name},
5958
{Name: podtopologyspread.Name},
59+
{Name: interpodaffinity.Name},
6060
},
6161
},
6262
Filter: &schedulerapi.PluginSet{
@@ -74,16 +74,16 @@ func TestClusterAutoscalerProvider(t *testing.T) {
7474
{Name: nodevolumelimits.AzureDiskName},
7575
{Name: volumebinding.Name},
7676
{Name: volumezone.Name},
77-
{Name: interpodaffinity.Name},
7877
{Name: podtopologyspread.Name},
78+
{Name: interpodaffinity.Name},
7979
},
8080
},
8181
PreScore: &schedulerapi.PluginSet{
8282
Enabled: []schedulerapi.Plugin{
8383
{Name: interpodaffinity.Name},
84+
{Name: podtopologyspread.Name},
8485
{Name: defaultpodtopologyspread.Name},
8586
{Name: tainttoleration.Name},
86-
{Name: podtopologyspread.Name},
8787
},
8888
},
8989
Score: &schedulerapi.PluginSet{
@@ -94,9 +94,9 @@ func TestClusterAutoscalerProvider(t *testing.T) {
9494
{Name: noderesources.MostAllocatedName, Weight: 1},
9595
{Name: nodeaffinity.Name, Weight: 1},
9696
{Name: nodepreferavoidpods.Name, Weight: 10000},
97+
{Name: podtopologyspread.Name, Weight: 2},
9798
{Name: defaultpodtopologyspread.Name, Weight: 1},
9899
{Name: tainttoleration.Name, Weight: 1},
99-
{Name: podtopologyspread.Name, Weight: 2},
100100
},
101101
},
102102
Reserve: &schedulerapi.PluginSet{
@@ -152,6 +152,7 @@ func TestApplyFeatureGates(t *testing.T) {
152152
Enabled: []schedulerapi.Plugin{
153153
{Name: noderesources.FitName},
154154
{Name: nodeports.Name},
155+
{Name: podtopologyspread.Name},
155156
{Name: interpodaffinity.Name},
156157
},
157158
},
@@ -170,12 +171,14 @@ func TestApplyFeatureGates(t *testing.T) {
170171
{Name: nodevolumelimits.AzureDiskName},
171172
{Name: volumebinding.Name},
172173
{Name: volumezone.Name},
174+
{Name: podtopologyspread.Name},
173175
{Name: interpodaffinity.Name},
174176
},
175177
},
176178
PreScore: &schedulerapi.PluginSet{
177179
Enabled: []schedulerapi.Plugin{
178180
{Name: interpodaffinity.Name},
181+
{Name: podtopologyspread.Name},
179182
{Name: defaultpodtopologyspread.Name},
180183
{Name: tainttoleration.Name},
181184
},
@@ -188,6 +191,7 @@ func TestApplyFeatureGates(t *testing.T) {
188191
{Name: noderesources.LeastAllocatedName, Weight: 1},
189192
{Name: nodeaffinity.Name, Weight: 1},
190193
{Name: nodepreferavoidpods.Name, Weight: 10000},
194+
{Name: podtopologyspread.Name, Weight: 2},
191195
{Name: defaultpodtopologyspread.Name, Weight: 1},
192196
{Name: tainttoleration.Name, Weight: 1},
193197
},
@@ -232,8 +236,8 @@ func TestApplyFeatureGates(t *testing.T) {
232236
Enabled: []schedulerapi.Plugin{
233237
{Name: noderesources.FitName},
234238
{Name: nodeports.Name},
235-
{Name: interpodaffinity.Name},
236239
{Name: podtopologyspread.Name},
240+
{Name: interpodaffinity.Name},
237241
},
238242
},
239243
Filter: &schedulerapi.PluginSet{
@@ -251,16 +255,16 @@ func TestApplyFeatureGates(t *testing.T) {
251255
{Name: nodevolumelimits.AzureDiskName},
252256
{Name: volumebinding.Name},
253257
{Name: volumezone.Name},
254-
{Name: interpodaffinity.Name},
255258
{Name: podtopologyspread.Name},
259+
{Name: interpodaffinity.Name},
256260
},
257261
},
258262
PreScore: &schedulerapi.PluginSet{
259263
Enabled: []schedulerapi.Plugin{
260264
{Name: interpodaffinity.Name},
265+
{Name: podtopologyspread.Name},
261266
{Name: defaultpodtopologyspread.Name},
262267
{Name: tainttoleration.Name},
263-
{Name: podtopologyspread.Name},
264268
{Name: noderesources.ResourceLimitsName},
265269
},
266270
},
@@ -272,9 +276,9 @@ func TestApplyFeatureGates(t *testing.T) {
272276
{Name: noderesources.LeastAllocatedName, Weight: 1},
273277
{Name: nodeaffinity.Name, Weight: 1},
274278
{Name: nodepreferavoidpods.Name, Weight: 10000},
279+
{Name: podtopologyspread.Name, Weight: 2},
275280
{Name: defaultpodtopologyspread.Name, Weight: 1},
276281
{Name: tainttoleration.Name, Weight: 1},
277-
{Name: podtopologyspread.Name, Weight: 2},
278282
{Name: noderesources.ResourceLimitsName, Weight: 1},
279283
},
280284
},
@@ -310,7 +314,6 @@ func TestApplyFeatureGates(t *testing.T) {
310314
for _, test := range tests {
311315
t.Run(test.name, func(t *testing.T) {
312316
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ResourceLimitsPriorityFunction, test.featuresEnabled)()
313-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, test.featuresEnabled)()
314317

315318
r := NewRegistry()
316319
gotConfig := r[schedulerapi.SchedulerDefaultProviderName]

0 commit comments

Comments
 (0)