...
1 package webhook
2
3 import (
4 "context"
5 "os"
6 "os/signal"
7 "syscall"
8 "time"
9
10 "github.com/linkerd/linkerd2/controller/k8s"
11 "github.com/linkerd/linkerd2/pkg/admin"
12 pkgk8s "github.com/linkerd/linkerd2/pkg/k8s"
13 log "github.com/sirupsen/logrus"
14 )
15
16
17 func Launch(
18 ctx context.Context,
19 apiresources []k8s.APIResource,
20 handler Handler,
21 component,
22 metricsAddr string,
23 addr string,
24 kubeconfig string,
25 enablePprof bool,
26 ) {
27 ready := false
28 adminServer := admin.NewServer(metricsAddr, enablePprof, &ready)
29
30 go func() {
31 log.Infof("starting admin server on %s", metricsAddr)
32 if err := adminServer.ListenAndServe(); err != nil {
33 log.Errorf("failed to start webhook admin server: %s", err)
34 }
35 }()
36
37 stop := make(chan os.Signal, 1)
38 defer close(stop)
39 signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
40
41 config, err := pkgk8s.GetConfig(kubeconfig, "")
42 if err != nil {
43
44 log.Fatalf("error building Kubernetes API config: %s", err)
45 }
46
47 k8sAPI, err := pkgk8s.NewAPIForConfig(config, "", []string{}, 0, 0, 0)
48 if err != nil {
49
50 log.Fatalf("error configuring Kubernetes API client: %s", err)
51 }
52
53 metadataAPI, err := k8s.InitializeMetadataAPI(kubeconfig, "local", apiresources...)
54 if err != nil {
55
56 log.Fatalf("failed to initialize Kubernetes API: %s", err)
57 }
58
59 s, err := NewServer(ctx, k8sAPI, metadataAPI, addr, pkgk8s.MountPathTLSBase, handler, component)
60 if err != nil {
61
62 log.Fatalf("failed to initialize the webhook server: %s", err)
63 }
64
65 go s.Start()
66
67 metadataAPI.Sync(nil)
68
69 ready = true
70
71 <-stop
72 log.Info("shutting down webhook server")
73 ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
74 defer cancel()
75 if err := s.Shutdown(ctx); err != nil {
76 log.Error(err)
77 }
78
79 adminServer.Shutdown(ctx)
80 }
81
View as plain text