mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 10:51:29 +00:00
Merge pull request #108278 from kerthcet/feature/graduate-defaultPodTopologySpread-to-ga
graduate default pod topology spread to ga
This commit is contained in:
commit
bf7b9119f0
@ -39,7 +39,6 @@ import (
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"k8s.io/kubernetes/pkg/scheduler/apis/config"
|
||||
"k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
|
||||
)
|
||||
|
||||
func TestSetup(t *testing.T) {
|
||||
@ -217,10 +216,10 @@ leaderElection:
|
||||
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{
|
||||
"--kubeconfig", configKubeconfig,
|
||||
"--feature-gates=VolumeCapacityPriority=true,DefaultPodTopologySpread=false",
|
||||
"--feature-gates=VolumeCapacityPriority=true",
|
||||
},
|
||||
wantPlugins: map[string]*config.Plugins{
|
||||
"default-scheduler": func() *config.Plugins {
|
||||
@ -235,17 +234,11 @@ leaderElection:
|
||||
PreBind: defaults.ExpandedPluginsV1beta3.PreBind,
|
||||
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
|
||||
}(),
|
||||
},
|
||||
restoreFeatures: map[featuregate.Feature]bool{
|
||||
features.VolumeCapacityPriority: false,
|
||||
features.DefaultPodTopologySpread: true,
|
||||
features.VolumeCapacityPriority: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -888,7 +888,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
||||
DaemonSetUpdateSurge: {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},
|
||||
DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.Beta},
|
||||
DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.26
|
||||
WinOverlay: {Default: true, PreRelease: featuregate.Beta},
|
||||
WinDSR: {Default: false, PreRelease: featuregate.Alpha},
|
||||
DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta},
|
||||
|
@ -105,8 +105,7 @@ type PodTopologySpreadArgs struct {
|
||||
// Nodes and Zones.
|
||||
// - "List": Use constraints defined in .defaultConstraints.
|
||||
//
|
||||
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled
|
||||
// and to "System" if enabled.
|
||||
// Defaults to "System".
|
||||
// +optional
|
||||
DefaultingType PodTopologySpreadConstraintsDefaulting
|
||||
}
|
||||
|
@ -116,16 +116,6 @@ func applyFeatureGates(config *v1beta2.Plugins) {
|
||||
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) {
|
||||
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.
|
||||
|
@ -24,7 +24,6 @@ import (
|
||||
"k8s.io/component-base/featuregate"
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
"k8s.io/kube-scheduler/config/v1beta2"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
|
||||
"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 {
|
||||
|
@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta2.NodeResourcesB
|
||||
}
|
||||
|
||||
func SetDefaults_PodTopologySpreadArgs(obj *v1beta2.PodTopologySpreadArgs) {
|
||||
if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
|
||||
if obj.DefaultingType == "" {
|
||||
obj.DefaultingType = v1beta2.SystemDefaulting
|
||||
}
|
||||
return
|
||||
}
|
||||
if obj.DefaultingType == "" {
|
||||
obj.DefaultingType = v1beta2.ListDefaulting
|
||||
obj.DefaultingType = v1beta2.SystemDefaulting
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -586,16 +586,6 @@ func TestPluginArgsDefaults(t *testing.T) {
|
||||
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",
|
||||
in: &v1beta2.NodeResourcesFitArgs{},
|
||||
|
@ -18,10 +18,8 @@ package v1beta3
|
||||
|
||||
import (
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kube-scheduler/config/v1beta3"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
|
||||
"k8s.io/utils/pointer"
|
||||
)
|
||||
@ -54,21 +52,10 @@ func getDefaultPlugins() *v1beta3.Plugins {
|
||||
},
|
||||
},
|
||||
}
|
||||
applyFeatureGates(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.
|
||||
func mergePlugins(defaultPlugins, customPlugins *v1beta3.Plugins) *v1beta3.Plugins {
|
||||
if customPlugins == nil {
|
||||
|
@ -24,7 +24,6 @@ import (
|
||||
"k8s.io/apiserver/pkg/util/feature"
|
||||
"k8s.io/component-base/featuregate"
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
|
||||
"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 {
|
||||
|
@ -227,14 +227,8 @@ func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta3.NodeResourcesB
|
||||
}
|
||||
|
||||
func SetDefaults_PodTopologySpreadArgs(obj *v1beta3.PodTopologySpreadArgs) {
|
||||
if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
|
||||
if obj.DefaultingType == "" {
|
||||
obj.DefaultingType = v1beta3.SystemDefaulting
|
||||
}
|
||||
return
|
||||
}
|
||||
if obj.DefaultingType == "" {
|
||||
obj.DefaultingType = v1beta3.ListDefaulting
|
||||
obj.DefaultingType = v1beta3.SystemDefaulting
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -581,16 +581,6 @@ func TestPluginArgsDefaults(t *testing.T) {
|
||||
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",
|
||||
in: &v1beta3.NodeResourcesFitArgs{},
|
||||
|
@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct {
|
||||
// Nodes and Zones.
|
||||
// - "List": Use constraints defined in .defaultConstraints.
|
||||
//
|
||||
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled
|
||||
// and to "System" if enabled.
|
||||
// Defaults to "System".
|
||||
// +optional
|
||||
DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"`
|
||||
}
|
||||
|
@ -110,8 +110,7 @@ type PodTopologySpreadArgs struct {
|
||||
// Nodes and Zones.
|
||||
// - "List": Use constraints defined in .defaultConstraints.
|
||||
//
|
||||
// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled
|
||||
// and to "System" if enabled.
|
||||
// Defaults to "System".
|
||||
// +optional
|
||||
DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"`
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user