github.com/sealerio/sealer@v0.11.1-0.20240507115618-f4f89c5853ae/pkg/runtime/k0s/delete_nodes.go (about) 1 // Copyright © 2022 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package k0s 16 17 import ( 18 "context" 19 "fmt" 20 "net" 21 22 "github.com/sirupsen/logrus" 23 "golang.org/x/sync/errgroup" 24 corev1 "k8s.io/api/core/v1" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 ) 27 28 func (k *Runtime) deleteNodes(nodesToDelete, remainMasters []net.IP) error { 29 var remainMaster0 *net.IP 30 if len(remainMasters) > 0 { 31 remainMaster0 = &remainMasters[0] 32 } 33 eg, _ := errgroup.WithContext(context.Background()) 34 for _, node := range nodesToDelete { 35 node := node 36 eg.Go(func() error { 37 logrus.Infof("Start to delete node %s", node) 38 if err := k.deleteNode(node, remainMaster0); err != nil { 39 return fmt.Errorf("failed to delete node %s: %v", node, err) 40 } 41 logrus.Infof("Succeeded in deleting node %s", node) 42 return nil 43 }) 44 } 45 return eg.Wait() 46 } 47 48 func (k *Runtime) deleteNode(node net.IP, remainMaster0 *net.IP) error { 49 /** To delete a node from k0s cluster, following these steps. 50 STEP1: drain specified node 51 STEP2: stop k0s service 52 STEP3: unmount kubelet related pod volume, this would cause k0s reset return error 53 STEP4: reset the node with install configuration 54 STEP5: remove k0s cluster config generate by k0s under /etc/k0s 55 STEP6: remove private registry config in /etc/host 56 STEP7: remove bin file such as: kubectl, and remove .kube directory 57 STEP8: remove k0s bin file. 58 STEP9: delete node though k8s client 59 */ 60 // remove node, if remainMaster0 is nil, no need delete master from cluster 61 if remainMaster0 != nil { 62 nodeName, err := k.getNodeName(node) 63 if err != nil { 64 return err 65 } 66 67 if err = k.deleteNodeFromCluster(nodeName); err != nil { 68 return err 69 } 70 } 71 72 remoteCleanCmds := []string{"k0s stop", 73 "umount $(df -HT | grep '/var/lib/k0s/kubelet/pods' | awk '{print $7}')", 74 "k0s reset", 75 "rm -rf /etc/k0s/", 76 "rm -rf /usr/bin/kube* && rm -rf ~/.kube/", 77 "rm -rf /usr/bin/k0s"} 78 if err := k.infra.CmdAsync(node, nil, remoteCleanCmds...); err != nil { 79 return err 80 } 81 return nil 82 } 83 84 func (k *Runtime) deleteNodeFromCluster(nodeName string) error { 85 client, err := k.GetCurrentRuntimeDriver() 86 if err != nil { 87 return err 88 } 89 nodeToDelete := &corev1.Node{ 90 ObjectMeta: metav1.ObjectMeta{ 91 Name: nodeName, 92 }, 93 } 94 return client.Delete(context.Background(), nodeToDelete) 95 }