-
Notifications
You must be signed in to change notification settings - Fork 462
/
app.go
122 lines (103 loc) · 3.54 KB
/
app.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package app
import (
"context"
"fmt"
"net"
"net/http"
"os"
goruntime "runtime"
"strconv"
"time"
"github.com/go-logr/logr"
"github.com/spf13/cobra"
"k8s.io/component-base/version/verflag"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/manager"
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
controllerwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
"github.com/gardener/gardener/cmd/utils"
"github.com/gardener/gardener/pkg/admissioncontroller/apis/config"
"github.com/gardener/gardener/pkg/admissioncontroller/webhook"
"github.com/gardener/gardener/pkg/client/kubernetes"
"github.com/gardener/gardener/pkg/controllerutils/routes"
gardenerhealthz "github.com/gardener/gardener/pkg/healthz"
)
// Name is a const for the name of this component.
const Name = "gardener-admission-controller"
// NewCommand creates a new cobra.Command for running gardener-admission-controller.
func NewCommand() *cobra.Command {
opts := &options{}
cmd := &cobra.Command{
Use: Name,
Short: "Launch the " + Name,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
log, err := utils.InitRun(cmd, opts, Name)
if err != nil {
return err
}
return run(cmd.Context(), log, opts.config)
},
}
flags := cmd.Flags()
verflag.AddFlags(flags)
opts.addFlags(flags)
return cmd
}
func run(ctx context.Context, log logr.Logger, cfg *config.AdmissionControllerConfiguration) error {
log.Info("Getting rest config")
if kubeconfig := os.Getenv("KUBECONFIG"); kubeconfig != "" {
cfg.GardenClientConnection.Kubeconfig = kubeconfig
}
restConfig, err := kubernetes.RESTConfigFromClientConnectionConfiguration(&cfg.GardenClientConnection, nil, kubernetes.AuthTokenFile)
if err != nil {
return err
}
var extraHandlers map[string]http.Handler
if cfg.Debugging != nil && cfg.Debugging.EnableProfiling {
extraHandlers = routes.ProfilingHandlers
if cfg.Debugging.EnableContentionProfiling {
goruntime.SetBlockProfileRate(1)
}
}
log.Info("Setting up manager")
mgr, err := manager.New(restConfig, manager.Options{
Logger: log,
Scheme: kubernetes.GardenScheme,
GracefulShutdownTimeout: ptr.To(5 * time.Second),
HealthProbeBindAddress: net.JoinHostPort(cfg.Server.HealthProbes.BindAddress, strconv.Itoa(cfg.Server.HealthProbes.Port)),
Metrics: metricsserver.Options{
BindAddress: net.JoinHostPort(cfg.Server.Metrics.BindAddress, strconv.Itoa(cfg.Server.Metrics.Port)),
ExtraHandlers: extraHandlers,
},
LeaderElection: false,
WebhookServer: controllerwebhook.NewServer(controllerwebhook.Options{
Host: cfg.Server.Webhooks.BindAddress,
Port: cfg.Server.Webhooks.Port,
CertDir: cfg.Server.Webhooks.TLS.ServerCertDir,
}),
})
if err != nil {
return err
}
log.Info("Setting up health check endpoints")
if err := mgr.AddHealthzCheck("ping", healthz.Ping); err != nil {
return err
}
if err := mgr.AddReadyzCheck("informer-sync", gardenerhealthz.NewCacheSyncHealthz(mgr.GetCache())); err != nil {
return err
}
if err := mgr.AddReadyzCheck("webhook-server", mgr.GetWebhookServer().StartedChecker()); err != nil {
return err
}
log.Info("Adding webhook handlers to manager")
if err := webhook.AddToManager(ctx, mgr, cfg); err != nil {
return fmt.Errorf("failed adding webhook handlers to manager: %w", err)
}
log.Info("Starting manager")
return mgr.Start(ctx)
}