m/n/kubernetes/{clusternet,nfproxy}: log informer errors

Change-Id: I9ea1444c7042dd25c25cecc6b6da054554010a85
Reviewed-on: https://review.monogon.dev/c/monogon/+/1447
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/kubernetes/clusternet/clusternet.go b/metropolis/node/kubernetes/clusternet/clusternet.go
index 3cf2535..3c86361 100644
--- a/metropolis/node/kubernetes/clusternet/clusternet.go
+++ b/metropolis/node/kubernetes/clusternet/clusternet.go
@@ -247,6 +247,9 @@
 	}
 
 	nodeInformer := s.InformerFactory.Core().V1().Nodes()
+	nodeInformer.Informer().SetWatchErrorHandler(func(_ *cache.Reflector, err error) {
+		supervisor.Logger(ctx).Errorf("node informer watch error: %v", err)
+	})
 	nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
 		AddFunc: func(new interface{}) {
 			newNode, ok := new.(*corev1.Node)
diff --git a/metropolis/node/kubernetes/nfproxy/BUILD.bazel b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
index e8dce41..539516a 100644
--- a/metropolis/node/kubernetes/nfproxy/BUILD.bazel
+++ b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
@@ -17,6 +17,7 @@
         "@io_k8s_client_go//informers",
         "@io_k8s_client_go//kubernetes",
         "@io_k8s_client_go//kubernetes/scheme",
+        "@io_k8s_client_go//tools/cache",
         "@io_k8s_client_go//tools/record",
     ],
 )
diff --git a/metropolis/node/kubernetes/nfproxy/nfproxy.go b/metropolis/node/kubernetes/nfproxy/nfproxy.go
index 5fcc5b5..c07b291 100644
--- a/metropolis/node/kubernetes/nfproxy/nfproxy.go
+++ b/metropolis/node/kubernetes/nfproxy/nfproxy.go
@@ -37,6 +37,7 @@
 	kubeinformers "k8s.io/client-go/informers"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/kubernetes/scheme"
+	"k8s.io/client-go/tools/cache"
 	"k8s.io/client-go/tools/record"
 
 	"source.monogon.dev/metropolis/pkg/supervisor"
@@ -90,8 +91,17 @@
 			options.LabelSelector = labelSelector.String()
 		}))
 
-	svcController := controller.NewServiceController(nfproxy, s.ClientSet, kubeInformerFactory.Core().V1().Services())
-	ep := controller.NewEndpointSliceController(nfproxy, s.ClientSet, kubeInformerFactory.Discovery().V1beta1().EndpointSlices())
+	endpointSlicesInformer := kubeInformerFactory.Discovery().V1beta1().EndpointSlices()
+	endpointSlicesInformer.Informer().SetWatchErrorHandler(func(_ *cache.Reflector, err error) {
+		supervisor.Logger(ctx).Errorf("endpoint slices watch error: %v", err)
+	})
+	servicesInformer := kubeInformerFactory.Core().V1().Services()
+	servicesInformer.Informer().SetWatchErrorHandler(func(_ *cache.Reflector, err error) {
+		supervisor.Logger(ctx).Errorf("service informer watch error: %v", err)
+	})
+
+	svcController := controller.NewServiceController(nfproxy, s.ClientSet, servicesInformer)
+	ep := controller.NewEndpointSliceController(nfproxy, s.ClientSet, endpointSlicesInformer)
 	kubeInformerFactory.Start(ctx.Done())
 
 	if err = svcController.Start(ctx.Done()); err != nil {