From d41a1f4a5618e1c3c7dd35dcf3a015cf86ae2dfb Mon Sep 17 00:00:00 2001 From: lixiang Date: Tue, 2 Jun 2020 12:23:17 +0800 Subject: [PATCH] Ignore evicting when no evictable pod found on node --- .../strategies/lownodeutilization.go | 5 ++ .../strategies/lownodeutilization_test.go | 56 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/pkg/descheduler/strategies/lownodeutilization.go b/pkg/descheduler/strategies/lownodeutilization.go index d8ae2dc76..c58a640f8 100644 --- a/pkg/descheduler/strategies/lownodeutilization.go +++ b/pkg/descheduler/strategies/lownodeutilization.go @@ -231,6 +231,11 @@ func evictPodsFromTargetNodes( nonRemovablePods, bestEffortPods, burstablePods, guaranteedPods := classifyPods(node.allPods, evictLocalStoragePods) klog.V(2).Infof("allPods:%v, nonRemovablePods:%v, bestEffortPods:%v, burstablePods:%v, guaranteedPods:%v", len(node.allPods), len(nonRemovablePods), len(bestEffortPods), len(burstablePods), len(guaranteedPods)) + if len(node.allPods) == len(nonRemovablePods) { + klog.V(1).Infof("all pods nonRemovable on node %#v, try next node", node.node.Name) + continue + } + // Check if one pod has priority, if yes, assume that all pods have priority and evict pods based on priority. if node.allPods[0].Spec.Priority != nil { klog.V(1).Infof("All pods have priority associated with them. Evicting pods based on priority") diff --git a/pkg/descheduler/strategies/lownodeutilization_test.go b/pkg/descheduler/strategies/lownodeutilization_test.go index 75b5b854c..5afc0c0a6 100644 --- a/pkg/descheduler/strategies/lownodeutilization_test.go +++ b/pkg/descheduler/strategies/lownodeutilization_test.go @@ -86,6 +86,62 @@ func TestLowNodeUtilization(t *testing.T) { expectedPodsEvicted int evictedPods []string }{ + { + name: "no evictable pods", + thresholds: api.ResourceThresholds{ + v1.ResourceCPU: 30, + v1.ResourcePods: 30, + }, + targetThresholds: api.ResourceThresholds{ + v1.ResourceCPU: 50, + v1.ResourcePods: 50, + }, + nodes: map[string]*v1.Node{ + n1NodeName: test.BuildTestNode(n1NodeName, 4000, 3000, 9, nil), + n2NodeName: test.BuildTestNode(n2NodeName, 4000, 3000, 10, nil), + n3NodeName: test.BuildTestNode(n3NodeName, 4000, 3000, 10, setNodeUnschedulable), + }, + pods: map[string]*v1.PodList{ + n1NodeName: { + Items: []v1.Pod{ + // These won't be evicted. + *test.BuildTestPod("p1", 400, 0, n1NodeName, setDSOwnerRef), + *test.BuildTestPod("p2", 400, 0, n1NodeName, setDSOwnerRef), + *test.BuildTestPod("p3", 400, 0, n1NodeName, setDSOwnerRef), + *test.BuildTestPod("p4", 400, 0, n1NodeName, setDSOwnerRef), + *test.BuildTestPod("p5", 400, 0, n1NodeName, func(pod *v1.Pod) { + // A pod with local storage. + setNormalOwnerRef(pod) + pod.Spec.Volumes = []v1.Volume{ + { + Name: "sample", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{Path: "somePath"}, + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: resource.NewQuantity(int64(10), resource.BinarySI)}, + }, + }, + } + // A Mirror Pod. + pod.Annotations = test.GetMirrorPodAnnotation() + }), + *test.BuildTestPod("p6", 400, 0, n1NodeName, func(pod *v1.Pod) { + // A Critical Pod. + pod.Namespace = "kube-system" + priority := utils.SystemCriticalPriority + pod.Spec.Priority = &priority + }), + }, + }, + n2NodeName: { + Items: []v1.Pod{ + *test.BuildTestPod("p9", 400, 0, n1NodeName, setRSOwnerRef), + }, + }, + n3NodeName: {}, + }, + expectedPodsEvicted: 0, + }, { name: "without priorities", thresholds: api.ResourceThresholds{