diff --git a/cmd/background-controller/main.go b/cmd/background-controller/main.go index 88e09327ca..95b653063b 100644 --- a/cmd/background-controller/main.go +++ b/cmd/background-controller/main.go @@ -19,6 +19,7 @@ import ( kubeclient "github.com/kyverno/kyverno/pkg/clients/kube" kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno" "github.com/kyverno/kyverno/pkg/config" + configcontroller "github.com/kyverno/kyverno/pkg/controllers/config" policymetricscontroller "github.com/kyverno/kyverno/pkg/controllers/metrics/policy" "github.com/kyverno/kyverno/pkg/cosign" "github.com/kyverno/kyverno/pkg/engine" @@ -94,7 +95,6 @@ func createrLeaderControllers( if err != nil { return nil, err } - backgroundController := background.NewController( kyvernoClient, dynamicClient, @@ -113,6 +113,20 @@ func createrLeaderControllers( }, err } +func createNonLeaderControllers( + configuration config.Configuration, + kubeKyvernoInformer kubeinformers.SharedInformerFactory, +) ([]internal.Controller, func() error) { + configurationController := configcontroller.NewController( + configuration, + kubeKyvernoInformer.Core().V1().ConfigMaps(), + ) + return []internal.Controller{ + internal.NewController(configcontroller.ControllerName, configurationController, configcontroller.Workers), + }, + nil +} + func main() { var ( genWorkers int @@ -221,11 +235,23 @@ func main() { // TODO: do we need exceptions here ? nil, ) + // create non leader controllers + nonLeaderControllers, nonLeaderBootstrap := createNonLeaderControllers( + configuration, + kubeKyvernoInformer, + ) // start informers and wait for cache sync if !internal.StartInformersAndWaitForCacheSync(signalCtx, logger, kyvernoInformer, kubeKyvernoInformer, cacheInformer) { logger.Error(errors.New("failed to wait for cache sync"), "failed to wait for cache sync") os.Exit(1) } + // bootstrap non leader controllers + if nonLeaderBootstrap != nil { + if err := nonLeaderBootstrap(); err != nil { + logger.Error(err, "failed to bootstrap non leader controllers") + os.Exit(1) + } + } // start event generator go eventGenerator.Run(signalCtx, 3, &wg) // setup leader election @@ -278,6 +304,10 @@ func main() { logger.Error(err, "failed to initialize leader election") os.Exit(1) } + // start non leader controllers + for _, controller := range nonLeaderControllers { + controller.Run(signalCtx, logger.WithName("controllers"), &wg) + } // start leader election for { select { diff --git a/cmd/reports-controller/main.go b/cmd/reports-controller/main.go index 9a72d1c3f7..fed67358e7 100644 --- a/cmd/reports-controller/main.go +++ b/cmd/reports-controller/main.go @@ -19,6 +19,7 @@ import ( kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno" metadataclient "github.com/kyverno/kyverno/pkg/clients/metadata" "github.com/kyverno/kyverno/pkg/config" + configcontroller "github.com/kyverno/kyverno/pkg/controllers/config" admissionreportcontroller "github.com/kyverno/kyverno/pkg/controllers/report/admission" aggregatereportcontroller "github.com/kyverno/kyverno/pkg/controllers/report/aggregate" backgroundscancontroller "github.com/kyverno/kyverno/pkg/controllers/report/background" @@ -191,6 +192,20 @@ func createrLeaderControllers( return reportControllers, warmup, nil } +func createNonLeaderControllers( + configuration config.Configuration, + kubeKyvernoInformer kubeinformers.SharedInformerFactory, +) ([]internal.Controller, func() error) { + configurationController := configcontroller.NewController( + configuration, + kubeKyvernoInformer.Core().V1().ConfigMaps(), + ) + return []internal.Controller{ + internal.NewController(configcontroller.ControllerName, configurationController, configcontroller.Workers), + }, + nil +} + func main() { var ( leaderElectionRetryPeriod time.Duration @@ -304,14 +319,6 @@ func main() { exceptionsLister = lister } } - // start informers and wait for cache sync - if !internal.StartInformersAndWaitForCacheSync(ctx, logger, kyvernoInformer, kubeKyvernoInformer, cacheInformer) { - logger.Error(errors.New("failed to wait for cache sync"), "failed to wait for cache sync") - os.Exit(1) - } - // start event generator - var wg sync.WaitGroup - go eventGenerator.Run(ctx, 3, &wg) eng := engine.NewEngine( configuration, dClient, @@ -319,6 +326,26 @@ func main() { engineapi.DefaultContextLoaderFactory(configMapResolver), exceptionsLister, ) + // create non leader controllers + nonLeaderControllers, nonLeaderBootstrap := createNonLeaderControllers( + configuration, + kubeKyvernoInformer, + ) + // start informers and wait for cache sync + if !internal.StartInformersAndWaitForCacheSync(ctx, logger, kyvernoInformer, kubeKyvernoInformer, cacheInformer) { + logger.Error(errors.New("failed to wait for cache sync"), "failed to wait for cache sync") + os.Exit(1) + } + // bootstrap non leader controllers + if nonLeaderBootstrap != nil { + if err := nonLeaderBootstrap(); err != nil { + logger.Error(err, "failed to bootstrap non leader controllers") + os.Exit(1) + } + } + // start event generator + var wg sync.WaitGroup + go eventGenerator.Run(ctx, 3, &wg) // setup leader election le, err := leaderelection.New( logger.WithName("leader-election"), @@ -384,6 +411,10 @@ func main() { logger.Error(err, "failed to initialize leader election") os.Exit(1) } + // start non leader controllers + for _, controller := range nonLeaderControllers { + controller.Run(ctx, logger.WithName("controllers"), &wg) + } for { select { case <-ctx.Done():