github.com/sealerio/sealer@v0.11.1-0.20240507115618-f4f89c5853ae/pkg/runtime/kubernetes/clean.go (about) 1 // Copyright © 2021 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 kubernetes 16 17 import ( 18 "context" 19 "fmt" 20 "net" 21 "strings" 22 23 "github.com/sirupsen/logrus" 24 "golang.org/x/sync/errgroup" 25 ) 26 27 func (k *Runtime) reset(mastersToDelete, workersToDelete []net.IP) error { 28 all := append(mastersToDelete, workersToDelete...) 29 remoteCleanCmd := []string{fmt.Sprintf(RemoteCleanK8sOnHost, vlogToStr(k.Config.Vlog)), 30 fmt.Sprintf(RemoteRemoveAPIServerEtcHost, k.getAPIServerDomain())} 31 32 // do kubeadm reset 33 eg, _ := errgroup.WithContext(context.Background()) 34 for _, node := range all { 35 n := node 36 eg.Go(func() error { 37 if err := k.infra.CmdAsync(n, nil, remoteCleanCmd...); err != nil { 38 return err 39 } 40 return nil 41 }) 42 } 43 err := eg.Wait() 44 if err != nil { 45 return err 46 } 47 48 // clean vip route on node 49 for _, node := range workersToDelete { 50 if err = k.deleteVIPRouteIfExist(node); err != nil { 51 return fmt.Errorf("failed to delete vip route %s: %v", node, err) 52 } 53 } 54 return nil 55 } 56 57 func (k *Runtime) deleteMasters(mastersToDelete, remainMasters []net.IP) error { 58 var remainMaster0 *net.IP 59 if len(remainMasters) > 0 { 60 remainMaster0 = &remainMasters[0] 61 } 62 63 eg, _ := errgroup.WithContext(context.Background()) 64 65 for _, m := range mastersToDelete { 66 master := m 67 eg.Go(func() error { 68 logrus.Infof("start to delete master %s", master) 69 if err := k.deleteMaster(master, remainMaster0); err != nil { 70 return fmt.Errorf("failed to delete master %s: %v", master, err) 71 } 72 logrus.Infof("succeeded in deleting master %s", master) 73 74 return nil 75 }) 76 } 77 78 return eg.Wait() 79 } 80 81 func (k *Runtime) deleteMaster(master net.IP, remainMaster0 *net.IP) error { 82 remoteCleanCmd := []string{fmt.Sprintf(RemoteCleanK8sOnHost, vlogToStr(k.Config.Vlog)), 83 fmt.Sprintf(RemoteRemoveAPIServerEtcHost, k.getAPIServerDomain()), RemoteCleanCustomizeCRISocket} 84 85 //if the master to be removed is the execution machine, kubelet and ~./kube will not be removed and ApiServer host will be added. 86 87 if err := k.infra.CmdAsync(master, nil, remoteCleanCmd...); err != nil { 88 logrus.Warnf("failed to run remote cleanup cmd on master %s, ignore and continue remove it from cluster", master) 89 } 90 91 // if remainMaster0 is nil, no need delete master from cluster 92 if remainMaster0 != nil { 93 hostname, err := k.getNodeNameByCmd(master) 94 if err != nil { 95 logrus.Infof("%v, just think it not in k8s and skip delete it", err) 96 return nil 97 } 98 if err = k.infra.CmdAsync(*remainMaster0, nil, fmt.Sprintf(KubeDeleteNode, strings.TrimSpace(hostname))); err != nil { 99 return fmt.Errorf("failed to delete master %s: %v", hostname, err) 100 } 101 } 102 103 return nil 104 } 105 106 func (k *Runtime) deleteNodes(nodesToDelete, remainMasters []net.IP) error { 107 var remainMaster0 *net.IP 108 if len(remainMasters) > 0 { 109 remainMaster0 = &remainMasters[0] 110 } 111 112 eg, _ := errgroup.WithContext(context.Background()) 113 for _, node := range nodesToDelete { 114 n := node 115 eg.Go(func() error { 116 logrus.Infof("start to delete worker %s", n) 117 if err := k.deleteNode(n, remainMaster0); err != nil { 118 return fmt.Errorf("failed to delete node %s: %v", n, err) 119 } 120 logrus.Infof("succeeded in deleting worker %s", n) 121 122 return nil 123 }) 124 } 125 return eg.Wait() 126 } 127 128 func (k *Runtime) deleteNode(node net.IP, remainMaster0 *net.IP) error { 129 remoteCleanCmd := []string{fmt.Sprintf(RemoteCleanK8sOnHost, vlogToStr(k.Config.Vlog)), 130 fmt.Sprintf(RemoteRemoveAPIServerEtcHost, k.getAPIServerDomain()), RemoteCleanCustomizeCRISocket, fmt.Sprintf(RemoteDelRoute, k.getAPIServerVIP(), node)} 131 132 //if the master to be removed is the execution machine, kubelet and ~./kube will not be removed and ApiServer host will be added. 133 134 if err := k.infra.CmdAsync(node, nil, remoteCleanCmd...); err != nil { 135 logrus.Warnf("failed to run remote cleanup cmd on node %s, ignore and continue remove it from cluster", node) 136 } 137 138 // if remainMaster0 is nil, no need delete master from cluster 139 if remainMaster0 != nil { 140 hostname, err := k.getNodeNameByCmd(node) 141 if err != nil { 142 logrus.Infof("%v, just think it not in k8s and skip delete it", err) 143 return nil 144 } 145 146 if err = k.infra.CmdAsync(*remainMaster0, nil, fmt.Sprintf(KubeDeleteNode, strings.TrimSpace(hostname))); err != nil { 147 return fmt.Errorf("failed to delete node %s: %v", hostname, err) 148 } 149 } 150 151 return nil 152 } 153 154 func (k *Runtime) deleteVIPRouteIfExist(node net.IP) error { 155 _, err := k.infra.Cmd(node, nil, fmt.Sprintf(RemoteDelRoute, k.getAPIServerVIP(), node)) 156 return err 157 }