Skip to content

Commit 80e574b

Browse files
authored
match on Node controller ref in NNC event predicate (Azure#1190)
Signed-off-by: Evan Baker <rbtr@users.noreply.github.com>
1 parent ee60d13 commit 80e574b

File tree

5 files changed

+40
-15
lines changed

5 files changed

+40
-15
lines changed

cns/azure-cns.yaml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ metadata:
1010
namespace: kube-system
1111
name: nodeNetConfigEditor
1212
rules:
13-
- apiGroups: ["acn.azure.com"]
14-
resources: ["nodenetworkconfigs"]
15-
verbs: ["get", "list", "watch", "patch", "update"]
13+
- apiGroups: ["acn.azure.com"]
14+
resources: ["nodenetworkconfigs"]
15+
verbs: ["get", "list", "watch", "patch", "update"]
1616
---
1717
apiVersion: rbac.authorization.k8s.io/v1
1818
kind: ClusterRole
@@ -22,6 +22,9 @@ rules:
2222
- apiGroups: [""]
2323
resources: ["pods"]
2424
verbs: ["get", "watch", "list"]
25+
- apiGroups: [""]
26+
resources: ["nodes"]
27+
verbs: ["get"]
2528
---
2629
apiVersion: rbac.authorization.k8s.io/v1
2730
kind: RoleBinding

cns/service/main.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ import (
4646
"github.com/Azure/azure-container-networking/store"
4747
"github.com/avast/retry-go/v3"
4848
"github.com/pkg/errors"
49+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4950
"k8s.io/apimachinery/pkg/fields"
5051
"k8s.io/apimachinery/pkg/types"
52+
"k8s.io/client-go/kubernetes"
5153
ctrl "sigs.k8s.io/controller-runtime"
5254
"sigs.k8s.io/controller-runtime/pkg/cache"
5355
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -863,13 +865,12 @@ func initCNS(ctx context.Context, cli nodeNetworkConfigGetter, ncReconciler ncSt
863865
}
864866
podInfoByIP, err := podInfoByIPProvider.PodInfoByIP()
865867
if err != nil {
866-
return errors.Wrap(err, "err in CNS initialization")
868+
return errors.Wrap(err, "provider failed to provide PodInfoByIP")
867869
}
868870

869-
// errors.Wrap provides additional context, and return nil if the err input arg is nil
870871
// Call cnsclient init cns passing those two things.
871872
err = restserver.ResponseCodeToError(ncReconciler.ReconcileNCState(&ncRequest, podInfoByIP, nnc))
872-
return errors.Wrap(err, "err in CNS reconciliation")
873+
return errors.Wrap(err, "failed to reconcile NC state")
873874
}
874875

875876
// InitializeCRDState builds and starts the CRD controllers.
@@ -945,6 +946,7 @@ func InitializeCRDState(ctx context.Context, httpRestService cns.HTTPService, cn
945946
},
946947
},
947948
})
949+
948950
manager, err := ctrl.NewManager(kubeConfig, ctrl.Options{
949951
Scheme: nodenetworkconfig.Scheme,
950952
MetricsBindAddress: cnsconfig.MetricsBindAddress,
@@ -954,9 +956,23 @@ func InitializeCRDState(ctx context.Context, httpRestService cns.HTTPService, cn
954956
if err != nil {
955957
return errors.Wrap(err, "failed to create manager")
956958
}
959+
960+
clientset, err := kubernetes.NewForConfig(kubeConfig)
961+
if err != nil {
962+
return errors.Wrap(err, "failed to build clientset")
963+
}
964+
965+
// get our Node so that we can xref it against the NodeNetworkConfig's to make sure that the
966+
// NNC is not stale and represents the Node we're running on.
967+
node, err := clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{})
968+
if err != nil {
969+
return errors.Wrapf(err, "failed to get node %s", nodeName)
970+
}
971+
957972
reconciler := kubecontroller.NewReconciler(nnccli, httpRestServiceImplementation, httpRestServiceImplementation.IPAMPoolMonitor)
958-
if err := reconciler.SetupWithManager(manager, nodeName); err != nil {
959-
return err
973+
// pass Node to the Reconciler for Controller xref
974+
if err := reconciler.SetupWithManager(manager, node); err != nil {
975+
return errors.Wrapf(err, "failed to setup reconciler with manager")
960976
}
961977

962978
// Start the RequestController which starts the reconcile loop

cns/singletenantcontroller/reconciler.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
cnstypes "github.com/Azure/azure-container-networking/cns/types"
1010
"github.com/Azure/azure-container-networking/crd/nodenetworkconfig/api/v1alpha"
1111
"github.com/pkg/errors"
12+
v1 "k8s.io/api/core/v1"
1213
apierrors "k8s.io/apimachinery/pkg/api/errors"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1315
"k8s.io/apimachinery/pkg/types"
1416
ctrl "sigs.k8s.io/controller-runtime"
1517
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -89,7 +91,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (reco
8991
}
9092

9193
// SetupWithManager Sets up the reconciler with a new manager, filtering using NodeNetworkConfigFilter on nodeName.
92-
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, nodeName string) error {
94+
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, node *v1.Node) error {
9395
err := ctrl.NewControllerManagedBy(mgr).
9496
For(&v1alpha.NodeNetworkConfig{}).
9597
WithEventFilter(predicate.Funcs{
@@ -99,8 +101,8 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, nodeName string) error {
99101
},
100102
}).
101103
WithEventFilter(predicate.NewPredicateFuncs(func(object client.Object) bool {
102-
// match on node name for all other events.
103-
return nodeName == object.GetName()
104+
// match on node controller ref for all other events.
105+
return metav1.IsControlledBy(object, node)
104106
})).
105107
WithEventFilter(predicate.Funcs{
106108
// check that the generation is the same - status changes don't update generation.a

crd/nodenetworkconfig/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ func NewClient(c *rest.Config) (*Client, error) {
4242
opts := ctrlcli.Options{
4343
Scheme: Scheme,
4444
}
45-
nnnCli, err := ctrlcli.New(c, opts)
45+
nncCli, err := ctrlcli.New(c, opts)
4646
if err != nil {
4747
return nil, errors.Wrap(err, "failed to init nnc client")
4848
}
4949
return &Client{
5050
crdcli: crdCli,
51-
nnccli: nnnCli,
51+
nnccli: nncCli,
5252
}, nil
5353
}
5454

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
---
12
apiVersion: rbac.authorization.k8s.io/v1
23
kind: ClusterRole
34
metadata:
45
name: pod-reader-all-namespaces
5-
namespace: kube-system
6+
namespace: kube-system
67
rules:
78
- apiGroups: [""]
89
resources: ["pods"]
9-
verbs: ["get", "watch", "list"]
10+
verbs: ["get", "watch", "list"]
11+
- apiGroups: [""]
12+
resources: ["nodes"]
13+
verbs: ["get"]

0 commit comments

Comments
 (0)