Skip to content

Commit 4f58055

Browse files
committed
Skip to be deleted nodes from template candidates
1 parent 68c7d1a commit 4f58055

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

cluster-autoscaler/processors/nodeinfosprovider/mixed_nodeinfos_processor.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,5 +184,12 @@ func isNodeGoodTemplateCandidate(node *apiv1.Node, now time.Time) bool {
184184
ready, lastTransitionTime, _ := kube_util.GetReadinessState(node)
185185
stable := lastTransitionTime.Add(stabilizationDelay).Before(now)
186186
schedulable := !node.Spec.Unschedulable
187-
return ready && stable && schedulable
187+
toBeDeleted := false
188+
for _, taint := range node.Spec.Taints {
189+
if taint.Key == taints.ToBeDeletedTaint {
190+
toBeDeleted = true
191+
break
192+
}
193+
}
194+
return ready && stable && schedulable && !toBeDeleted
188195
}

cluster-autoscaler/processors/nodeinfosprovider/mixed_nodeinfos_processor_test.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package nodeinfosprovider
1818

1919
import (
20+
"fmt"
2021
"testing"
2122
"time"
2223

@@ -50,14 +51,19 @@ func TestGetNodeInfosForGroups(t *testing.T) {
5051
SetNodeReadyState(unready4, false, now)
5152
justReady5 := BuildTestNode("n5", 5000, 5000)
5253
SetNodeReadyState(justReady5, true, now)
54+
readyToBeDeleted6 := BuildTestNode("n6", 2000, 2000)
55+
SetNodeReadyState(readyToBeDeleted6, true, now.Add(-2*time.Minute))
56+
setToBeDeletedTaint(readyToBeDeleted6)
57+
ready7 := BuildTestNode("n7", 6000, 6000)
58+
SetNodeReadyState(ready7, true, now.Add(-2*time.Minute))
5359

5460
tn := BuildTestNode("tn", 5000, 5000)
5561
tni := framework.NewTestNodeInfo(tn)
5662

5763
// Cloud provider with TemplateNodeInfo implemented.
5864
provider1 := testprovider.NewTestAutoprovisioningCloudProvider(
5965
nil, nil, nil, nil, nil,
60-
map[string]*framework.NodeInfo{"ng3": tni, "ng4": tni, "ng5": tni})
66+
map[string]*framework.NodeInfo{"ng3": tni, "ng4": tni, "ng5": tni, "ng6": tni})
6167
provider1.AddNodeGroup("ng1", 1, 10, 1) // Nodegroup with ready node.
6268
provider1.AddNode("ng1", ready1)
6369
provider1.AddNodeGroup("ng2", 1, 10, 1) // Nodegroup with ready and unready node.
@@ -68,15 +74,18 @@ func TestGetNodeInfosForGroups(t *testing.T) {
6874
provider1.AddNodeGroup("ng4", 0, 1000, 0) // Nodegroup without nodes.
6975
provider1.AddNodeGroup("ng5", 1, 10, 1) // Nodegroup with node that recently became ready.
7076
provider1.AddNode("ng5", justReady5)
77+
provider1.AddNodeGroup("ng6", 1, 10, 1) // Nodegroup with to be deleted node
78+
provider1.AddNode("ng6", readyToBeDeleted6)
79+
provider1.AddNode("ng6", ready7)
7180

7281
// Cloud provider with TemplateNodeInfo not implemented.
7382
provider2 := testprovider.NewTestAutoprovisioningCloudProvider(nil, nil, nil, nil, nil, nil)
74-
provider2.AddNodeGroup("ng6", 1, 10, 1) // Nodegroup without nodes.
83+
provider2.AddNodeGroup("ng7", 1, 10, 1) // Nodegroup without nodes.
7584

7685
podLister := kube_util.NewTestPodLister([]*apiv1.Pod{})
7786
registry := kube_util.NewListerRegistry(nil, nil, podLister, nil, nil, nil, nil, nil, nil)
7887

79-
nodes := []*apiv1.Node{justReady5, unready4, unready3, ready2, ready1}
88+
nodes := []*apiv1.Node{justReady5, unready4, unready3, ready2, ready1, ready7, readyToBeDeleted6}
8089
snapshot := testsnapshot.NewTestSnapshotOrDie(t)
8190
err := snapshot.SetClusterState(nodes, nil, drasnapshot.Snapshot{})
8291
assert.NoError(t, err)
@@ -90,7 +99,7 @@ func TestGetNodeInfosForGroups(t *testing.T) {
9099
}
91100
res, err := NewMixedTemplateNodeInfoProvider(&cacheTtl, false).Process(&ctx, nodes, []*appsv1.DaemonSet{}, taints.TaintConfig{}, now)
92101
assert.NoError(t, err)
93-
assert.Equal(t, 5, len(res))
102+
assert.Equal(t, 6, len(res))
94103
info, found := res["ng1"]
95104
assert.True(t, found)
96105
assertEqualNodeCapacities(t, ready1, info.Node())
@@ -106,6 +115,9 @@ func TestGetNodeInfosForGroups(t *testing.T) {
106115
info, found = res["ng5"]
107116
assert.True(t, found)
108117
assertEqualNodeCapacities(t, tn, info.Node())
118+
info, found = res["ng6"]
119+
assert.True(t, found)
120+
assertEqualNodeCapacities(t, ready7, info.Node())
109121

110122
// Test for a nodegroup without nodes and TemplateNodeInfo not implemented by cloud proivder
111123
ctx = context.AutoscalingContext{
@@ -314,3 +326,11 @@ func getNodeResource(node *apiv1.Node, resource apiv1.ResourceName) int64 {
314326

315327
return nodeCapacityValue
316328
}
329+
330+
func setToBeDeletedTaint(node *apiv1.Node) {
331+
node.Spec.Taints = append(node.Spec.Taints, apiv1.Taint{
332+
Key: taints.ToBeDeletedTaint,
333+
Value: fmt.Sprint(time.Now().Unix()),
334+
Effect: apiv1.TaintEffectNoSchedule,
335+
})
336+
}

0 commit comments

Comments
 (0)