github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/clusters/kubernetes/downscale.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/caos/orbos/mntr"
     8  	"github.com/caos/orbos/pkg/kubernetes"
     9  	v1 "k8s.io/api/core/v1"
    10  	macherrs "k8s.io/apimachinery/pkg/api/errors"
    11  )
    12  
    13  func scaleDown(pools []*initializedPool, k8sClient *kubernetes.Client, uninitializeMachine uninitializeMachineFunc, monitor mntr.Monitor, pdf func(mntr.Monitor) error) error {
    14  
    15  	for _, pool := range pools {
    16  		for _, machine := range pool.downscaling {
    17  			id := machine.infra.ID()
    18  			var existingK8sNode *v1.Node
    19  			if k8sClient != nil {
    20  				foundK8sNode, err := k8sClient.GetNode(id)
    21  				if macherrs.IsNotFound(err) {
    22  					err = nil
    23  				} else {
    24  					existingK8sNode = foundK8sNode
    25  				}
    26  				if err != nil {
    27  					return fmt.Errorf("getting node %s from kube api failed: %w", id, err)
    28  				}
    29  			}
    30  
    31  			if existingK8sNode != nil {
    32  				if err := k8sClient.Drain(machine.currentMachine, existingK8sNode, kubernetes.Deleting, true); err != nil {
    33  					return err
    34  				}
    35  			}
    36  
    37  			monitor.Info("Resetting kubeadm")
    38  			if _, resetErr := machine.infra.Execute(nil, "sudo kubeadm reset --force"); resetErr != nil {
    39  				if !strings.Contains(resetErr.Error(), "command not found") {
    40  					return resetErr
    41  				}
    42  			}
    43  
    44  			remove, err := machine.infra.Destroy()
    45  			if err != nil {
    46  				return err
    47  			}
    48  
    49  			if !machine.currentMachine.GetUpdating() {
    50  				machine.currentMachine.SetUpdating(true)
    51  				monitor.WithField("node", machine.infra.ID()).Changed("Node is ready to be deleted")
    52  			}
    53  
    54  			uninitializeMachine(id)
    55  			if req, _, unreq := machine.infra.ReplacementRequired(); req {
    56  				unreq()
    57  				pdf(monitor.WithFields(map[string]interface{}{
    58  					"reason":   "unrequire machine replacement",
    59  					"replaced": id,
    60  				}))
    61  			}
    62  			if err := remove(); err != nil {
    63  				return err
    64  			}
    65  			monitor.WithFields(map[string]interface{}{
    66  				"machine": id,
    67  				"tier":    machine.pool.tier,
    68  			}).Changed("Machine removed")
    69  		}
    70  	}
    71  
    72  	return nil
    73  }