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  }