Skip to content

Commit

Permalink
Improve delete node mechanisms in cluster-autoscaler CAPI provider
Browse files Browse the repository at this point in the history
This change adds a function to remove the annotations associated with
marking a node for deletion. It also adds logic to unmark a node in the
event that an error is returned after the node has been annotated but
before it has been removed. In the case where a node cannot be removed
(eg due to minimum size), the node is unmarked before we return from the
error condition.
  • Loading branch information
elmiko authored and detiber committed Aug 5, 2020
1 parent cf78c9b commit f111b67
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ func (r machineDeploymentScalableResource) SetSize(nreplicas int32) error {
return updateErr
}

func (r machineDeploymentScalableResource) UnmarkMachineForDeletion(machine *Machine) error {
return unmarkMachineForDeletion(r.controller, machine)
}

func (r machineDeploymentScalableResource) MarkMachineForDeletion(machine *Machine) error {
u, err := r.controller.dynamicclient.Resource(*r.controller.machineResource).Namespace(machine.Namespace).Get(machine.Name, metav1.GetOptions{})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ func (r machineSetScalableResource) MarkMachineForDeletion(machine *Machine) err
return updateErr
}

func (r machineSetScalableResource) UnmarkMachineForDeletion(machine *Machine) error {
return unmarkMachineForDeletion(r.controller, machine)
}

func newMachineSetScalableResource(controller *machineController, machineSet *MachineSet) (*machineSetScalableResource, error) {
minSize, maxSize, err := parseScalingBounds(machineSet.Annotations)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ func (ng *nodegroup) DeleteNodes(nodes []*corev1.Node) error {
}

if err := ng.scalableResource.SetSize(replicas - 1); err != nil {
nodeGroup.scalableResource.UnmarkMachineForDeletion(machine)
return err
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ limitations under the License.

package clusterapi

import (
"fmt"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// scalableResource is a resource that can be scaled up and down by
// adjusting its replica count field.
type scalableResource interface {
Expand Down Expand Up @@ -46,4 +52,27 @@ type scalableResource interface {

// MarkMachineForDeletion marks machine for deletion
MarkMachineForDeletion(machine *Machine) error

// UnmarkMachineForDeletion unmarks machine for deletion
UnmarkMachineForDeletion(machine *Machine) error
}

func unmarkMachineForDeletion(controller *machineController, machine *Machine) error {
u, err := controller.dynamicclient.Resource(*controller.machineResource).Namespace(machine.Namespace).Get(machine.Name, metav1.GetOptions{})

if err != nil {
return err
}
if u == nil {
return fmt.Errorf("unknown machine %s", machine.Name)
}

annotations := u.GetAnnotations()
if _, ok := annotations[machineDeleteAnnotationKey]; ok {
delete(annotations, machineDeleteAnnotationKey)
u.SetAnnotations(annotations)
_, updateErr := controller.dynamicclient.Resource(*controller.machineResource).Namespace(u.GetNamespace()).Update(u, metav1.UpdateOptions{})
return updateErr
}
return nil
}

0 comments on commit f111b67

Please sign in to comment.