Skip to content

Commit 1eaf864

Browse files
vinceprik8s-ci-robot
authored andcommitted
Use remote NodeRef in Machine and MachineSet controllers (#1052)
Signed-off-by: Vince Prignano <[email protected]>
1 parent 8141304 commit 1eaf864

File tree

4 files changed

+67
-21
lines changed

4 files changed

+67
-21
lines changed

pkg/controller/machine/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go_library(
1212
deps = [
1313
"//pkg/apis/cluster/v1alpha1:go_default_library",
1414
"//pkg/controller/error:go_default_library",
15+
"//pkg/controller/remote:go_default_library",
1516
"//pkg/util:go_default_library",
1617
"//vendor/github.com/pkg/errors:go_default_library",
1718
"//vendor/k8s.io/api/core/v1:go_default_library",

pkg/controller/machine/machine_controller.go

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"k8s.io/klog"
2929
clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1"
3030
controllerError "sigs.k8s.io/cluster-api/pkg/controller/error"
31+
"sigs.k8s.io/cluster-api/pkg/controller/remote"
3132
"sigs.k8s.io/cluster-api/pkg/util"
3233
"sigs.k8s.io/controller-runtime/pkg/client"
3334
"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -180,8 +181,8 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul
180181

181182
if m.Status.NodeRef != nil {
182183
klog.Infof("Deleting node %q for machine %q", m.Status.NodeRef.Name, m.Name)
183-
if err := r.deleteNode(ctx, m.Status.NodeRef.Name); err != nil {
184-
klog.Errorf("Error deleting node %q for machine %q", name, err)
184+
if err := r.deleteNode(ctx, cluster, m.Status.NodeRef.Name); err != nil && !apierrors.IsNotFound(err) {
185+
klog.Errorf("Error deleting node %q for machine %q: %v", m.Status.NodeRef.Name, name, err)
185186
return reconcile.Result{}, err
186187
}
187188
}
@@ -252,6 +253,9 @@ func (r *ReconcileMachine) getCluster(ctx context.Context, machine *clusterv1.Ma
252253
return cluster, nil
253254
}
254255

256+
// isDeletedAllowed returns false if the Machine we're trying to delete is the
257+
// Machine hosting this controller. This method is meant to be functional
258+
// only when the controllers are running in the workload cluster.
255259
func (r *ReconcileMachine) isDeleteAllowed(machine *clusterv1.Machine) bool {
256260
if r.nodeName == "" || machine.Status.NodeRef == nil {
257261
return true
@@ -273,15 +277,30 @@ func (r *ReconcileMachine) isDeleteAllowed(machine *clusterv1.Machine) bool {
273277
return node.UID != machine.Status.NodeRef.UID
274278
}
275279

276-
func (r *ReconcileMachine) deleteNode(ctx context.Context, name string) error {
277-
var node corev1.Node
278-
if err := r.Client.Get(ctx, client.ObjectKey{Name: name}, &node); err != nil {
279-
if apierrors.IsNotFound(err) {
280-
klog.V(2).Infof("Node %q not found", name)
281-
return nil
280+
func (r *ReconcileMachine) deleteNode(ctx context.Context, cluster *clusterv1.Cluster, name string) error {
281+
if cluster == nil {
282+
// Try to retrieve the Node from the local cluster, if no Cluster reference is found.
283+
var node corev1.Node
284+
if err := r.Client.Get(ctx, client.ObjectKey{Name: name}, &node); err != nil {
285+
return err
282286
}
283-
klog.Errorf("Failed to get node %q: %v", name, err)
284-
return err
287+
return r.Client.Delete(ctx, &node)
288+
}
289+
290+
// Otherwise, proceed to get the remote cluster client and get the Node.
291+
remoteClient, err := remote.NewClusterClient(r.Client, cluster)
292+
if err != nil {
293+
klog.Errorf("Error creating a remote client for cluster %q while deleting Machine %q, won't retry: %v",
294+
cluster.Name, name, err)
295+
return nil
285296
}
286-
return r.Client.Delete(ctx, &node)
297+
298+
corev1Remote, err := remoteClient.CoreV1()
299+
if err != nil {
300+
klog.Errorf("Error creating a remote client for cluster %q while deleting Machine %q, won't retry: %v",
301+
cluster.Name, name, err)
302+
return nil
303+
}
304+
305+
return corev1Remote.Nodes().Delete(name, &metav1.DeleteOptions{})
287306
}

pkg/controller/machineset/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ go_library(
1313
deps = [
1414
"//pkg/apis/cluster/v1alpha1:go_default_library",
1515
"//pkg/controller/noderefutil:go_default_library",
16+
"//pkg/controller/remote:go_default_library",
1617
"//pkg/util:go_default_library",
1718
"//vendor/github.com/pkg/errors:go_default_library",
1819
"//vendor/k8s.io/api/core/v1:go_default_library",

pkg/controller/machineset/status.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import (
2020
"context"
2121
"fmt"
2222

23-
"github.com/pkg/errors"
2423
corev1 "k8s.io/api/core/v1"
2524
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2625
"k8s.io/apimachinery/pkg/labels"
2726
"k8s.io/klog"
2827
"sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1"
2928
"sigs.k8s.io/cluster-api/pkg/controller/noderefutil"
29+
"sigs.k8s.io/cluster-api/pkg/controller/remote"
3030
"sigs.k8s.io/controller-runtime/pkg/client"
3131
)
3232

@@ -37,6 +37,7 @@ const (
3737

3838
func (c *ReconcileMachineSet) calculateStatus(ms *v1alpha1.MachineSet, filteredMachines []*v1alpha1.Machine) v1alpha1.MachineSetStatus {
3939
newStatus := ms.Status
40+
4041
// Count the number of machines that have labels matching the labels of the machine
4142
// template of the replica set, the matching machines may have more
4243
// labels than are in the template. Because the label of machineTemplateSpec is
@@ -46,15 +47,28 @@ func (c *ReconcileMachineSet) calculateStatus(ms *v1alpha1.MachineSet, filteredM
4647
readyReplicasCount := 0
4748
availableReplicasCount := 0
4849
templateLabel := labels.Set(ms.Spec.Template.Labels).AsSelectorPreValidated()
50+
51+
// Retrieve Cluster, if any.
52+
cluster, _ := c.getCluster(ms)
53+
4954
for _, machine := range filteredMachines {
5055
if templateLabel.Matches(labels.Set(machine.Labels)) {
5156
fullyLabeledReplicasCount++
5257
}
53-
node, err := c.getMachineNode(machine)
58+
59+
if machine.Status.NodeRef == nil {
60+
klog.Warningf("Unable to retrieve Node status for Machine %q in namespace %q: missing NodeRef",
61+
machine.Name, machine.Namespace)
62+
continue
63+
}
64+
65+
node, err := c.getMachineNode(cluster, machine)
5466
if err != nil {
55-
klog.V(4).Infof("Unable to get node for machine %v, %v", machine.Name, err)
67+
klog.Warningf("Unable to retrieve Node status for Machine %q in namespace %q: %v",
68+
machine.Name, machine.Namespace, err)
5669
continue
5770
}
71+
5872
if noderefutil.IsNodeReady(node) {
5973
readyReplicasCount++
6074
if noderefutil.IsNodeAvailable(node, ms.Spec.MinReadySeconds, metav1.Now()) {
@@ -122,13 +136,24 @@ func updateMachineSetStatus(c client.Client, ms *v1alpha1.MachineSet, newStatus
122136
return nil, updateErr
123137
}
124138

125-
func (c *ReconcileMachineSet) getMachineNode(machine *v1alpha1.Machine) (*corev1.Node, error) {
126-
nodeRef := machine.Status.NodeRef
127-
if nodeRef == nil {
128-
return nil, errors.New("machine has no node ref")
139+
func (c *ReconcileMachineSet) getMachineNode(cluster *v1alpha1.Cluster, machine *v1alpha1.Machine) (*corev1.Node, error) {
140+
if cluster == nil {
141+
// Try to retrieve the Node from the local cluster, if no Cluster reference is found.
142+
node := &corev1.Node{}
143+
err := c.Client.Get(context.Background(), client.ObjectKey{Name: machine.Status.NodeRef.Name}, node)
144+
return node, err
145+
}
146+
147+
// Otherwise, proceed to get the remote cluster client and get the Node.
148+
remoteClient, err := remote.NewClusterClient(c.Client, cluster)
149+
if err != nil {
150+
return nil, err
151+
}
152+
153+
corev1Remote, err := remoteClient.CoreV1()
154+
if err != nil {
155+
return nil, err
129156
}
130157

131-
node := &corev1.Node{}
132-
err := c.Client.Get(context.Background(), client.ObjectKey{Name: nodeRef.Name}, node)
133-
return node, err
158+
return corev1Remote.Nodes().Get(machine.Status.NodeRef.Name, metav1.GetOptions{})
134159
}

0 commit comments

Comments
 (0)