From 994d22595fef24defd42aeeaebb98c12e651f12e Mon Sep 17 00:00:00 2001 From: Pierluigi Lenoci Date: Sat, 28 Mar 2026 23:18:45 +0100 Subject: [PATCH 1/2] fix: honor --stderrthreshold flag when --logtostderr is enabled All five entry points (vsphere, machineset, machine-api-operator start/version, nodelink-controller) set logtostderr=true, which causes klog's legacy behavior to silently ignore the stderrthreshold flag. This opts into the fixed behavior introduced in klog v2.130.0 by setting legacy_stderr_threshold_behavior=false in all entry points. See: https://github.com/kubernetes/klog/issues/432 Signed-off-by: Pierluigi Lenoci --- cmd/machine-api-operator/start.go | 8 ++++++++ cmd/machine-api-operator/version.go | 8 ++++++++ cmd/machineset/main.go | 8 ++++++++ cmd/nodelink-controller/main.go | 8 ++++++++ cmd/vsphere/main.go | 8 ++++++++ go.mod | 2 +- go.sum | 4 ++-- 7 files changed, 43 insertions(+), 3 deletions(-) diff --git a/cmd/machine-api-operator/start.go b/cmd/machine-api-operator/start.go index dce09c53b7..42604da81a 100644 --- a/cmd/machine-api-operator/start.go +++ b/cmd/machine-api-operator/start.go @@ -69,6 +69,14 @@ func runStartCmd(cmd *cobra.Command, args []string) error { if err := flag.Set("logtostderr", "true"); err != nil { return fmt.Errorf("failed to set logtostderr flag: %v", err) } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + return fmt.Errorf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + return fmt.Errorf("failed to set stderrthreshold flag: %v", err) + } // To help debugging, immediately log version klog.Infof("Version: %+v", version.Version) diff --git a/cmd/machine-api-operator/version.go b/cmd/machine-api-operator/version.go index 445a35cdd4..ae870a2716 100644 --- a/cmd/machine-api-operator/version.go +++ b/cmd/machine-api-operator/version.go @@ -26,6 +26,14 @@ func runVersionCmd(cmd *cobra.Command, args []string) { if err := flag.Set("logtostderr", "true"); err != nil { klog.Fatalf("failed to set logtostderr flag: %v", err) } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + klog.Fatalf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + klog.Fatalf("failed to set stderrthreshold flag: %v", err) + } flag.Parse() program := "MachineAPIOperator" diff --git a/cmd/machineset/main.go b/cmd/machineset/main.go index 0eac8e9b6d..74da981103 100644 --- a/cmd/machineset/main.go +++ b/cmd/machineset/main.go @@ -73,6 +73,14 @@ func main() { if err := flag.Set("logtostderr", "true"); err != nil { klog.Fatalf("failed to set logtostderr flag: %v", err) } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + klog.Fatalf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + klog.Fatalf("failed to set stderrthreshold flag: %v", err) + } watchNamespace := flag.String("namespace", "", "Namespace that the controller watches to reconcile cluster-api objects. If unspecified, the controller watches for cluster-api objects across all namespaces.") metricsAddress := flag.String("metrics-bind-address", metrics.DefaultMachineSetMetricsAddress, "Address for hosting metrics") diff --git a/cmd/nodelink-controller/main.go b/cmd/nodelink-controller/main.go index e45be8f7a6..48b4c474bd 100644 --- a/cmd/nodelink-controller/main.go +++ b/cmd/nodelink-controller/main.go @@ -67,6 +67,14 @@ func main() { if err := flag.Set("logtostderr", "true"); err != nil { klog.Fatalf("failed to set logtostderr flag: %v", err) } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + klog.Fatalf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + klog.Fatalf("failed to set stderrthreshold flag: %v", err) + } flag.Parse() // Get a config to talk to the apiserver diff --git a/cmd/vsphere/main.go b/cmd/vsphere/main.go index 92dcfce10e..1c4b656ae4 100644 --- a/cmd/vsphere/main.go +++ b/cmd/vsphere/main.go @@ -53,6 +53,14 @@ func main() { if err := flag.Set("logtostderr", "true"); err != nil { klog.Fatalf("failed to set logtostderr flag: %v", err) } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + klog.Fatalf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + klog.Fatalf("failed to set stderrthreshold flag: %v", err) + } watchNamespace := flag.String( "namespace", diff --git a/go.mod b/go.mod index 83136f48c8..8c5665c62a 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( k8s.io/cri-client v0.35.1 // indirect k8s.io/csi-translation-lib v0.35.1 // indirect k8s.io/dynamic-resource-allocation v0.35.1 // indirect - k8s.io/klog/v2 v2.130.1 + k8s.io/klog/v2 v2.140.0 k8s.io/kube-scheduler v0.35.1 // indirect k8s.io/kubectl v0.35.1 k8s.io/kubernetes v1.35.1 diff --git a/go.sum b/go.sum index b5fc782063..193a66ae25 100644 --- a/go.sum +++ b/go.sum @@ -921,8 +921,8 @@ k8s.io/csi-translation-lib v0.35.1 h1:BMYzAj4Oq60lj5m5nrieRdQ8ij0WUUqkD3QNmewgVD k8s.io/csi-translation-lib v0.35.1/go.mod h1:NcQZssPcUi6Fuax5qj70Iz4gAQzbpW5i96Rw+DeTQg8= k8s.io/dynamic-resource-allocation v0.35.1 h1:mHQC28BFjGrCZMOnGLSv8BeXG4nBg0NQ8CpAYxbu9dk= k8s.io/dynamic-resource-allocation v0.35.1/go.mod h1:84qslMnScW6I3QYAHQQm2h3btRp7xsadlxNFY5OSztQ= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/kms v0.35.1 h1:kjv2r9g1mY7uL+l1RhyAZvWVZIA/4qIfBHXyjFGLRhU= k8s.io/kms v0.35.1/go.mod h1:VT+4ekZAdrZDMgShK37vvlyHUVhwI9t/9tvh0AyCWmQ= k8s.io/kube-aggregator v0.35.1 h1:LN+btMJ3yp7biqVgT/0LF6SKIKLyfPU0R+JJ1mycs2I= From b66c2e66cc7c512ce24b52c32d786d393cf33cca Mon Sep 17 00:00:00 2001 From: Pierluigi Lenoci Date: Mon, 30 Mar 2026 22:24:06 +0200 Subject: [PATCH 2/2] fix: add stderrthreshold flags to machine-healthcheck binary The machine-healthcheck binary was missing the logtostderr and stderrthreshold flag.Set calls that were added to all other binaries. Signed-off-by: Pierluigi Lenoci --- cmd/machine-healthcheck/main.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmd/machine-healthcheck/main.go b/cmd/machine-healthcheck/main.go index d8dd2fa3e1..49cb9c6843 100644 --- a/cmd/machine-healthcheck/main.go +++ b/cmd/machine-healthcheck/main.go @@ -79,6 +79,17 @@ func main() { ctrl.SetLogger(klog.NewKlogr()) klog.InitFlags(nil) + if err := flag.Set("logtostderr", "true"); err != nil { + klog.Fatalf("failed to set logtostderr flag: %v", err) + } + // Opt into the fixed klog behavior so the --stderrthreshold flag is honored + // even when --logtostderr is enabled. See https://github.com/kubernetes/klog/issues/432 + if err := flag.Set("legacy_stderr_threshold_behavior", "false"); err != nil { + klog.Fatalf("failed to set legacy_stderr_threshold_behavior flag: %v", err) + } + if err := flag.Set("stderrthreshold", "INFO"); err != nil { + klog.Fatalf("failed to set stderrthreshold flag: %v", err) + } flag.Parse() printVersion()