From c5b0f24d00ecac36be069d83fd016347c7adfb9b Mon Sep 17 00:00:00 2001 From: Carl Henrik Lunde Date: Mon, 8 May 2023 18:59:21 +0200 Subject: [PATCH] Use lazy rest mapper provider-kubernetes initialized a new kubernetes client for each reconcile. The REST mapper in controller-runtime used to fetch information about every CRD in the cluster. controller-runtime introduced a lazy restmapper which means we don't have to introduce any complex caching to get a significant performance boost in provider-kubernetes: https://github.com/kubernetes-sigs/controller-runtime/pull/2116 This seems to become the default in the next release: https://github.com/kubernetes-sigs/controller-runtime/pull/2296 But this is so significant that we want to update now: * CPU reduced from constant throttling at 0.4 cores to 0.04 cores * CloudWatch / EKS audit log costs reduced significantly (55% for our cluster, with a lot of provider-kubernetes resources) Signed-off-by: Carl Henrik Lunde --- internal/clients/client.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/clients/client.go b/internal/clients/client.go index 8360b580..167c046e 100644 --- a/internal/clients/client.go +++ b/internal/clients/client.go @@ -19,6 +19,7 @@ import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" ) // NewRESTConfig returns a rest config given a secret with connection information. @@ -33,7 +34,14 @@ func NewRESTConfig(kubeconfig []byte) (*rest.Config, error) { // NewKubeClient returns a kubernetes client given a secret with connection // information. func NewKubeClient(config *rest.Config) (client.Client, error) { - kc, err := client.New(config, client.Options{}) + // in 0.15 this will be default + mapper, err := apiutil.NewDynamicRESTMapper(config, apiutil.WithExperimentalLazyMapper) + if err != nil { + return nil, errors.Wrap(err, "cannot create dynamic REST mapper for Kubernetes client") + } + kc, err := client.New(config, client.Options{ + Mapper: mapper, + }) if err != nil { return nil, errors.Wrap(err, "cannot create Kubernetes client") }