feat: graduate DefaultPodTopologySpread to GA

Co-authored-by: drfish <drfish.me@gmail.com>
Signed-off-by: kerthcet <kerthcet@gmail.com>
This commit is contained in:
kerthcet 2022-02-23 19:45:27 +08:00
parent d5c26190ac
commit 4439fc3590
13 changed files with 9 additions and 193 deletions

View File

@ -39,7 +39,6 @@ import (
"k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config"
"k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults" "k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
) )
func TestSetup(t *testing.T) { func TestSetup(t *testing.T) {
@ -217,10 +216,10 @@ leaderElection:
wantLeaderElection *componentbaseconfig.LeaderElectionConfiguration wantLeaderElection *componentbaseconfig.LeaderElectionConfiguration
}{ }{
{ {
name: "default config with an alpha feature enabled and an beta feature disabled", name: "default config with an alpha feature enabled",
flags: []string{ flags: []string{
"--kubeconfig", configKubeconfig, "--kubeconfig", configKubeconfig,
"--feature-gates=VolumeCapacityPriority=true,DefaultPodTopologySpread=false", "--feature-gates=VolumeCapacityPriority=true",
}, },
wantPlugins: map[string]*config.Plugins{ wantPlugins: map[string]*config.Plugins{
"default-scheduler": func() *config.Plugins { "default-scheduler": func() *config.Plugins {
@ -235,17 +234,11 @@ leaderElection:
PreBind: defaults.ExpandedPluginsV1beta3.PreBind, PreBind: defaults.ExpandedPluginsV1beta3.PreBind,
Reserve: defaults.ExpandedPluginsV1beta3.Reserve, Reserve: defaults.ExpandedPluginsV1beta3.Reserve,
} }
plugins.PreScore.Enabled = append(plugins.PreScore.Enabled, config.Plugin{Name: names.SelectorSpread, Weight: 0})
plugins.Score.Enabled = append(
plugins.Score.Enabled,
config.Plugin{Name: names.SelectorSpread, Weight: 1},
)
return plugins return plugins
}(), }(),
}, },
restoreFeatures: map[featuregate.Feature]bool{ restoreFeatures: map[featuregate.Feature]bool{
features.VolumeCapacityPriority: false, features.VolumeCapacityPriority: false,
features.DefaultPodTopologySpread: true,
}, },
}, },
{ {

View File

@ -888,7 +888,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
DaemonSetUpdateSurge: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22 DaemonSetUpdateSurge: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22
DownwardAPIHugePages: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22 DownwardAPIHugePages: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22
AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha}, AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha},
DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.Beta}, DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.26
WinOverlay: {Default: true, PreRelease: featuregate.Beta}, WinOverlay: {Default: true, PreRelease: featuregate.Beta},
WinDSR: {Default: false, PreRelease: featuregate.Alpha}, WinDSR: {Default: false, PreRelease: featuregate.Alpha},
DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta}, DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta},

View File

@ -105,8 +105,7 @@ type PodTopologySpreadArgs struct {
// Nodes and Zones. // Nodes and Zones.
// - "List": Use constraints defined in .defaultConstraints. // - "List": Use constraints defined in .defaultConstraints.
// //
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled // Defaults to "System".
// and to "System" if enabled.
// +optional // +optional
DefaultingType PodTopologySpreadConstraintsDefaulting DefaultingType PodTopologySpreadConstraintsDefaulting
} }

View File

@ -116,16 +116,6 @@ func applyFeatureGates(config *v1beta2.Plugins) {
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) { if utilfeature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) {
config.Score.Enabled = append(config.Score.Enabled, v1beta2.Plugin{Name: names.VolumeBinding, Weight: pointer.Int32Ptr(1)}) config.Score.Enabled = append(config.Score.Enabled, v1beta2.Plugin{Name: names.VolumeBinding, Weight: pointer.Int32Ptr(1)})
} }
if !utilfeature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
// When feature is enabled, the default spreading is done by
// PodTopologySpread plugin, which is enabled by default.
klog.InfoS("Registering SelectorSpread plugin")
s := v1beta2.Plugin{Name: names.SelectorSpread}
config.PreScore.Enabled = append(config.PreScore.Enabled, s)
s.Weight = pointer.Int32Ptr(1)
config.Score.Enabled = append(config.Score.Enabled, s)
}
} }
// mergePlugins merges the custom set into the given default one, handling disabled sets. // mergePlugins merges the custom set into the given default one, handling disabled sets.

View File

@ -24,7 +24,6 @@ import (
"k8s.io/component-base/featuregate" "k8s.io/component-base/featuregate"
featuregatetesting "k8s.io/component-base/featuregate/testing" featuregatetesting "k8s.io/component-base/featuregate/testing"
"k8s.io/kube-scheduler/config/v1beta2" "k8s.io/kube-scheduler/config/v1beta2"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
"k8s.io/utils/pointer" "k8s.io/utils/pointer"
) )
@ -114,90 +113,6 @@ func TestApplyFeatureGates(t *testing.T) {
}, },
}, },
}, },
{
name: "DefaultPodTopologySpread disabled",
features: map[featuregate.Feature]bool{
features.DefaultPodTopologySpread: false,
},
wantConfig: &v1beta2.Plugins{
QueueSort: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.PrioritySort},
},
},
PreFilter: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.NodeResourcesFit},
{Name: names.NodePorts},
{Name: names.VolumeRestrictions},
{Name: names.PodTopologySpread},
{Name: names.InterPodAffinity},
{Name: names.VolumeBinding},
{Name: names.NodeAffinity},
},
},
Filter: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.NodeUnschedulable},
{Name: names.NodeName},
{Name: names.TaintToleration},
{Name: names.NodeAffinity},
{Name: names.NodePorts},
{Name: names.NodeResourcesFit},
{Name: names.VolumeRestrictions},
{Name: names.EBSLimits},
{Name: names.GCEPDLimits},
{Name: names.NodeVolumeLimits},
{Name: names.AzureDiskLimits},
{Name: names.VolumeBinding},
{Name: names.VolumeZone},
{Name: names.PodTopologySpread},
{Name: names.InterPodAffinity},
},
},
PostFilter: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.DefaultPreemption},
},
},
PreScore: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.InterPodAffinity},
{Name: names.PodTopologySpread},
{Name: names.TaintToleration},
{Name: names.NodeAffinity},
{Name: names.SelectorSpread},
},
},
Score: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)},
{Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)},
{Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)},
{Name: names.NodeResourcesFit, Weight: pointer.Int32Ptr(1)},
{Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)},
{Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)},
{Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)},
{Name: names.SelectorSpread, Weight: pointer.Int32Ptr(1)},
},
},
Reserve: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.VolumeBinding},
},
},
PreBind: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.VolumeBinding},
},
},
Bind: v1beta2.PluginSet{
Enabled: []v1beta2.Plugin{
{Name: names.DefaultBinder},
},
},
},
},
} }
for _, test := range tests { for _, test := range tests {

View File

@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta2.NodeResourcesB
} }
func SetDefaults_PodTopologySpreadArgs(obj *v1beta2.PodTopologySpreadArgs) { func SetDefaults_PodTopologySpreadArgs(obj *v1beta2.PodTopologySpreadArgs) {
if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
if obj.DefaultingType == "" {
obj.DefaultingType = v1beta2.SystemDefaulting
}
return
}
if obj.DefaultingType == "" { if obj.DefaultingType == "" {
obj.DefaultingType = v1beta2.ListDefaulting obj.DefaultingType = v1beta2.SystemDefaulting
} }
} }

View File

@ -586,16 +586,6 @@ func TestPluginArgsDefaults(t *testing.T) {
DefaultingType: v1beta2.SystemDefaulting, DefaultingType: v1beta2.SystemDefaulting,
}, },
}, },
{
name: "PodTopologySpreadArgs empty, DefaultPodTopologySpread feature disabled",
features: map[featuregate.Feature]bool{
features.DefaultPodTopologySpread: false,
},
in: &v1beta2.PodTopologySpreadArgs{},
want: &v1beta2.PodTopologySpreadArgs{
DefaultingType: v1beta2.ListDefaulting,
},
},
{ {
name: "NodeResourcesFitArgs not set", name: "NodeResourcesFitArgs not set",
in: &v1beta2.NodeResourcesFitArgs{}, in: &v1beta2.NodeResourcesFitArgs{},

View File

@ -18,10 +18,8 @@ package v1beta3
import ( import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kube-scheduler/config/v1beta3" "k8s.io/kube-scheduler/config/v1beta3"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
"k8s.io/utils/pointer" "k8s.io/utils/pointer"
) )
@ -54,21 +52,10 @@ func getDefaultPlugins() *v1beta3.Plugins {
}, },
}, },
} }
applyFeatureGates(plugins)
return plugins return plugins
} }
func applyFeatureGates(config *v1beta3.Plugins) {
if !utilfeature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
// When feature is enabled, the default spreading is done by
// PodTopologySpread plugin, which is enabled by default.
klog.InfoS("Registering SelectorSpread plugin")
s := v1beta3.Plugin{Name: names.SelectorSpread, Weight: pointer.Int32Ptr(1)}
config.MultiPoint.Enabled = append(config.MultiPoint.Enabled, s)
}
}
// mergePlugins merges the custom set into the given default one, handling disabled sets. // mergePlugins merges the custom set into the given default one, handling disabled sets.
func mergePlugins(defaultPlugins, customPlugins *v1beta3.Plugins) *v1beta3.Plugins { func mergePlugins(defaultPlugins, customPlugins *v1beta3.Plugins) *v1beta3.Plugins {
if customPlugins == nil { if customPlugins == nil {

View File

@ -24,7 +24,6 @@ import (
"k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/feature"
"k8s.io/component-base/featuregate" "k8s.io/component-base/featuregate"
featuregatetesting "k8s.io/component-base/featuregate/testing" featuregatetesting "k8s.io/component-base/featuregate/testing"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
"k8s.io/utils/pointer" "k8s.io/utils/pointer"
) )
@ -64,39 +63,6 @@ func TestApplyFeatureGates(t *testing.T) {
}, },
}, },
}, },
{
name: "DefaultPodTopologySpread disabled",
features: map[featuregate.Feature]bool{
features.DefaultPodTopologySpread: false,
},
wantConfig: &v1beta3.Plugins{
MultiPoint: v1beta3.PluginSet{
Enabled: []v1beta3.Plugin{
{Name: names.PrioritySort},
{Name: names.NodeUnschedulable},
{Name: names.NodeName},
{Name: names.TaintToleration, Weight: pointer.Int32(3)},
{Name: names.NodeAffinity, Weight: pointer.Int32(2)},
{Name: names.NodePorts},
{Name: names.NodeResourcesFit, Weight: pointer.Int32(1)},
{Name: names.VolumeRestrictions},
{Name: names.EBSLimits},
{Name: names.GCEPDLimits},
{Name: names.NodeVolumeLimits},
{Name: names.AzureDiskLimits},
{Name: names.VolumeBinding},
{Name: names.VolumeZone},
{Name: names.PodTopologySpread, Weight: pointer.Int32(2)},
{Name: names.InterPodAffinity, Weight: pointer.Int32(2)},
{Name: names.DefaultPreemption},
{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32(1)},
{Name: names.ImageLocality, Weight: pointer.Int32(1)},
{Name: names.DefaultBinder},
{Name: names.SelectorSpread, Weight: pointer.Int32(1)},
},
},
},
},
} }
for _, test := range tests { for _, test := range tests {

View File

@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta3.NodeResourcesB
} }
func SetDefaults_PodTopologySpreadArgs(obj *v1beta3.PodTopologySpreadArgs) { func SetDefaults_PodTopologySpreadArgs(obj *v1beta3.PodTopologySpreadArgs) {
if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
if obj.DefaultingType == "" {
obj.DefaultingType = v1beta3.SystemDefaulting
}
return
}
if obj.DefaultingType == "" { if obj.DefaultingType == "" {
obj.DefaultingType = v1beta3.ListDefaulting obj.DefaultingType = v1beta3.SystemDefaulting
} }
} }

View File

@ -581,16 +581,6 @@ func TestPluginArgsDefaults(t *testing.T) {
DefaultingType: v1beta3.SystemDefaulting, DefaultingType: v1beta3.SystemDefaulting,
}, },
}, },
{
name: "PodTopologySpreadArgs empty, DefaultPodTopologySpread feature disabled",
features: map[featuregate.Feature]bool{
features.DefaultPodTopologySpread: false,
},
in: &v1beta3.PodTopologySpreadArgs{},
want: &v1beta3.PodTopologySpreadArgs{
DefaultingType: v1beta3.ListDefaulting,
},
},
{ {
name: "NodeResourcesFitArgs not set", name: "NodeResourcesFitArgs not set",
in: &v1beta3.NodeResourcesFitArgs{}, in: &v1beta3.NodeResourcesFitArgs{},

View File

@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct {
// Nodes and Zones. // Nodes and Zones.
// - "List": Use constraints defined in .defaultConstraints. // - "List": Use constraints defined in .defaultConstraints.
// //
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled // Defaults to "System".
// and to "System" if enabled.
// +optional // +optional
DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"` DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"`
} }

View File

@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct {
// Nodes and Zones. // Nodes and Zones.
// - "List": Use constraints defined in .defaultConstraints. // - "List": Use constraints defined in .defaultConstraints.
// //
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled // Defaults to "System".
// and to "System" if enabled.
// +optional // +optional
DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"` DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"`
} }