1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-28 10:28:36 +00:00

refactor: move clients creation in internal package (#6924)

* refactor: move clients creation in internal package

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* dclient

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* metadata

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

---------

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
This commit is contained in:
Charles-Edouard Brétéché 2023-04-14 11:00:52 +02:00 committed by GitHub
parent 19b0752e5d
commit e5a9148a75
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 179 additions and 107 deletions

View file

@ -13,8 +13,6 @@ import (
"github.com/kyverno/kyverno/pkg/client/clientset/versioned"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
"github.com/kyverno/kyverno/pkg/clients/dclient"
dynamicclient "github.com/kyverno/kyverno/pkg/clients/dynamic"
kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno"
"github.com/kyverno/kyverno/pkg/config"
policymetricscontroller "github.com/kyverno/kyverno/pkg/controllers/metrics/policy"
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
@ -100,6 +98,9 @@ func main() {
internal.WithConfigMapCaching(),
internal.WithRegistryClient(),
internal.WithLeaderElection(),
internal.WithKyvernoClient(),
internal.WithDynamicClient(),
internal.WithKyvernoDynamicClient(),
internal.WithFlagSets(flagset),
)
// parse flags
@ -107,21 +108,13 @@ func main() {
// setup
signalCtx, setup, sdown := internal.Setup(appConfig, "kyverno-background-controller", false)
defer sdown()
// create instrumented clients
kyvernoClient := internal.CreateKyvernoClient(setup.Logger, kyvernoclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), kyvernoclient.WithTracing())
dynamicClient := internal.CreateDynamicClient(setup.Logger, dynamicclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), dynamicclient.WithTracing())
dClient, err := dclient.NewClient(signalCtx, dynamicClient, setup.KubeClient, 15*time.Minute)
if err != nil {
setup.Logger.Error(err, "failed to create dynamic client")
os.Exit(1)
}
// THIS IS AN UGLY FIX
// ELSE KYAML IS NOT THREAD SAFE
kyamlopenapi.Schema()
// informer factories
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
eventGenerator := event.NewEventGenerator(
dClient,
setup.KyvernoDynamicClient,
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
kyvernoInformer.Kyverno().V1().Policies(),
maxQueuedEvents,
@ -141,10 +134,10 @@ func main() {
setup.Configuration,
setup.MetricsConfiguration,
setup.Jp,
dClient,
setup.KyvernoDynamicClient,
setup.RegistryClient,
setup.KubeClient,
kyvernoClient,
setup.KyvernoClient,
)
// start informers and wait for cache sync
if !internal.StartInformersAndWaitForCacheSync(signalCtx, setup.Logger, kyvernoInformer) {
@ -165,15 +158,15 @@ func main() {
logger := setup.Logger.WithName("leader")
// create leader factories
kubeInformer := kubeinformers.NewSharedInformerFactory(setup.KubeClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
// create leader controllers
leaderControllers, err := createrLeaderControllers(
engine,
genWorkers,
kubeInformer,
kyvernoInformer,
kyvernoClient,
dClient,
setup.KyvernoClient,
setup.KyvernoDynamicClient,
setup.RegistryClient,
setup.Configuration,
setup.MetricsManager,

View file

@ -12,15 +12,12 @@ import (
cleanuphandlers "github.com/kyverno/kyverno/cmd/cleanup-controller/handlers/cleanup"
"github.com/kyverno/kyverno/cmd/internal"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
dynamicclient "github.com/kyverno/kyverno/pkg/clients/dynamic"
kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno"
"github.com/kyverno/kyverno/pkg/config"
"github.com/kyverno/kyverno/pkg/controllers/certmanager"
"github.com/kyverno/kyverno/pkg/controllers/cleanup"
genericloggingcontroller "github.com/kyverno/kyverno/pkg/controllers/generic/logging"
genericwebhookcontroller "github.com/kyverno/kyverno/pkg/controllers/generic/webhook"
"github.com/kyverno/kyverno/pkg/leaderelection"
"github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/tls"
"github.com/kyverno/kyverno/pkg/webhooks"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
@ -66,6 +63,8 @@ func main() {
internal.WithTracing(),
internal.WithKubeconfig(),
internal.WithLeaderElection(),
internal.WithKyvernoClient(),
internal.WithKyvernoDynamicClient(),
internal.WithFlagSets(flagset),
)
// parse flags
@ -73,8 +72,6 @@ func main() {
// setup
ctx, setup, sdown := internal.Setup(appConfig, "kyverno-cleanup-controller", false)
defer sdown()
// create instrumented clients
kyvernoClient := internal.CreateKyvernoClient(setup.Logger, kyvernoclient.WithMetrics(setup.MetricsManager, metrics.KubeClient), kyvernoclient.WithTracing())
// setup leader election
le, err := leaderelection.New(
setup.Logger.WithName("leader-election"),
@ -87,7 +84,7 @@ func main() {
logger := setup.Logger.WithName("leader")
// informer factories
kubeInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
// listers
secretLister := kubeKyvernoInformer.Core().V1().Secrets().Lister().Secrets(config.KyvernoNamespace())
@ -169,12 +166,10 @@ func main() {
setup.Logger.Error(err, "failed to initialize leader election")
os.Exit(1)
}
dynamicClient := internal.CreateDynamicClient(setup.Logger, dynamicclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), dynamicclient.WithTracing())
dClient := internal.CreateDClient(setup.Logger, ctx, dynamicClient, setup.KubeClient, 15*time.Minute)
// informer factories
kubeInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
// listers
secretLister := kubeKyvernoInformer.Core().V1().Secrets().Lister().Secrets(config.KyvernoNamespace())
cpolLister := kyvernoInformer.Kyverno().V2alpha1().ClusterCleanupPolicies().Lister()
@ -198,8 +193,8 @@ func main() {
os.Exit(1)
}
// create handlers
admissionHandlers := admissionhandlers.New(dClient)
cleanupHandlers := cleanuphandlers.New(setup.Logger.WithName("cleanup-handler"), dClient, cpolLister, polLister, nsLister, setup.Jp)
admissionHandlers := admissionhandlers.New(setup.KyvernoDynamicClient)
cleanupHandlers := cleanuphandlers.New(setup.Logger.WithName("cleanup-handler"), setup.KyvernoDynamicClient, cpolLister, polLister, nsLister, setup.Jp)
// create server
server := NewServer(
func() ([]byte, []byte, error) {

View file

@ -44,7 +44,7 @@ func createKubernetesClient(logger logr.Logger, opts ...kube.NewOption) kubernet
return client
}
func CreateKyvernoClient(logger logr.Logger, opts ...kyverno.NewOption) versioned.Interface {
func createKyvernoClient(logger logr.Logger, opts ...kyverno.NewOption) versioned.Interface {
logger = logger.WithName("kyverno-client")
logger.Info("create kyverno client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := kyverno.NewForConfig(createClientConfig(logger), opts...)
@ -52,7 +52,7 @@ func CreateKyvernoClient(logger logr.Logger, opts ...kyverno.NewOption) versione
return client
}
func CreateDynamicClient(logger logr.Logger, opts ...dyn.NewOption) dynamic.Interface {
func createDynamicClient(logger logr.Logger, opts ...dyn.NewOption) dynamic.Interface {
logger = logger.WithName("dynamic-client")
logger.Info("create dynamic client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := dyn.NewForConfig(createClientConfig(logger), opts...)
@ -60,7 +60,7 @@ func CreateDynamicClient(logger logr.Logger, opts ...dyn.NewOption) dynamic.Inte
return client
}
func CreateMetadataClient(logger logr.Logger, opts ...meta.NewOption) metadata.Interface {
func createMetadataClient(logger logr.Logger, opts ...meta.NewOption) metadata.Interface {
logger = logger.WithName("metadata-client")
logger.Info("create metadata client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := meta.NewForConfig(createClientConfig(logger), opts...)
@ -68,7 +68,7 @@ func CreateMetadataClient(logger logr.Logger, opts ...meta.NewOption) metadata.I
return client
}
func CreateApiServerClient(logger logr.Logger, opts ...apisrv.NewOption) apiserver.Interface {
func createApiServerClient(logger logr.Logger, opts ...apisrv.NewOption) apiserver.Interface {
logger = logger.WithName("apiserver-client")
logger.Info("create apiserver client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := apisrv.NewForConfig(createClientConfig(logger), opts...)
@ -76,6 +76,14 @@ func CreateApiServerClient(logger logr.Logger, opts ...apisrv.NewOption) apiserv
return client
}
func createKyvernoDynamicClient(logger logr.Logger, ctx context.Context, dyn dynamic.Interface, kube kubernetes.Interface, resync time.Duration) dclient.Interface {
logger = logger.WithName("d-client")
logger.Info("create the kyverno dynamic client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := dclient.NewClient(ctx, dyn, kube, resync)
checkError(logger, err, "failed to create d client")
return client
}
func CreateAggregatorClient(logger logr.Logger, opts ...agg.NewOption) aggregator.Interface {
logger = logger.WithName("aggregator-client")
logger.Info("create aggregator client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
@ -83,11 +91,3 @@ func CreateAggregatorClient(logger logr.Logger, opts ...agg.NewOption) aggregato
checkError(logger, err, "failed to create aggregator client")
return client
}
func CreateDClient(logger logr.Logger, ctx context.Context, dyn dynamic.Interface, kube kubernetes.Interface, resync time.Duration) dclient.Interface {
logger = logger.WithName("d-client")
logger.Info("create the kyverno dynamic client...", "kubeconfig", kubeconfig, "qps", clientRateLimitQPS, "burst", clientRateLimitBurst)
client, err := dclient.NewClient(ctx, dyn, kube, resync)
checkError(logger, err, "failed to create d client")
return client
}

View file

@ -14,6 +14,11 @@ type Configuration interface {
UsesCosign() bool
UsesRegistryClient() bool
UsesLeaderElection() bool
UsesKyvernoClient() bool
UsesDynamicClient() bool
UsesApiServerClient() bool
UsesMetadataClient() bool
UsesKyvernoDynamicClient() bool
FlagSets() []*flag.FlagSet
}
@ -81,6 +86,38 @@ func WithLeaderElection() ConfigurationOption {
}
}
func WithKyvernoClient() ConfigurationOption {
return func(c *configuration) {
c.usesKyvernoClient = true
}
}
func WithDynamicClient() ConfigurationOption {
return func(c *configuration) {
c.usesDynamicClient = true
}
}
func WithApiServerClient() ConfigurationOption {
return func(c *configuration) {
c.usesApiServerClient = true
}
}
func WithMetadataClient() ConfigurationOption {
return func(c *configuration) {
c.usesMetadataClient = true
}
}
func WithKyvernoDynamicClient() ConfigurationOption {
return func(c *configuration) {
// requires dynamic client
c.usesDynamicClient = true
c.usesKyvernoDynamicClient = true
}
}
func WithFlagSets(flagsets ...*flag.FlagSet) ConfigurationOption {
return func(c *configuration) {
c.flagSets = append(c.flagSets, flagsets...)
@ -88,16 +125,21 @@ func WithFlagSets(flagsets ...*flag.FlagSet) ConfigurationOption {
}
type configuration struct {
usesMetrics bool
usesTracing bool
usesProfiling bool
usesKubeconfig bool
usesPolicyExceptions bool
usesConfigMapCaching bool
usesCosign bool
usesRegistryClient bool
usesLeaderElection bool
flagSets []*flag.FlagSet
usesMetrics bool
usesTracing bool
usesProfiling bool
usesKubeconfig bool
usesPolicyExceptions bool
usesConfigMapCaching bool
usesCosign bool
usesRegistryClient bool
usesLeaderElection bool
usesKyvernoClient bool
usesDynamicClient bool
usesApiServerClient bool
usesMetadataClient bool
usesKyvernoDynamicClient bool
flagSets []*flag.FlagSet
}
func (c *configuration) UsesMetrics() bool {
@ -136,6 +178,26 @@ func (c *configuration) UsesLeaderElection() bool {
return c.usesLeaderElection
}
func (c *configuration) UsesKyvernoClient() bool {
return c.usesKyvernoClient
}
func (c *configuration) UsesDynamicClient() bool {
return c.usesDynamicClient
}
func (c *configuration) UsesApiServerClient() bool {
return c.usesApiServerClient
}
func (c *configuration) UsesMetadataClient() bool {
return c.usesMetadataClient
}
func (c *configuration) UsesKyvernoDynamicClient() bool {
return c.usesKyvernoDynamicClient
}
func (c *configuration) FlagSets() []*flag.FlagSet {
return c.flagSets
}

View file

@ -2,14 +2,24 @@ package internal
import (
"context"
"time"
"github.com/go-logr/logr"
"github.com/kyverno/kyverno/pkg/client/clientset/versioned"
apiserverclient "github.com/kyverno/kyverno/pkg/clients/apiserver"
"github.com/kyverno/kyverno/pkg/clients/dclient"
dynamicclient "github.com/kyverno/kyverno/pkg/clients/dynamic"
kubeclient "github.com/kyverno/kyverno/pkg/clients/kube"
kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno"
metadataclient "github.com/kyverno/kyverno/pkg/clients/metadata"
"github.com/kyverno/kyverno/pkg/config"
"github.com/kyverno/kyverno/pkg/engine/jmespath"
"github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/registryclient"
apiserver "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/metadata"
)
func shutdown(logger logr.Logger, sdowns ...context.CancelFunc) context.CancelFunc {
@ -32,6 +42,11 @@ type SetupResult struct {
KubeClient kubernetes.Interface
LeaderElectionClient kubernetes.Interface
RegistryClient registryclient.Client
KyvernoClient versioned.Interface
DynamicClient dynamic.Interface
ApiServerClient apiserver.Interface
MetadataClient metadata.Interface
KyvernoDynamicClient dclient.Interface
}
func Setup(config Configuration, name string, skipResourceFilters bool) (context.Context, SetupResult, context.CancelFunc) {
@ -55,6 +70,26 @@ func Setup(config Configuration, name string, skipResourceFilters bool) (context
if config.UsesLeaderElection() {
leaderElectionClient = createKubernetesClient(logger, kubeclient.WithMetrics(metricsManager, metrics.KubeClient), kubeclient.WithTracing())
}
var kyvernoClient versioned.Interface
if config.UsesKyvernoClient() {
kyvernoClient = createKyvernoClient(logger, kyvernoclient.WithMetrics(metricsManager, metrics.KyvernoClient), kyvernoclient.WithTracing())
}
var dynamicClient dynamic.Interface
if config.UsesDynamicClient() {
dynamicClient = createDynamicClient(logger, dynamicclient.WithMetrics(metricsManager, metrics.DynamicClient), dynamicclient.WithTracing())
}
var apiServerClient apiserver.Interface
if config.UsesApiServerClient() {
apiServerClient = createApiServerClient(logger, apiserverclient.WithMetrics(metricsManager, metrics.ApiServerClient), apiserverclient.WithTracing())
}
var dClient dclient.Interface
if config.UsesKyvernoDynamicClient() {
dClient = createKyvernoDynamicClient(logger, ctx, dynamicClient, client, 15*time.Minute)
}
var metadataClient metadata.Interface
if config.UsesMetadataClient() {
metadataClient = createMetadataClient(logger, metadataclient.WithMetrics(metricsManager, metrics.MetadataClient), metadataclient.WithTracing())
}
return ctx,
SetupResult{
Logger: logger,
@ -65,6 +100,11 @@ func Setup(config Configuration, name string, skipResourceFilters bool) (context
KubeClient: client,
LeaderElectionClient: leaderElectionClient,
RegistryClient: registryClient,
KyvernoClient: kyvernoClient,
DynamicClient: dynamicClient,
ApiServerClient: apiServerClient,
MetadataClient: metadataClient,
KyvernoDynamicClient: dClient,
},
shutdown(logger.WithName("shutdown"), sdownMaxProcs, sdownMetrics, sdownTracing, sdownSignals)
}

View file

@ -7,7 +7,6 @@ import (
"context"
"os"
"sync"
"time"
"github.com/kyverno/kyverno/cmd/internal"
kyvernoclient "github.com/kyverno/kyverno/pkg/client/clientset/versioned"
@ -32,6 +31,9 @@ func main() {
// config
appConfig := internal.NewConfiguration(
internal.WithKubeconfig(),
internal.WithKyvernoClient(),
internal.WithDynamicClient(),
internal.WithKyvernoDynamicClient(),
)
// parse flags
internal.ParseFlags(appConfig)
@ -42,10 +44,6 @@ func main() {
// setup maxprocs
ctx, setup, sdown := internal.Setup(appConfig, "kyverno-init-controller", false)
defer sdown()
// create clients
dynamicClient := internal.CreateDynamicClient(setup.Logger)
kyvernoClient := internal.CreateKyvernoClient(setup.Logger)
client := internal.CreateDClient(setup.Logger, ctx, dynamicClient, setup.KubeClient, 15*time.Minute)
// Exit for unsupported version of kubernetes cluster
if !kubeutils.HigherThanKubernetesVersion(setup.KubeClient.Discovery(), logging.GlobalLogger(), 1, 16, 0) {
os.Exit(1)
@ -92,8 +90,8 @@ func main() {
in := gen(done, ctx.Done(), requests...)
// process requests
// processing routine count : 2
p1 := process(client, kyvernoClient, done, ctx.Done(), in)
p2 := process(client, kyvernoClient, done, ctx.Done(), in)
p1 := process(setup.KyvernoDynamicClient, setup.KyvernoClient, done, ctx.Done(), in)
p2 := process(setup.KyvernoDynamicClient, setup.KyvernoClient, done, ctx.Done(), in)
// merge results from processing routines
for err := range merge(done, ctx.Done(), p1, p2) {
if err != nil {

View file

@ -14,10 +14,7 @@ import (
"github.com/kyverno/kyverno/cmd/internal"
"github.com/kyverno/kyverno/pkg/client/clientset/versioned"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
apiserverclient "github.com/kyverno/kyverno/pkg/clients/apiserver"
"github.com/kyverno/kyverno/pkg/clients/dclient"
dynamicclient "github.com/kyverno/kyverno/pkg/clients/dynamic"
kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno"
"github.com/kyverno/kyverno/pkg/config"
"github.com/kyverno/kyverno/pkg/controllers/certmanager"
genericloggingcontroller "github.com/kyverno/kyverno/pkg/controllers/generic/logging"
@ -30,7 +27,6 @@ import (
"github.com/kyverno/kyverno/pkg/event"
"github.com/kyverno/kyverno/pkg/leaderelection"
"github.com/kyverno/kyverno/pkg/logging"
"github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/openapi"
"github.com/kyverno/kyverno/pkg/policycache"
"github.com/kyverno/kyverno/pkg/tls"
@ -218,6 +214,10 @@ func main() {
internal.WithCosign(),
internal.WithRegistryClient(),
internal.WithLeaderElection(),
internal.WithKyvernoClient(),
internal.WithDynamicClient(),
internal.WithKyvernoDynamicClient(),
internal.WithApiServerClient(),
internal.WithFlagSets(flagset),
)
// parse flags
@ -227,27 +227,18 @@ func main() {
defer sdown()
// show version
showWarnings(setup.Logger)
// create instrumented clients
kyvernoClient := internal.CreateKyvernoClient(setup.Logger, kyvernoclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), kyvernoclient.WithTracing())
dynamicClient := internal.CreateDynamicClient(setup.Logger, dynamicclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), dynamicclient.WithTracing())
apiserverClient := internal.CreateApiServerClient(setup.Logger, apiserverclient.WithMetrics(setup.MetricsManager, metrics.KubeClient), apiserverclient.WithTracing())
dClient, err := dclient.NewClient(signalCtx, dynamicClient, setup.KubeClient, 15*time.Minute)
if err != nil {
setup.Logger.Error(err, "failed to create dynamic client")
os.Exit(1)
}
// THIS IS AN UGLY FIX
// ELSE KYAML IS NOT THREAD SAFE
kyamlopenapi.Schema()
// check we can run
if err := sanityChecks(apiserverClient); err != nil {
if err := sanityChecks(setup.ApiServerClient); err != nil {
setup.Logger.Error(err, "sanity checks failed")
os.Exit(1)
}
// informer factories
kubeInformer := kubeinformers.NewSharedInformerFactory(setup.KubeClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
secretLister := kubeKyvernoInformer.Core().V1().Secrets().Lister().Secrets(config.KyvernoNamespace())
openApiManager, err := openapi.NewManager(setup.Logger.WithName("openapi"))
if err != nil {
@ -265,7 +256,7 @@ func main() {
)
policyCache := policycache.NewCache()
eventGenerator := event.NewEventGenerator(
dClient,
setup.KyvernoDynamicClient,
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
kyvernoInformer.Kyverno().V1().Policies(),
maxQueuedEvents,
@ -304,10 +295,10 @@ func main() {
setup.Configuration,
setup.MetricsConfiguration,
setup.Jp,
dClient,
setup.KyvernoDynamicClient,
setup.RegistryClient,
setup.KubeClient,
kyvernoClient,
setup.KyvernoClient,
)
// create non leader controllers
nonLeaderControllers, nonLeaderBootstrap := createNonLeaderControllers(
@ -316,8 +307,8 @@ func main() {
kubeInformer,
kyvernoInformer,
setup.KubeClient,
kyvernoClient,
dClient,
setup.KyvernoClient,
setup.KyvernoDynamicClient,
setup.Configuration,
policyCache,
openApiManager,
@ -349,7 +340,7 @@ func main() {
// create leader factories
kubeInformer := kubeinformers.NewSharedInformerFactory(setup.KubeClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
// create leader controllers
leaderControllers, warmup, err := createrLeaderControllers(
admissionReports,
@ -360,8 +351,8 @@ func main() {
kubeKyvernoInformer,
kyvernoInformer,
setup.KubeClient,
kyvernoClient,
dClient,
setup.KyvernoClient,
setup.KyvernoDynamicClient,
certRenewer,
runtime,
int32(servicePort),
@ -411,17 +402,17 @@ func main() {
}()
// create webhooks server
urgen := webhookgenerate.NewGenerator(
kyvernoClient,
setup.KyvernoClient,
kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
)
policyHandlers := webhookspolicy.NewHandlers(
dClient,
setup.KyvernoDynamicClient,
openApiManager,
)
resourceHandlers := webhooksresource.NewHandlers(
engine,
dClient,
kyvernoClient,
setup.KyvernoDynamicClient,
setup.KyvernoClient,
setup.RegistryClient,
setup.Configuration,
setup.MetricsManager,
@ -463,7 +454,7 @@ func main() {
runtime,
kubeInformer.Rbac().V1().RoleBindings().Lister(),
kubeInformer.Rbac().V1().ClusterRoleBindings().Lister(),
dClient.Discovery(),
setup.KyvernoDynamicClient.Discovery(),
)
// start informers and wait for cache sync
// we need to call start again because we potentially registered new informers

View file

@ -12,9 +12,6 @@ import (
"github.com/kyverno/kyverno/pkg/client/clientset/versioned"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
"github.com/kyverno/kyverno/pkg/clients/dclient"
dynamicclient "github.com/kyverno/kyverno/pkg/clients/dynamic"
kyvernoclient "github.com/kyverno/kyverno/pkg/clients/kyverno"
metadataclient "github.com/kyverno/kyverno/pkg/clients/metadata"
"github.com/kyverno/kyverno/pkg/config"
admissionreportcontroller "github.com/kyverno/kyverno/pkg/controllers/report/admission"
aggregatereportcontroller "github.com/kyverno/kyverno/pkg/controllers/report/aggregate"
@ -25,7 +22,6 @@ import (
"github.com/kyverno/kyverno/pkg/event"
"github.com/kyverno/kyverno/pkg/leaderelection"
"github.com/kyverno/kyverno/pkg/logging"
"github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/registryclient"
kubeinformers "k8s.io/client-go/informers"
metadatainformers "k8s.io/client-go/metadata/metadatainformer"
@ -190,6 +186,10 @@ func main() {
internal.WithCosign(),
internal.WithRegistryClient(),
internal.WithLeaderElection(),
internal.WithKyvernoClient(),
internal.WithDynamicClient(),
internal.WithMetadataClient(),
internal.WithKyvernoDynamicClient(),
internal.WithFlagSets(flagset),
)
// parse flags
@ -201,22 +201,13 @@ func main() {
// setup
ctx, setup, sdown := internal.Setup(appConfig, "kyverno-reports-controller", skipResourceFilters)
defer sdown()
// create instrumented clients
kyvernoClient := internal.CreateKyvernoClient(setup.Logger, kyvernoclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), kyvernoclient.WithTracing())
metadataClient := internal.CreateMetadataClient(setup.Logger, metadataclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), metadataclient.WithTracing())
dynamicClient := internal.CreateDynamicClient(setup.Logger, dynamicclient.WithMetrics(setup.MetricsManager, metrics.KyvernoClient), dynamicclient.WithTracing())
dClient, err := dclient.NewClient(ctx, dynamicClient, setup.KubeClient, 15*time.Minute)
if err != nil {
setup.Logger.Error(err, "failed to create dynamic client")
os.Exit(1)
}
// THIS IS AN UGLY FIX
// ELSE KYAML IS NOT THREAD SAFE
kyamlopenapi.Schema()
// informer factories
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
eventGenerator := event.NewEventGenerator(
dClient,
setup.KyvernoDynamicClient,
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
kyvernoInformer.Kyverno().V1().Policies(),
maxQueuedEvents,
@ -229,10 +220,10 @@ func main() {
setup.Configuration,
setup.MetricsConfiguration,
setup.Jp,
dClient,
setup.KyvernoDynamicClient,
setup.RegistryClient,
setup.KubeClient,
kyvernoClient,
setup.KyvernoClient,
)
// start informers and wait for cache sync
if !internal.StartInformersAndWaitForCacheSync(ctx, setup.Logger, kyvernoInformer) {
@ -255,8 +246,8 @@ func main() {
// create leader factories
kubeInformer := kubeinformers.NewSharedInformerFactory(setup.KubeClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(setup.KubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
metadataInformer := metadatainformers.NewSharedInformerFactory(metadataClient, 15*time.Minute)
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(setup.KyvernoClient, resyncPeriod)
metadataInformer := metadatainformers.NewSharedInformerFactory(setup.MetadataClient, 15*time.Minute)
// create leader controllers
leaderControllers, warmup, err := createrLeaderControllers(
engine,
@ -267,8 +258,8 @@ func main() {
kubeInformer,
kyvernoInformer,
metadataInformer,
kyvernoClient,
dClient,
setup.KyvernoClient,
setup.KyvernoDynamicClient,
setup.RegistryClient,
setup.Configuration,
setup.Jp,

View file

@ -74,8 +74,10 @@ const (
type ClientType string
const (
KubeDynamicClient ClientType = "dynamic"
DynamicClient ClientType = "dynamic"
KubeClient ClientType = "kubeclient"
KyvernoClient ClientType = "kyverno"
MetadataClient ClientType = "metadata"
ApiServerClient ClientType = "apiserver"
PolicyReportClient ClientType = "policyreport"
)