@@ -17,8 +17,10 @@ import (
1717 "k8s.io/apimachinery/pkg/util/sets"
1818 "k8s.io/apiserver/pkg/server/dynamiccertificates"
1919 "k8s.io/client-go/kubernetes"
20+ "k8s.io/client-go/kubernetes/scheme"
2021 "k8s.io/client-go/rest"
2122 "k8s.io/client-go/tools/cache"
23+ "k8s.io/client-go/tools/record"
2224 "k8s.io/klog/v2"
2325
2426 configv1 "github.com/openshift/api/config/v1"
@@ -281,6 +283,12 @@ func RunMetrics(runContext context.Context, shutdownContext context.Context, lis
281283 clientAuth = tls .RequireAndVerifyClientCert
282284 }
283285
286+ // Log certificate controller events to stdout because the controller is reported to generate invalid events,
287+ // which are rejected by the Kubernetes API server when used with DynamicServingContentFromFiles.
288+ eventBroadcaster := record .NewBroadcaster (record .WithContext (metricsContext ))
289+ eventBroadcaster .StartLogging (klog .Infof )
290+ defer eventBroadcaster .Shutdown ()
291+
284292 // baseTlSConfig is a template passed to servingCertController,
285293 // which generates updated configs via GetConfigForClient callback on each TLS handshake.
286294 // This enables automatic certificate rotation without server restarts.
@@ -290,7 +298,9 @@ func RunMetrics(runContext context.Context, shutdownContext context.Context, lis
290298 clientCA ,
291299 servingContentController ,
292300 nil ,
293- nil ,
301+ record .NewEventRecorderAdapter (
302+ eventBroadcaster .NewRecorder (scheme .Scheme , corev1.EventSource {Component : "cluster-version-operator" }),
303+ ),
294304 )
295305 if err := servingCertController .RunOnce (); err != nil {
296306 return fmt .Errorf ("failed to initialize serving certificate controller: %w" , err )
0 commit comments