diff --git a/go.mod b/go.mod index 1d9dfbd40032..4864ed93cb92 100644 --- a/go.mod +++ b/go.mod @@ -156,6 +156,7 @@ require ( k8s.io/component-helpers v0.26.4 k8s.io/cri-api v0.26.4 k8s.io/klog v1.0.0 + k8s.io/klog/v2 v2.80.1 k8s.io/kubectl v0.25.0 k8s.io/kubernetes v1.26.4 k8s.io/utils v0.0.0-20221107191617-1a15be271d1d @@ -385,7 +386,6 @@ require ( k8s.io/csi-translation-lib v0.0.0 // indirect k8s.io/dynamic-resource-allocation v0.0.0 // indirect k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - k8s.io/klog/v2 v2.80.1 // indirect k8s.io/kms v0.0.0 // indirect k8s.io/kube-aggregator v0.25.4 // indirect k8s.io/kube-controller-manager v0.0.0 // indirect diff --git a/pkg/daemons/executor/embed.go b/pkg/daemons/executor/embed.go index c09dd8277bae..2db37591e788 100644 --- a/pkg/daemons/executor/embed.go +++ b/pkg/daemons/executor/embed.go @@ -5,9 +5,12 @@ package executor import ( "context" + "flag" "net/http" "runtime" "runtime/debug" + "strconv" + "time" "github.com/k3s-io/k3s/pkg/cli/cmds" daemonconfig "github.com/k3s-io/k3s/pkg/daemons/config" @@ -31,6 +34,7 @@ import ( cloudcontrollerconfig "k8s.io/cloud-provider/app/config" ccmopt "k8s.io/cloud-provider/options" cliflag "k8s.io/component-base/cli/flag" + "k8s.io/klog/v2" "k8s.io/kubernetes/cmd/kube-apiserver/app" cmapp "k8s.io/kubernetes/cmd/kube-controller-manager/app" proxy "k8s.io/kubernetes/cmd/kube-proxy/app" @@ -47,6 +51,26 @@ func init() { func (e *Embedded) Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, cfg cmds.Agent) error { e.nodeConfig = nodeConfig + + go func() { + // Ensure that the log verbosity remains set to the configured level by resetting it at 1-second intervals + // for the first 2 minutes that K3s is starting up. This is necessary because each of the Kubernetes + // components will initialize klog and reset the verbosity flag when they are starting. + logCtx, cancel := context.WithTimeout(ctx, time.Second*120) + defer cancel() + + klog.InitFlags(nil) + for { + flag.Set("v", strconv.Itoa(cmds.LogConfig.VLevel)) + + select { + case <-time.After(time.Second): + case <-logCtx.Done(): + return + } + } + }() + return nil }