mirror of https://github.com/k3s-io/k3s.git
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
parent
367c38b49e
commit
a666b7905c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue