1
0
mirror of https://github.com/kubernetes-sigs/descheduler.git synced 2026-01-26 05:14:13 +01:00

Drop Evict extension point

The Evict extension point is not currently in use.
All DefaultEvictor plugin functionality is exposed through Filter and
PreEvictionFilter extension points instead.
Thus, no need to limit the number of evictors enabled.
This commit is contained in:
Jan Chaloupka
2023-04-16 11:05:59 +02:00
parent e8c099c6d3
commit 76e7e4f57b
9 changed files with 230 additions and 66 deletions

View File

@@ -73,7 +73,6 @@ type Plugins struct {
Sort PluginSet
Deschedule PluginSet
Balance PluginSet
Evict PluginSet
Filter PluginSet
PreEvictionFilter PluginSet
}

View File

@@ -201,7 +201,10 @@ func V1alpha1ToInternal(
*pluginConfig,
},
Plugins: api.Plugins{
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},

View File

@@ -50,7 +50,6 @@ type Plugins struct {
Sort PluginSet `json:"sort"`
Deschedule PluginSet `json:"deschedule"`
Balance PluginSet `json:"balance"`
Evict PluginSet `json:"evict"`
Filter PluginSet `json:"filter"`
PreEvictionFilter PluginSet `json:"preevictionfilter"`
}

View File

@@ -229,9 +229,6 @@ func autoConvert_v1alpha2_Plugins_To_api_Plugins(in *Plugins, out *api.Plugins,
if err := Convert_v1alpha2_PluginSet_To_api_PluginSet(&in.Balance, &out.Balance, s); err != nil {
return err
}
if err := Convert_v1alpha2_PluginSet_To_api_PluginSet(&in.Evict, &out.Evict, s); err != nil {
return err
}
if err := Convert_v1alpha2_PluginSet_To_api_PluginSet(&in.Filter, &out.Filter, s); err != nil {
return err
}
@@ -259,9 +256,6 @@ func autoConvert_api_Plugins_To_v1alpha2_Plugins(in *api.Plugins, out *Plugins,
if err := Convert_api_PluginSet_To_v1alpha2_PluginSet(&in.Balance, &out.Balance, s); err != nil {
return err
}
if err := Convert_api_PluginSet_To_v1alpha2_PluginSet(&in.Evict, &out.Evict, s); err != nil {
return err
}
if err := Convert_api_PluginSet_To_v1alpha2_PluginSet(&in.Filter, &out.Filter, s); err != nil {
return err
}

View File

@@ -146,7 +146,6 @@ func (in *Plugins) DeepCopyInto(out *Plugins) {
in.Sort.DeepCopyInto(&out.Sort)
in.Deschedule.DeepCopyInto(&out.Deschedule)
in.Balance.DeepCopyInto(&out.Balance)
in.Evict.DeepCopyInto(&out.Evict)
in.Filter.DeepCopyInto(&out.Filter)
in.PreEvictionFilter.DeepCopyInto(&out.PreEvictionFilter)
return

View File

@@ -174,7 +174,6 @@ func (in *Plugins) DeepCopyInto(out *Plugins) {
in.Sort.DeepCopyInto(&out.Sort)
in.Deschedule.DeepCopyInto(&out.Deschedule)
in.Balance.DeepCopyInto(&out.Balance)
in.Evict.DeepCopyInto(&out.Evict)
in.Filter.DeepCopyInto(&out.Filter)
in.PreEvictionFilter.DeepCopyInto(&out.PreEvictionFilter)
return

View File

@@ -87,6 +87,15 @@ func setDefaultsPluginConfig(pluginConfig *api.PluginConfig, registry pluginregi
}
}
func findPluginName(names []string, key string) bool {
for _, name := range names {
if name == key {
return true
}
}
return false
}
func setDefaultEvictor(profile api.DeschedulerProfile, client clientset.Interface) api.DeschedulerProfile {
newPluginConfig := api.PluginConfig{
Name: defaultevictor.PluginName,
@@ -97,16 +106,24 @@ func setDefaultEvictor(profile api.DeschedulerProfile, client clientset.Interfac
EvictFailedBarePods: false,
},
}
if len(profile.Plugins.Evict.Enabled) == 0 && !hasPluginConfigsWithSameName(newPluginConfig, profile.PluginConfigs) {
profile.Plugins.Evict.Enabled = append(profile.Plugins.Evict.Enabled, defaultevictor.PluginName)
profile.PluginConfigs = append(profile.PluginConfigs, newPluginConfig)
// Always enable DefaultEvictor plugin for filter/preEvictionFilter extension points
if !findPluginName(profile.Plugins.Filter.Enabled, defaultevictor.PluginName) {
profile.Plugins.Filter.Enabled = append([]string{defaultevictor.PluginName}, profile.Plugins.Filter.Enabled...)
}
var thresholdPriority int32
var err error
if !findPluginName(profile.Plugins.PreEvictionFilter.Enabled, defaultevictor.PluginName) {
profile.Plugins.PreEvictionFilter.Enabled = append([]string{defaultevictor.PluginName}, profile.Plugins.PreEvictionFilter.Enabled...)
}
defaultevictorPluginConfig, idx := GetPluginConfig(defaultevictor.PluginName, profile.PluginConfigs)
if defaultevictorPluginConfig != nil {
thresholdPriority, err = utils.GetPriorityFromStrategyParams(context.TODO(), client, defaultevictorPluginConfig.Args.(*defaultevictor.DefaultEvictorArgs).PriorityThreshold)
if defaultevictorPluginConfig == nil {
profile.PluginConfigs = append([]api.PluginConfig{newPluginConfig}, profile.PluginConfigs...)
defaultevictorPluginConfig = &newPluginConfig
idx = 0
}
thresholdPriority, err := utils.GetPriorityFromStrategyParams(context.TODO(), client, defaultevictorPluginConfig.Args.(*defaultevictor.DefaultEvictorArgs).PriorityThreshold)
if err != nil {
klog.Error(err, "Failed to get threshold priority from args")
}
@@ -118,11 +135,6 @@ func setDefaultEvictor(profile api.DeschedulerProfile, client clientset.Interfac
func validateDeschedulerConfiguration(in api.DeschedulerPolicy, registry pluginregistry.Registry) error {
var errorsInProfiles error
for _, profile := range in.Profiles {
// api.DeschedulerPolicy needs only 1 evictor plugin enabled
if len(profile.Plugins.Evict.Enabled) != 1 {
errTooManyEvictors := fmt.Errorf("profile with invalid number of evictor plugins enabled found. Please enable a single evictor plugin.")
errorsInProfiles = setErrorsInProfiles(errTooManyEvictors, profile.Name, errorsInProfiles)
}
for _, pluginConfig := range profile.PluginConfigs {
if _, ok := registry[pluginConfig.Name]; ok {
pluginUtilities := registry[pluginConfig.Name]

View File

@@ -49,9 +49,6 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
},
},
}
defaultEvictorPluginSet := api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
}
type testCase struct {
description string
policy *v1alpha1.DeschedulerPolicy
@@ -113,7 +110,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{removeduplicates.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
// Disabled strategy is not generating internal plugin since it is not being used internally currently
@@ -221,7 +223,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{nodeutilization.HighNodeUtilizationPluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -248,7 +255,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{nodeutilization.LowNodeUtilizationPluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -264,7 +276,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{removeduplicates.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -280,7 +297,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removefailedpods.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -298,7 +320,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodshavingtoomanyrestarts.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -314,7 +341,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatinginterpodantiaffinity.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -332,7 +364,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatingnodeaffinity.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -348,7 +385,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatingnodetaints.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -364,7 +406,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{removepodsviolatingtopologyspreadconstraint.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
},
@@ -478,7 +525,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{nodeutilization.HighNodeUtilizationPluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -507,7 +559,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{nodeutilization.LowNodeUtilizationPluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -525,7 +582,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{removeduplicates.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -546,7 +608,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removefailedpods.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -565,7 +632,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodshavingtoomanyrestarts.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -581,7 +653,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatinginterpodantiaffinity.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -599,7 +676,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatingnodeaffinity.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -617,7 +699,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{removepodsviolatingnodetaints.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
{
@@ -635,7 +722,12 @@ func TestV1alpha1ToV1alpha2(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{removepodsviolatingtopologyspreadconstraint.PluginName},
},
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
},
},
@@ -713,9 +805,6 @@ func TestDecodeVersionedPolicy(t *testing.T) {
},
},
}
defaultEvictorPluginSet := api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
}
type testCase struct {
description string
policy []byte
@@ -754,7 +843,12 @@ strategies:
},
},
Plugins: api.Plugins{
Evict: defaultEvictorPluginSet,
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
Deschedule: api.PluginSet{
Enabled: []string{podlifetime.PluginName},
},
@@ -815,10 +909,10 @@ profiles:
},
},
Plugins: api.Plugins{
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
Filter: api.PluginSet{
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
Deschedule: api.PluginSet{
@@ -897,7 +991,7 @@ func TestValidateDeschedulerConfiguration(t *testing.T) {
},
},
},
result: fmt.Errorf("in profile RemoveFailedPods: profile with invalid number of evictor plugins enabled found. Please enable a single evictor plugin.: in profile RemoveFailedPods: only one of Include/Exclude namespaces can be set: in profile RemovePodsViolatingTopologySpreadConstraint: profile with invalid number of evictor plugins enabled found. Please enable a single evictor plugin.: in profile RemovePodsViolatingTopologySpreadConstraint: only one of Include/Exclude namespaces can be set"),
result: fmt.Errorf("in profile RemoveFailedPods: only one of Include/Exclude namespaces can be set: in profile RemovePodsViolatingTopologySpreadConstraint: only one of Include/Exclude namespaces can be set"),
},
}
@@ -939,7 +1033,7 @@ profiles:
filter:
enabled:
- "DefaultEvictor"
evict:
preEvictionFilter:
enabled:
- "DefaultEvictor"
deschedule:
@@ -969,12 +1063,68 @@ profiles:
},
},
Plugins: api.Plugins{
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
Deschedule: api.PluginSet{
Enabled: []string{removepodshavingtoomanyrestarts.PluginName},
},
},
},
},
},
},
{
description: "omit default evictor extension point with their enablement",
policy: []byte(`apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
- name: ProfileName
pluginConfig:
- name: "DefaultEvictor"
args:
evictSystemCriticalPods: true
evictFailedBarePods: true
evictLocalStoragePods: true
nodeFit: true
- name: "RemoveFailedPods"
plugins:
deschedule:
enabled:
- "RemovePodsHavingTooManyRestarts"
`),
result: &api.DeschedulerPolicy{
Profiles: []api.DeschedulerProfile{
{
Name: "ProfileName",
PluginConfigs: []api.PluginConfig{
{
Name: defaultevictor.PluginName,
Args: &defaultevictor.DefaultEvictorArgs{
EvictSystemCriticalPods: true,
EvictFailedBarePods: true,
EvictLocalStoragePods: true,
PriorityThreshold: &api.PriorityThreshold{Value: utilpointer.Int32(2000000000)},
NodeFit: true,
},
},
{
Name: removefailedpods.PluginName,
Args: &removefailedpods.RemoveFailedPodsArgs{
MinPodLifetimeSeconds: utilpointer.Uint(3600),
},
},
},
Plugins: api.Plugins{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
Deschedule: api.PluginSet{
Enabled: []string{removepodshavingtoomanyrestarts.PluginName},
},

View File

@@ -57,7 +57,10 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{"FakePlugin"},
},
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
@@ -87,7 +90,10 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{"FakePlugin"},
},
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
@@ -117,7 +123,10 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) {
Balance: api.PluginSet{
Enabled: []string{"FakePlugin"},
},
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
@@ -147,7 +156,10 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) {
Deschedule: api.PluginSet{
Enabled: []string{"FakePlugin"},
},
Evict: api.PluginSet{
Filter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
@@ -413,9 +425,9 @@ func TestProfileExtensionPoints(t *testing.T) {
Enabled: []string{"FakePlugin_0"},
},
Filter: api.PluginSet{
Enabled: []string{"FilterPlugin_1", "FilterPlugin_0"},
Enabled: []string{defaultevictor.PluginName, "FilterPlugin_1", "FilterPlugin_0"},
},
Evict: api.PluginSet{
PreEvictionFilter: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
},
},
@@ -477,7 +489,7 @@ func TestProfileExtensionPoints(t *testing.T) {
names = append(names, pl.Name())
}
sort.Strings(names)
diff = cmp.Diff(sets.NewString("FilterPlugin_0", "FilterPlugin_1"), sets.NewString(names...))
diff = cmp.Diff(sets.NewString("DefaultEvictor", "FilterPlugin_0", "FilterPlugin_1"), sets.NewString(names...))
if diff != "" {
t.Errorf("check for filter failed. Results are not deep equal. mismatch (-want +got):\n%s", diff)
}
@@ -640,13 +652,10 @@ func TestProfileExtensionPointOrdering(t *testing.T) {
Enabled: []string{"FakePlugin_1", "FakePlugin_0", "FakePlugin_2"},
},
Filter: api.PluginSet{
Enabled: []string{"Filter_2", "Filter_1", "Filter_0"},
Enabled: []string{defaultevictor.PluginName, "Filter_2", "Filter_1", "Filter_0"},
},
PreEvictionFilter: api.PluginSet{
Enabled: []string{"Filter_2", "Filter_1", "Filter_0"},
},
Evict: api.PluginSet{
Enabled: []string{defaultevictor.PluginName},
Enabled: []string{defaultevictor.PluginName, "Filter_2", "Filter_1", "Filter_0"},
},
},
},