Skip to content

Commit 343ffda

Browse files
authored
Enable JSON logging for Karmada controller manager (#6409)
Signed-off-by: Joe Nathan Abellard <[email protected]>
1 parent ff813d9 commit 343ffda

File tree

4 files changed

+63
-29
lines changed

4 files changed

+63
-29
lines changed

artifacts/deploy/karmada-controller-manager.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ spec:
4141
- --metrics-bind-address=$(POD_IP):8080
4242
- --health-probe-bind-address=$(POD_IP):10357
4343
- --enable-no-execute-taint-eviction=true
44+
- --logging-format=json
4445
- --v=4
4546
livenessProbe:
4647
httpGet:

cmd/controller-manager/app/controllermanager.go

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"k8s.io/client-go/rest"
3232
"k8s.io/client-go/util/flowcontrol"
3333
cliflag "k8s.io/component-base/cli/flag"
34+
"k8s.io/component-base/logs"
35+
logsv1 "k8s.io/component-base/logs/api/v1"
3436
"k8s.io/component-base/term"
3537
"k8s.io/klog/v2"
3638
resourceclient "k8s.io/metrics/pkg/client/clientset/versioned/typed/metrics/v1beta1"
@@ -97,44 +99,52 @@ import (
9799

98100
// NewControllerManagerCommand creates a *cobra.Command object with default parameters
99101
func NewControllerManagerCommand(ctx context.Context) *cobra.Command {
102+
logConfig := logsv1.NewLoggingConfiguration()
103+
fss := cliflag.NamedFlagSets{}
104+
105+
logsFlagSet := fss.FlagSet("logs")
106+
logs.AddFlags(logsFlagSet, logs.SkipLoggingConfigurationFlags())
107+
logsv1.AddFlags(logConfig, logsFlagSet)
108+
klogflag.Add(logsFlagSet)
109+
110+
genericFlagSet := fss.FlagSet("generic")
111+
// Add the flag(--kubeconfig) that is added by controller-runtime.
112+
// (https://github.com/kubernetes-sigs/controller-runtime/blob/v0.11.1/pkg/client/config/config.go#L39),
113+
// and update the flag usage.
114+
genericFlagSet.AddGoFlagSet(flag.CommandLine)
115+
genericFlagSet.Lookup("kubeconfig").Usage = "Path to karmada control plane kubeconfig file."
100116
opts := options.NewOptions()
117+
opts.AddFlags(genericFlagSet, controllers.ControllerNames(), sets.List(controllersDisabledByDefault))
101118

102119
cmd := &cobra.Command{
103120
Use: names.KarmadaControllerManagerComponentName,
104121
Long: `The karmada-controller-manager runs various controllers.
105-
The controllers watch Karmada objects and then talk to the underlying clusters' API servers
106-
to create regular Kubernetes resources.`,
122+
The controllers watch Karmada objects and then talk to the underlying
123+
clusters' API servers to create regular Kubernetes resources.`,
124+
125+
PersistentPreRunE: func(_ *cobra.Command, _ []string) error {
126+
if err := logsv1.ValidateAndApply(logConfig, features.FeatureGate); err != nil {
127+
return err
128+
}
129+
logs.InitLogs()
130+
return nil
131+
},
132+
107133
RunE: func(_ *cobra.Command, _ []string) error {
108-
// validate options
109134
if errs := opts.Validate(); len(errs) != 0 {
110135
return errs.ToAggregate()
111136
}
112-
113137
return Run(ctx, opts)
114138
},
115139
}
116140

117-
fss := cliflag.NamedFlagSets{}
118-
119-
// Set generic flags
120-
genericFlagSet := fss.FlagSet("generic")
121-
// Add the flag(--kubeconfig) that is added by controller-runtime
122-
// (https://github.com/kubernetes-sigs/controller-runtime/blob/v0.11.1/pkg/client/config/config.go#L39),
123-
// and update the flag usage.
124-
genericFlagSet.AddGoFlagSet(flag.CommandLine)
125-
genericFlagSet.Lookup("kubeconfig").Usage = "Path to karmada control plane kubeconfig file."
126-
opts.AddFlags(genericFlagSet, controllers.ControllerNames(), sets.List(controllersDisabledByDefault))
127-
128-
// Set klog flags
129-
logsFlagSet := fss.FlagSet("logs")
130-
klogflag.Add(logsFlagSet)
131-
132141
cmd.AddCommand(sharedcommand.NewCmdVersion(names.KarmadaControllerManagerComponentName))
133142
cmd.Flags().AddFlagSet(genericFlagSet)
134143
cmd.Flags().AddFlagSet(logsFlagSet)
135144

136145
cols, _, _ := term.TerminalSize(cmd.OutOrStdout())
137146
sharedcli.SetUsageAndHelpFunc(cmd, fss, cols)
147+
138148
return cmd
139149
}
140150

cmd/controller-manager/controller-manager.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,18 @@ import (
2020
"os"
2121

2222
"k8s.io/component-base/cli"
23-
_ "k8s.io/component-base/logs/json/register" // for JSON log format registration
24-
"k8s.io/klog/v2"
23+
"k8s.io/component-base/logs"
24+
_ "k8s.io/component-base/logs/json/register" // To enable JSON log format support
2525
controllerruntime "sigs.k8s.io/controller-runtime"
2626

2727
"github.com/karmada-io/karmada/cmd/controller-manager/app"
2828
)
2929

3030
func main() {
3131
ctx := controllerruntime.SetupSignalHandler()
32-
// Starting from version 0.15.0, controller-runtime expects its consumers to set a logger through log.SetLogger.
33-
// If SetLogger is not called within the first 30 seconds of a binaries lifetime, it will get
34-
// set to a NullLogSink and report an error. Here's to silence the "log.SetLogger(...) was never called; logs will not be displayed" error
35-
// by setting a logger through log.SetLogger.
36-
// More info refer to: https://github.com/karmada-io/karmada/pull/4885.
37-
controllerruntime.SetLogger(klog.Background())
3832
cmd := app.NewControllerManagerCommand(ctx)
39-
code := cli.Run(cmd)
40-
os.Exit(code)
33+
exitCode := cli.Run(cmd)
34+
// Ensure any buffered log entries are flushed
35+
logs.FlushLogs()
36+
os.Exit(exitCode)
4137
}

pkg/features/features.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package features
1919
import (
2020
"k8s.io/apimachinery/pkg/util/runtime"
2121
"k8s.io/component-base/featuregate"
22+
logsv1 "k8s.io/component-base/logs/api/v1"
2223
)
2324

2425
const (
@@ -79,6 +80,29 @@ const (
7980
// owner: @mszacillo, @RainbowMango, @zhzhuang-zju, @seanlaii, @liwang0513
8081
// alpha: v1.14
8182
FederatedQuotaEnforcement featuregate.Feature = "FederatedQuotaEnforcement"
83+
84+
// LoggingAlphaOptions allows fine-tuning of experimental, alpha-quality logging options.
85+
// Inherited from Kubernetes. Ref: https://github.com/kubernetes/component-base/blob/release-1.32/logs/api/v1/kube_features.go#L45
86+
//
87+
// owner: @jabellard
88+
// alpha: v1.15
89+
LoggingAlphaOptions = logsv1.LoggingAlphaOptions
90+
91+
// LoggingBetaOptions allows fine-tuning of experimental, beta-quality logging options.
92+
// Inherited from Kubernetes. Ref: https://github.com/kubernetes/component-base/blob/release-1.32/logs/api/v1/kube_features.go#L54
93+
//
94+
// owner: @jabellard
95+
// beta: v1.15
96+
LoggingBetaOptions = logsv1.LoggingBetaOptions
97+
98+
// ContextualLogging enables looking up a logger from a context.Context instead of using
99+
// the global fallback logger and manipulating the logger that is
100+
// used by a call chain.
101+
// Inherited from Kubernetes. Ref: https://github.com/kubernetes/component-base/blob/release-1.32/logs/api/v1/kube_features.go#L32
102+
//
103+
// owner: @jabellard
104+
// beta: v1.15
105+
ContextualLogging = logsv1.ContextualLogging
82106
)
83107

84108
var (
@@ -101,6 +125,9 @@ var (
101125
StatefulFailoverInjection: {Default: false, PreRelease: featuregate.Alpha},
102126
PriorityBasedScheduling: {Default: false, PreRelease: featuregate.Alpha},
103127
FederatedQuotaEnforcement: {Default: false, PreRelease: featuregate.Alpha},
128+
LoggingAlphaOptions: {Default: false, PreRelease: featuregate.Alpha},
129+
LoggingBetaOptions: {Default: true, PreRelease: featuregate.Beta},
130+
ContextualLogging: {Default: true, PreRelease: featuregate.Beta},
104131
}
105132
)
106133

0 commit comments

Comments
 (0)