in cmd/webhook-manager/app/server.go [41:116]
func Run(config *options.Config) error {
if config.PrintVersion {
version.PrintVersionAndExit()
return nil
}
if config.WebhookURL == "" && config.WebhookNamespace == "" && config.WebhookName == "" {
return fmt.Errorf("failed to start webhooks as both 'url' and 'namespace/name' of webhook are empty")
}
restConfig, err := kube.BuildConfig(config.KubeClientOptions)
if err != nil {
return fmt.Errorf("unable to build k8s config: %v", err)
}
admissionConf := wkconfig.LoadAdmissionConf(config.ConfigPath)
if admissionConf == nil {
klog.Errorf("loadAdmissionConf failed.")
} else {
klog.V(2).Infof("loadAdmissionConf:%v", admissionConf.ResGroupsConfig)
}
vClient := getVolcanoClient(restConfig)
kubeClient := getKubeClient(restConfig)
broadcaster := record.NewBroadcaster()
broadcaster.StartRecordingToSink(&corev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
recorder := broadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: config.SchedulerName})
router.ForEachAdmission(config, func(service *router.AdmissionService) {
if service.Config != nil {
service.Config.VolcanoClient = vClient
service.Config.KubeClient = kubeClient
service.Config.SchedulerName = config.SchedulerName
service.Config.Recorder = recorder
service.Config.ConfigData = admissionConf
}
klog.V(3).Infof("Registered '%s' as webhook.", service.Path)
http.HandleFunc(service.Path, service.Handler)
klog.V(3).Infof("Registered configuration for webhook <%s>", service.Path)
registerWebhookConfig(kubeClient, config, service, config.CaCertData)
})
webhookServeError := make(chan struct{})
stopChannel := make(chan os.Signal, 1)
signal.Notify(stopChannel, syscall.SIGTERM, syscall.SIGINT)
server := &http.Server{
Addr: config.ListenAddress + ":" + strconv.Itoa(config.Port),
TLSConfig: configTLS(config, restConfig),
}
go func() {
err = server.ListenAndServeTLS("", "")
if err != nil && err != http.ErrServerClosed {
klog.Fatalf("ListenAndServeTLS for admission webhook failed: %v", err)
close(webhookServeError)
}
klog.Info("Volcano Webhook manager started.")
}()
if config.ConfigPath != "" {
go wkconfig.WatchAdmissionConf(config.ConfigPath, stopChannel)
}
select {
case <-stopChannel:
if err := server.Close(); err != nil {
return fmt.Errorf("close admission server failed: %v", err)
}
return nil
case <-webhookServeError:
return fmt.Errorf("unknown webhook server error")
}
}