mirror of
https://github.com/kubernetes-sigs/descheduler.git
synced 2026-01-26 05:14:13 +01:00
Merge pull request #474 from lixiang233/Ft_include_soft_constraints
Add a parameter to include soft topology spread constraints
This commit is contained in:
@@ -317,10 +317,14 @@ This strategy makes sure that pods violating [topology spread constraints](https
|
|||||||
are evicted from nodes. Specifically, it tries to evict the minimum number of pods required to balance topology domains to within each constraint's `maxSkew`.
|
are evicted from nodes. Specifically, it tries to evict the minimum number of pods required to balance topology domains to within each constraint's `maxSkew`.
|
||||||
This strategy requires k8s version 1.18 at a minimum.
|
This strategy requires k8s version 1.18 at a minimum.
|
||||||
|
|
||||||
|
By default, this strategy only deals with hard constraints, setting parameter `includeSoftConstraints` to `true` will
|
||||||
|
include soft constraints.
|
||||||
|
|
||||||
**Parameters:**
|
**Parameters:**
|
||||||
|
|
||||||
|Name|Type|
|
|Name|Type|
|
||||||
|---|---|
|
|---|---|
|
||||||
|
|`includeSoftConstraints`|bool|
|
||||||
|`thresholdPriority`|int (see [priority filtering](#priority-filtering))|
|
|`thresholdPriority`|int (see [priority filtering](#priority-filtering))|
|
||||||
|`thresholdPriorityClassName`|string (see [priority filtering](#priority-filtering))|
|
|`thresholdPriorityClassName`|string (see [priority filtering](#priority-filtering))|
|
||||||
|`namespaces`|(see [namespace filtering](#namespace-filtering))|
|
|`namespaces`|(see [namespace filtering](#namespace-filtering))|
|
||||||
@@ -333,6 +337,8 @@ kind: "DeschedulerPolicy"
|
|||||||
strategies:
|
strategies:
|
||||||
"RemovePodsViolatingTopologySpreadConstraint":
|
"RemovePodsViolatingTopologySpreadConstraint":
|
||||||
enabled: true
|
enabled: true
|
||||||
|
params:
|
||||||
|
includeSoftConstraints: false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ type StrategyParameters struct {
|
|||||||
PodsHavingTooManyRestarts *PodsHavingTooManyRestarts
|
PodsHavingTooManyRestarts *PodsHavingTooManyRestarts
|
||||||
PodLifeTime *PodLifeTime
|
PodLifeTime *PodLifeTime
|
||||||
RemoveDuplicates *RemoveDuplicates
|
RemoveDuplicates *RemoveDuplicates
|
||||||
|
IncludeSoftConstraints bool
|
||||||
Namespaces *Namespaces
|
Namespaces *Namespaces
|
||||||
ThresholdPriority *int32
|
ThresholdPriority *int32
|
||||||
ThresholdPriorityClassName string
|
ThresholdPriorityClassName string
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ type StrategyParameters struct {
|
|||||||
PodsHavingTooManyRestarts *PodsHavingTooManyRestarts `json:"podsHavingTooManyRestarts,omitempty"`
|
PodsHavingTooManyRestarts *PodsHavingTooManyRestarts `json:"podsHavingTooManyRestarts,omitempty"`
|
||||||
PodLifeTime *PodLifeTime `json:"podLifeTime,omitempty"`
|
PodLifeTime *PodLifeTime `json:"podLifeTime,omitempty"`
|
||||||
RemoveDuplicates *RemoveDuplicates `json:"removeDuplicates,omitempty"`
|
RemoveDuplicates *RemoveDuplicates `json:"removeDuplicates,omitempty"`
|
||||||
|
IncludeSoftConstraints bool `json:"includeSoftConstraints"`
|
||||||
Namespaces *Namespaces `json:"namespaces"`
|
Namespaces *Namespaces `json:"namespaces"`
|
||||||
ThresholdPriority *int32 `json:"thresholdPriority"`
|
ThresholdPriority *int32 `json:"thresholdPriority"`
|
||||||
ThresholdPriorityClassName string `json:"thresholdPriorityClassName"`
|
ThresholdPriorityClassName string `json:"thresholdPriorityClassName"`
|
||||||
|
|||||||
@@ -284,6 +284,7 @@ func autoConvert_v1alpha1_StrategyParameters_To_api_StrategyParameters(in *Strat
|
|||||||
out.PodsHavingTooManyRestarts = (*api.PodsHavingTooManyRestarts)(unsafe.Pointer(in.PodsHavingTooManyRestarts))
|
out.PodsHavingTooManyRestarts = (*api.PodsHavingTooManyRestarts)(unsafe.Pointer(in.PodsHavingTooManyRestarts))
|
||||||
out.PodLifeTime = (*api.PodLifeTime)(unsafe.Pointer(in.PodLifeTime))
|
out.PodLifeTime = (*api.PodLifeTime)(unsafe.Pointer(in.PodLifeTime))
|
||||||
out.RemoveDuplicates = (*api.RemoveDuplicates)(unsafe.Pointer(in.RemoveDuplicates))
|
out.RemoveDuplicates = (*api.RemoveDuplicates)(unsafe.Pointer(in.RemoveDuplicates))
|
||||||
|
out.IncludeSoftConstraints = in.IncludeSoftConstraints
|
||||||
out.Namespaces = (*api.Namespaces)(unsafe.Pointer(in.Namespaces))
|
out.Namespaces = (*api.Namespaces)(unsafe.Pointer(in.Namespaces))
|
||||||
out.ThresholdPriority = (*int32)(unsafe.Pointer(in.ThresholdPriority))
|
out.ThresholdPriority = (*int32)(unsafe.Pointer(in.ThresholdPriority))
|
||||||
out.ThresholdPriorityClassName = in.ThresholdPriorityClassName
|
out.ThresholdPriorityClassName = in.ThresholdPriorityClassName
|
||||||
@@ -301,6 +302,7 @@ func autoConvert_api_StrategyParameters_To_v1alpha1_StrategyParameters(in *api.S
|
|||||||
out.PodsHavingTooManyRestarts = (*PodsHavingTooManyRestarts)(unsafe.Pointer(in.PodsHavingTooManyRestarts))
|
out.PodsHavingTooManyRestarts = (*PodsHavingTooManyRestarts)(unsafe.Pointer(in.PodsHavingTooManyRestarts))
|
||||||
out.PodLifeTime = (*PodLifeTime)(unsafe.Pointer(in.PodLifeTime))
|
out.PodLifeTime = (*PodLifeTime)(unsafe.Pointer(in.PodLifeTime))
|
||||||
out.RemoveDuplicates = (*RemoveDuplicates)(unsafe.Pointer(in.RemoveDuplicates))
|
out.RemoveDuplicates = (*RemoveDuplicates)(unsafe.Pointer(in.RemoveDuplicates))
|
||||||
|
out.IncludeSoftConstraints = in.IncludeSoftConstraints
|
||||||
out.Namespaces = (*Namespaces)(unsafe.Pointer(in.Namespaces))
|
out.Namespaces = (*Namespaces)(unsafe.Pointer(in.Namespaces))
|
||||||
out.ThresholdPriority = (*int32)(unsafe.Pointer(in.ThresholdPriority))
|
out.ThresholdPriority = (*int32)(unsafe.Pointer(in.ThresholdPriority))
|
||||||
out.ThresholdPriorityClassName = in.ThresholdPriorityClassName
|
out.ThresholdPriorityClassName = in.ThresholdPriorityClassName
|
||||||
|
|||||||
@@ -125,9 +125,8 @@ func RemovePodsViolatingTopologySpreadConstraint(
|
|||||||
namespaceTopologySpreadConstraints := make(map[v1.TopologySpreadConstraint]struct{})
|
namespaceTopologySpreadConstraints := make(map[v1.TopologySpreadConstraint]struct{})
|
||||||
for _, pod := range namespacePods.Items {
|
for _, pod := range namespacePods.Items {
|
||||||
for _, constraint := range pod.Spec.TopologySpreadConstraints {
|
for _, constraint := range pod.Spec.TopologySpreadConstraints {
|
||||||
// Only deal with hard topology constraints
|
// Ignore soft topology constraints if they are not included
|
||||||
// TODO(@damemi): add support for soft constraints
|
if (strategy.Params == nil || !strategy.Params.IncludeSoftConstraints) && constraint.WhenUnsatisfiable != v1.DoNotSchedule {
|
||||||
if constraint.WhenUnsatisfiable != v1.DoNotSchedule {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
namespaceTopologySpreadConstraints[constraint] = struct{}{}
|
namespaceTopologySpreadConstraints[constraint] = struct{}{}
|
||||||
|
|||||||
Reference in New Issue
Block a user