Add context to controller event recorders

Fixes issue where RKE2 event recorder events were not logged to console due to lack of logging context.

Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
pull/13800/head
Brad Davidson 2026-03-25 05:23:31 +00:00 committed by Brad Davidson
parent 367c38b49e
commit a666b7905c
13 changed files with 32 additions and 14 deletions

View File

@ -50,7 +50,7 @@ func Setup(ctx context.Context, nodeConfig *daemonconfig.Node, dataDir string) e
return err
}
recorder := util.BuildControllerEventRecorder(client, controllerName, metav1.NamespaceDefault)
recorder := util.BuildControllerEventRecorder(ctx, client, controllerName, metav1.NamespaceDefault)
// This is consistent with events attached to the node generated by the kubelet
// https://github.com/kubernetes/kubernetes/blob/612130dd2f4188db839ea5c2dea07a96b0ad8d1c/pkg/kubelet/kubelet.go#L479-L485

View File

@ -49,7 +49,7 @@ func Run(clx *cli.Context) (rerr error) {
}
klog.EnableContextualLogging(true)
ctx := klog.NewContext(signals.SetupSignalContext(), logger.NewLogrusSink(nil).AsLogr())
ctx := logger.NewContext(signals.SetupSignalContext(), version.Program)
wg := &sync.WaitGroup{}
// If exiting due to an error, ensure that contexts are cancelled so that the

View File

@ -11,7 +11,6 @@ import (
"time"
systemd "github.com/coreos/go-systemd/v22/daemon"
"github.com/go-logr/logr"
"github.com/k3s-io/k3s/pkg/agent"
"github.com/k3s-io/k3s/pkg/agent/https"
"github.com/k3s-io/k3s/pkg/agent/loadbalancer"
@ -79,7 +78,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
}
klog.EnableContextualLogging(true)
ctx := logr.NewContext(signals.SetupSignalContext(), logger.NewLogrusSink(nil).AsLogr())
ctx := logger.NewContext(signals.SetupSignalContext(), version.Program)
wg := &sync.WaitGroup{}
// If exiting due to an error, ensure that contexts are cancelled so that the

View File

@ -6,6 +6,7 @@ import (
"io"
"github.com/k3s-io/k3s/pkg/util"
"github.com/k3s-io/k3s/pkg/util/logger"
"github.com/k3s-io/k3s/pkg/version"
"github.com/rancher/wrangler/v3/pkg/apply"
"github.com/rancher/wrangler/v3/pkg/generated/controllers/apps"
@ -82,13 +83,13 @@ func init() {
}
func (k *k3s) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) {
ctx := wait.ContextForChannel(stop)
ctx := logger.NewContext(wait.ContextForChannel(stop), controllerName)
config := clientBuilder.ConfigOrDie(controllerName)
k.client = kubernetes.NewForConfigOrDie(config)
if k.LBEnabled {
// Wrangler controller and caches are only needed if the load balancer controller is enabled.
k.recorder = util.BuildControllerEventRecorder(k.client, controllerName, meta.NamespaceAll)
k.recorder = util.BuildControllerEventRecorder(ctx, k.client, controllerName, meta.NamespaceAll)
coreFactory := core.NewFactoryFromConfigOrDie(config)
k.nodeCache = coreFactory.Core().V1().Node().Cache()

View File

@ -20,6 +20,7 @@ import (
"github.com/k3s-io/k3s/pkg/agent/util"
pkgutil "github.com/k3s-io/k3s/pkg/util"
"github.com/k3s-io/k3s/pkg/util/errors"
"github.com/k3s-io/k3s/pkg/util/logger"
"github.com/rancher/wrangler/v3/pkg/apply"
"github.com/rancher/wrangler/v3/pkg/kv"
"github.com/rancher/wrangler/v3/pkg/objectset"
@ -83,7 +84,7 @@ type watcher struct {
// start calls listFiles at regular intervals to trigger application of manifests that have changed on disk.
func (w *watcher) start(ctx context.Context, client kubernetes.Interface) {
w.recorder = pkgutil.BuildControllerEventRecorder(client, ControllerName, metav1.NamespaceSystem)
w.recorder = pkgutil.BuildControllerEventRecorder(logger.NewContext(ctx, ControllerName), client, ControllerName, metav1.NamespaceSystem)
force := true
for {
if err := w.listFiles(force); err == nil {

View File

@ -82,7 +82,7 @@ func NewContext(ctx context.Context, config *Config) (*Context, error) {
Discovery: discovery.NewFactoryFromConfigOrDie(restConfig),
Helm: hf,
Event: util.BuildControllerEventRecorder(k8s, version.Program+"-supervisor", metav1.NamespaceAll),
Event: util.BuildControllerEventRecorder(ctx, k8s, version.Program+"-supervisor", metav1.NamespaceAll),
K8s: k8s,
Ext: ext,
}

View File

@ -1747,7 +1747,7 @@ func getMockedControl(t *testing.T) (*config.Control, context.CancelFunc) {
control.Runtime.K8s = k8s
// create event recorder
control.Runtime.Event = util.BuildControllerEventRecorder(control.Runtime.K8s, version.Program+"-supervisor", metav1.NamespaceAll)
control.Runtime.Event = util.BuildControllerEventRecorder(ctx, control.Runtime.K8s, version.Program+"-supervisor", metav1.NamespaceAll)
// start the node password controller
err = nodepassword.Register(ctx, control.Runtime.K8s, coreFactory.Core().V1().Secret(), coreFactory.Core().V1().Node())

View File

@ -453,7 +453,7 @@ func updateSecrets(ctx context.Context, control *config.Control, nodeName string
}
// For backwards compatibility with the old controller, we use an event recorder instead of logrus
recorder := util.BuildControllerEventRecorder(k8s, "secrets-reencrypt", metav1.NamespaceDefault)
recorder := util.BuildControllerEventRecorder(ctx, k8s, "secrets-reencrypt", metav1.NamespaceDefault)
secretPager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) {
return k8s.CoreV1().Secrets(metav1.NamespaceAll).List(ctx, opts)

View File

@ -250,7 +250,7 @@ func coreControllers(ctx context.Context, sc *Context, config *Config) error {
strconv.Itoa(config.ControlConfig.HTTPSPort),
k8s,
apply,
util.BuildControllerEventRecorder(k8s, helmcommon.Name, metav1.NamespaceAll),
util.BuildControllerEventRecorder(ctx, k8s, helmcommon.Name, metav1.NamespaceAll),
helm.V1().HelmChart(),
helm.V1().HelmChart().Cache(),
helm.V1().HelmChartConfig(),

View File

@ -154,7 +154,7 @@ func (c *Config) Start(ctx context.Context, nodeConfig *config.Node, criReadyCha
c.ExternalAddress, c.RegistryPort, registries)
// set up the various logging logging frameworks
ctx = logr.NewContext(ctx, logger.NewLogrusSink(nil).AsLogr().WithName("spegel"))
ctx = logger.NewContext(ctx, "spegel")
level := ipfslog.LevelInfo
if logrus.IsLevelEnabled(logrus.DebugLevel) {
level = ipfslog.LevelDebug

View File

@ -249,9 +249,9 @@ func subjectAccessReview(authClient *authorizationv1client.AuthorizationV1Client
}
}
func BuildControllerEventRecorder(k8s clientset.Interface, controllerName, namespace string) record.EventRecorder {
func BuildControllerEventRecorder(ctx context.Context, k8s clientset.Interface, controllerName, namespace string) record.EventRecorder {
logrus.Infof("Creating %s event broadcaster", controllerName)
eventBroadcaster := record.NewBroadcaster()
eventBroadcaster := record.NewBroadcaster(record.WithContext(ctx))
eventBroadcaster.StartStructuredLogging(0)
eventBroadcaster.StartRecordingToSink(&coregetter.EventSinkImpl{Interface: k8s.CoreV1().Events(namespace)})
nodeName := os.Getenv("NODE_NAME")

View File

@ -3,6 +3,8 @@ package util
import (
"context"
"time"
"github.com/go-logr/logr"
)
const DefaultContextDelay = 5 * time.Second
@ -11,6 +13,9 @@ const DefaultContextDelay = 5 * time.Second
// with a delay after the parent context has been cancelled.
func DelayCancel(ctx context.Context, delay time.Duration) context.Context {
dctx, dcancel := context.WithCancel(context.Background())
if l, err := logr.FromContext(ctx); err == nil {
dctx = logr.NewContext(dctx, l)
}
go func() {
<-ctx.Done()
time.Sleep(delay)

View File

@ -1,6 +1,7 @@
package logger
import (
"context"
"fmt"
"github.com/go-logr/logr"
@ -87,3 +88,14 @@ func (ls *LogrusSink) WithName(name string) logr.LogSink {
}
return ls.WithValues("logger", name)
}
func NewContext(ctx context.Context, name string) context.Context {
logger, err := logr.FromContext(ctx)
if err != nil {
logger = NewLogrusSink(nil).AsLogr()
}
if name != "" {
logger = logger.WithName(name)
}
return logr.NewContext(ctx, logger)
}