@@ -19,9 +19,12 @@ package main
1919import (
2020 "crypto/tls"
2121 "flag"
22+ "fmt"
2223 "log/slog"
2324 "os"
2425
26+ "sigs.k8s.io/controller-runtime/pkg/manager"
27+
2528 "github.com/go-logr/logr"
2629 _ "k8s.io/client-go/plugin/pkg/client/auth"
2730
@@ -32,7 +35,6 @@ import (
3235 "sigs.k8s.io/controller-runtime/pkg/healthz"
3336 "sigs.k8s.io/controller-runtime/pkg/metrics/filters"
3437 metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
35- "sigs.k8s.io/controller-runtime/pkg/webhook"
3638
3739 securityv1alpha1 "secuity.rancher.io/network-enforcer/api/v1alpha1"
3840 backendkubernetes "secuity.rancher.io/network-enforcer/internal/backend/kubernetes"
@@ -42,139 +44,135 @@ import (
4244 // +kubebuilder:scaffold:imports
4345)
4446
45- var (
46- scheme = runtime .NewScheme ()
47- setupLog = ctrl .Log .WithName ("setup" )
48- )
49-
50- func init () {
51- utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
52- utilruntime .Must (securityv1alpha1 .AddToScheme (scheme ))
53- // +kubebuilder:scaffold:scheme
47+ type config struct {
48+ metricsAddr string
49+ metricsCertPath string
50+ metricsCertName string
51+ metricsCertKey string
52+ enableLeaderElection bool
53+ probeAddr string
54+ secureMetrics bool
55+ enableHTTP2 bool
56+ otlpPort int
57+ tlsOpts []func (* tls.Config )
5458}
5559
56- func main () {
57- var metricsAddr string
58- var metricsCertPath , metricsCertName , metricsCertKey string
59- var webhookCertPath , webhookCertName , webhookCertKey string
60- var enableLeaderElection bool
61- var probeAddr string
62- var secureMetrics bool
63- var enableHTTP2 bool
64- var otlpPort int
65- var tlsOpts []func (* tls.Config )
66- flag .StringVar (& metricsAddr , "metrics-bind-address" , "0" , "The address the metrics endpoint binds to. " +
67- "Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service." )
68- flag .StringVar (& probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
69- flag .BoolVar (& enableLeaderElection , "leader-elect" , false ,
70- "Enable leader election for controller manager. " +
71- "Enabling this will ensure there is only one active controller manager." )
72- flag .BoolVar (& secureMetrics , "metrics-secure" , true ,
73- "If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead." )
74- flag .StringVar (& webhookCertPath , "webhook-cert-path" , "" , "The directory that contains the webhook certificate." )
75- flag .StringVar (& webhookCertName , "webhook-cert-name" , "tls.crt" , "The name of the webhook certificate file." )
76- flag .StringVar (& webhookCertKey , "webhook-cert-key" , "tls.key" , "The name of the webhook key file." )
77- flag .StringVar (& metricsCertPath , "metrics-cert-path" , "" ,
78- "The directory that contains the metrics server certificate." )
79- flag .StringVar (& metricsCertName , "metrics-cert-name" , "tls.crt" , "The name of the metrics server certificate file." )
80- flag .StringVar (& metricsCertKey , "metrics-cert-key" , "tls.key" , "The name of the metrics server key file." )
81- flag .BoolVar (& enableHTTP2 , "enable-http2" , false ,
82- "If set, HTTP/2 will be enabled for the metrics and webhook servers" )
83- flag .IntVar (& otlpPort , "otlp-port" , 4317 , "The port the OTLP gRPC receiver listens on." )
84- flag .Parse ()
85-
86- slogHandler := slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {Level : slog .LevelInfo })
87- slogger := slog .New (slogHandler ).With ("component" , "agent" )
88- slog .SetDefault (slogger )
89- ctrl .SetLogger (logr .FromSlogHandler (slogger .Handler ()))
90-
60+ func newControllerManager (conf * config ) (manager.Manager , error ) {
9161 // Mitigate HTTP/2 Stream Cancellation / Rapid Reset CVEs.
9262 disableHTTP2 := func (c * tls.Config ) {
9363 c .NextProtos = []string {"http/1.1" }
9464 }
9565
96- if ! enableHTTP2 {
97- tlsOpts = append (tlsOpts , disableHTTP2 )
66+ if ! conf . enableHTTP2 {
67+ conf . tlsOpts = append (conf . tlsOpts , disableHTTP2 )
9868 }
9969
100- webhookServerOptions := webhook.Options {
101- TLSOpts : tlsOpts ,
102- }
103-
104- if len (webhookCertPath ) > 0 {
105- webhookServerOptions .CertDir = webhookCertPath
106- webhookServerOptions .CertName = webhookCertName
107- webhookServerOptions .KeyName = webhookCertKey
108- }
109-
110- webhookServer := webhook .NewServer (webhookServerOptions )
111-
11270 metricsServerOptions := metricsserver.Options {
113- BindAddress : metricsAddr ,
114- SecureServing : secureMetrics ,
115- TLSOpts : tlsOpts ,
71+ BindAddress : conf . metricsAddr ,
72+ SecureServing : conf . secureMetrics ,
73+ TLSOpts : conf . tlsOpts ,
11674 }
11775
118- if secureMetrics {
76+ if conf . secureMetrics {
11977 metricsServerOptions .FilterProvider = filters .WithAuthenticationAndAuthorization
12078 }
12179
122- if len (metricsCertPath ) > 0 {
123- metricsServerOptions .CertDir = metricsCertPath
124- metricsServerOptions .CertName = metricsCertName
125- metricsServerOptions .KeyName = metricsCertKey
80+ if len (conf . metricsCertPath ) > 0 {
81+ metricsServerOptions .CertDir = conf . metricsCertPath
82+ metricsServerOptions .CertName = conf . metricsCertName
83+ metricsServerOptions .KeyName = conf . metricsCertKey
12684 }
12785
128- mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
86+ scheme := runtime .NewScheme ()
87+ utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
88+ utilruntime .Must (securityv1alpha1 .AddToScheme (scheme ))
89+ controllerOptions := ctrl.Options {
12990 Scheme : scheme ,
13091 Metrics : metricsServerOptions ,
131- WebhookServer : webhookServer ,
132- HealthProbeBindAddress : probeAddr ,
133- LeaderElection : enableLeaderElection ,
92+ HealthProbeBindAddress : conf .probeAddr ,
93+ LeaderElection : conf .enableLeaderElection ,
13494 LeaderElectionID : "6163c1ee.security.rancher.io" ,
135- })
95+ }
96+ mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), controllerOptions )
13697 if err != nil {
137- setupLog .Error (err , "unable to start manager" )
138- os .Exit (1 )
98+ return nil , fmt .Errorf ("unable to start manager: %w" , err )
99+ }
100+ return mgr , nil
101+ }
102+
103+ func run (logger * slog.Logger , conf * config ) error {
104+ mgr , err := newControllerManager (conf )
105+ if err != nil {
106+ return fmt .Errorf ("unable to create controller manager: %w" , err )
139107 }
140108
141109 store := topology .NewStore ()
142110
143- receiver := flowcollector .NewReceiver (store , otlpPort , slogger )
144- if err : = mgr .Add (receiver ); err != nil {
145- setupLog . Error ( err , "add OTLP receiver" )
146- os . Exit ( 1 )
111+ receiver := flowcollector .NewReceiver (store , conf . otlpPort , logger )
112+ err = mgr .Add (receiver )
113+ if err != nil {
114+ return fmt . Errorf ( "unable to add OTLP receiver to manager: %w" , err )
147115 }
148116
149- scanner := controller .NewTopologyScanner (mgr .GetClient (), store , slogger )
150- if err : = mgr .Add (scanner ); err != nil {
151- setupLog . Error ( err , "add topology scanner" )
152- os . Exit ( 1 )
117+ scanner := controller .NewTopologyScanner (mgr .GetClient (), store , logger )
118+ err = mgr .Add (scanner )
119+ if err != nil {
120+ return fmt . Errorf ( "unable to add topology scanner to manager: %w" , err )
153121 }
154122
155- if err : = (& controller.EnforcementReconciler {
123+ err = (& controller.EnforcementReconciler {
156124 Client : mgr .GetClient (),
157125 Scheme : mgr .GetScheme (),
158126 Backend : & backendkubernetes.Backend {},
159- }).SetupWithManager (mgr ); err != nil {
160- setupLog . Error ( err , "setup controller" , "controller" , "Enforcement" )
161- os . Exit ( 1 )
127+ }).SetupWithManager (mgr )
128+ if err != nil {
129+ return fmt . Errorf ( "unable to setup Enforcement controller: %w" , err )
162130 }
163131
164132 // +kubebuilder:scaffold:builder
165133
166- if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
167- setupLog .Error (err , "healthz check" )
168- os .Exit (1 )
134+ if err = mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
135+ return fmt .Errorf ("unable to add healthz check: %w" , err )
169136 }
170- if err := mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
171- setupLog .Error (err , "readyz check" )
172- os .Exit (1 )
137+ if err = mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
138+ return fmt .Errorf ("unable to add readyz check: %w" , err )
173139 }
174140
175- setupLog .Info ("starting manager" )
176- if err := mgr .Start (ctrl .SetupSignalHandler ()); err != nil {
177- setupLog .Error (err , "manager exited" )
141+ logger .Info ("starting manager" )
142+ return mgr .Start (ctrl .SetupSignalHandler ())
143+ }
144+
145+ func main () {
146+ conf := & config {}
147+ flag .StringVar (& conf .metricsAddr , "metrics-bind-address" , "0" , "The address the metrics endpoint binds to. " +
148+ "Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service." )
149+ flag .StringVar (& conf .probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
150+ flag .BoolVar (& conf .enableLeaderElection , "leader-elect" , false ,
151+ "Enable leader election for controller manager. " +
152+ "Enabling this will ensure there is only one active controller manager." )
153+ flag .BoolVar (& conf .secureMetrics , "metrics-secure" , true ,
154+ "If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead." )
155+ flag .StringVar (& conf .metricsCertPath , "metrics-cert-path" , "" ,
156+ "The directory that contains the metrics server certificate." )
157+ flag .StringVar (
158+ & conf .metricsCertName ,
159+ "metrics-cert-name" ,
160+ "tls.crt" ,
161+ "The name of the metrics server certificate file." ,
162+ )
163+ flag .StringVar (& conf .metricsCertKey , "metrics-cert-key" , "tls.key" , "The name of the metrics server key file." )
164+ flag .BoolVar (& conf .enableHTTP2 , "enable-http2" , false ,
165+ "If set, HTTP/2 will be enabled for the metrics server" )
166+ flag .IntVar (& conf .otlpPort , "otlp-port" , 4317 , "The port the OTLP gRPC receiver listens on." )
167+ flag .Parse ()
168+
169+ slogHandler := slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {Level : slog .LevelInfo })
170+ slogger := slog .New (slogHandler ).With ("component" , "agent" )
171+ slog .SetDefault (slogger )
172+ ctrl .SetLogger (logr .FromSlogHandler (slogger .Handler ()))
173+
174+ if err := run (slogger , conf ); err != nil {
175+ slogger .Error ("failed to run" , "error" , err )
178176 os .Exit (1 )
179177 }
180178}
0 commit comments