Skip to content

Commit ca1749b

Browse files
committed
Delete nodes from cluster after scaling down.
1 parent 83c6c21 commit ca1749b

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

cluster-autoscaler/cloudprovider/huaweicloud/huaweicloud_auto_scaling_group.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ limitations under the License.
1717
package huaweicloud
1818

1919
import (
20+
"context"
2021
"fmt"
2122

2223
apiv1 "k8s.io/api/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2325
"k8s.io/apimachinery/pkg/util/sets"
2426
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
2527
huaweicloudsdkasmodel "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/huaweicloud/huaweicloud-sdk-go-v3/services/as/v1/model"
28+
"k8s.io/client-go/kubernetes"
29+
"k8s.io/client-go/tools/clientcmd"
2630
"k8s.io/klog/v2"
2731
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
2832
)
@@ -105,6 +109,7 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
105109
}
106110

107111
instanceIds := make([]string, 0, len(instances))
112+
nodeNames := make([]string, 0, len(instances))
108113
for _, node := range nodes {
109114
providerID := node.Spec.ProviderID
110115

@@ -117,6 +122,7 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
117122

118123
klog.V(1).Infof("going to remove node from scaling group. group: %s, node: %s", asg.groupID, providerID)
119124
instanceIds = append(instanceIds, providerID)
125+
nodeNames = append(nodeNames, node.Name)
120126
}
121127

122128
err = asg.cloudServiceManager.DeleteScalingInstances(asg.groupID, instanceIds)
@@ -125,6 +131,12 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
125131
return err
126132
}
127133

134+
err = asg.deleteNodesFromCluster(nodeNames)
135+
if err != nil {
136+
klog.Warningf("failed to delete nodes from cluster. error: %v", err)
137+
return err
138+
}
139+
128140
return nil
129141
}
130142

@@ -214,3 +226,34 @@ func (asg *AutoScalingGroup) Autoprovisioned() bool {
214226
func (asg *AutoScalingGroup) String() string {
215227
return fmt.Sprintf("group: %s min=%d max=%d", asg.groupID, asg.minInstanceNumber, asg.maxInstanceNumber)
216228
}
229+
230+
func (asg *AutoScalingGroup) deleteNodesFromCluster(nodeNames []string) error {
231+
restConfig, err := clientcmd.BuildConfigFromFlags("", "")
232+
if err != nil {
233+
klog.Warningf("Failed to delete nodes from cluster due to can not get config. error: %v", err)
234+
return err
235+
}
236+
237+
kubeClient, err := kubernetes.NewForConfig(restConfig)
238+
if err != nil {
239+
klog.Warningf("Failed to delete nodes from cluster due to can not get kube-client. error: %v", err)
240+
return err
241+
}
242+
243+
var failedNodes []string
244+
for _, nodeName := range nodeNames {
245+
err := kubeClient.CoreV1().Nodes().Delete(context.TODO(), nodeName, metav1.DeleteOptions{})
246+
if err != nil {
247+
klog.Warningf("Failed to delete node from cluster. node: %s, error: %s", nodeName, err)
248+
failedNodes = append(failedNodes, nodeName)
249+
continue
250+
}
251+
klog.V(1).Infof("deleted one node from cluster. node name: %s", nodeName)
252+
}
253+
254+
if len(failedNodes) != 0 {
255+
return fmt.Errorf("failed to delete %d node(s) from cluster", len(failedNodes))
256+
}
257+
258+
return nil
259+
}

0 commit comments

Comments
 (0)