@@ -17,12 +17,16 @@ limitations under the License.
17
17
package huaweicloud
18
18
19
19
import (
20
+ "context"
20
21
"fmt"
21
22
22
23
apiv1 "k8s.io/api/core/v1"
24
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23
25
"k8s.io/apimachinery/pkg/util/sets"
24
26
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
25
27
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"
26
30
"k8s.io/klog/v2"
27
31
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
28
32
)
@@ -105,6 +109,7 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
105
109
}
106
110
107
111
instanceIds := make ([]string , 0 , len (instances ))
112
+ nodeNames := make ([]string , 0 , len (instances ))
108
113
for _ , node := range nodes {
109
114
providerID := node .Spec .ProviderID
110
115
@@ -117,6 +122,7 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
117
122
118
123
klog .V (1 ).Infof ("going to remove node from scaling group. group: %s, node: %s" , asg .groupID , providerID )
119
124
instanceIds = append (instanceIds , providerID )
125
+ nodeNames = append (nodeNames , node .Name )
120
126
}
121
127
122
128
err = asg .cloudServiceManager .DeleteScalingInstances (asg .groupID , instanceIds )
@@ -125,6 +131,12 @@ func (asg *AutoScalingGroup) DeleteNodes(nodes []*apiv1.Node) error {
125
131
return err
126
132
}
127
133
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
+
128
140
return nil
129
141
}
130
142
@@ -214,3 +226,34 @@ func (asg *AutoScalingGroup) Autoprovisioned() bool {
214
226
func (asg * AutoScalingGroup ) String () string {
215
227
return fmt .Sprintf ("group: %s min=%d max=%d" , asg .groupID , asg .minInstanceNumber , asg .maxInstanceNumber )
216
228
}
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