105 lines
2.7 KiB
Go
105 lines
2.7 KiB
Go
package k8s
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/pprof"
|
|
|
|
v1 "monitor/pkg/apis/v1"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
ctrl "sigs.k8s.io/controller-runtime"
|
|
"sigs.k8s.io/controller-runtime/pkg/builder"
|
|
"sigs.k8s.io/controller-runtime/pkg/client/config"
|
|
"sigs.k8s.io/controller-runtime/pkg/healthz"
|
|
"sigs.k8s.io/controller-runtime/pkg/manager"
|
|
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
|
)
|
|
|
|
var log = ctrl.Log.WithName("k8s")
|
|
|
|
type Config struct {
|
|
ctrl.Options
|
|
PProf bool
|
|
WebhookName string
|
|
CaKey types.NamespacedName
|
|
}
|
|
|
|
type Manager struct {
|
|
mgr ctrl.Manager
|
|
}
|
|
|
|
func NewManager(conf Config, setupFinished chan struct{}) (*Manager, error) {
|
|
restConfig, err := config.GetConfig()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
mgr, err := ctrl.NewManager(restConfig, conf.Options)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not create manager %w", err)
|
|
}
|
|
|
|
if err = corev1.AddToScheme(mgr.GetScheme()); err != nil {
|
|
return nil, fmt.Errorf("unable to add scheme %w", err)
|
|
}
|
|
|
|
if err = v1.AddToScheme(mgr.GetScheme()); err != nil {
|
|
return nil, fmt.Errorf("unable to add scheme %w", err)
|
|
}
|
|
|
|
if conf.PProf {
|
|
mgr.AddMetricsExtraHandler("/debug/pprof/", http.HandlerFunc(pprof.Index))
|
|
mgr.AddMetricsExtraHandler("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline))
|
|
mgr.AddMetricsExtraHandler("/debug/pprof/profile", http.HandlerFunc(pprof.Profile))
|
|
mgr.AddMetricsExtraHandler("/debug/pprof/symbol", http.HandlerFunc(pprof.Symbol))
|
|
mgr.AddMetricsExtraHandler("/debug/pprof/trace", http.HandlerFunc(pprof.Trace))
|
|
}
|
|
|
|
if conf.CertDir != "" {
|
|
// Make sure certs are generated and valid if cert rotation is enabled.
|
|
cr := &CertRotator{
|
|
CaKey: conf.CaKey,
|
|
CertDir: conf.CertDir,
|
|
DNSName: fmt.Sprintf("%s.%s.svc", conf.WebhookName, conf.CaKey.Namespace),
|
|
IsReady: setupFinished,
|
|
Webhooks: []WebhookInfo{
|
|
{
|
|
Name: "monitor-mutating-webhook-configuration",
|
|
Type: Mutating,
|
|
},
|
|
},
|
|
}
|
|
if err = AddRotator(mgr, cr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return &Manager{mgr: mgr}, nil
|
|
}
|
|
|
|
func (s *Manager) Add(r manager.Runnable) error {
|
|
return s.mgr.Add(r)
|
|
}
|
|
|
|
func (s *Manager) Setup(f func(manager.Manager) error) error {
|
|
return f(s.mgr)
|
|
}
|
|
|
|
func (s *Manager) WebHook(obj runtime.Object) *builder.WebhookBuilder {
|
|
return ctrl.NewWebhookManagedBy(s.mgr).For(obj)
|
|
}
|
|
|
|
func (s *Manager) Start() error {
|
|
if err := s.mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
|
|
return fmt.Errorf("unable to set up health check %w", err)
|
|
}
|
|
if err := s.mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
|
|
return fmt.Errorf("unable to set up ready check %w", err)
|
|
}
|
|
|
|
return s.mgr.Start(signals.SetupSignalHandler())
|
|
}
|