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" ctrl "sigs.k8s.io/controller-runtime" "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" ) type Config struct { ctrl.Options PProf bool } type Manager struct { mgr ctrl.Manager } func NewManager(conf Config) (*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)) } 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) error { return ctrl.NewWebhookManagedBy(s.mgr).For(obj).Complete() } 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()) }