Skip to content

Commit ffeb158

Browse files
committed
Use lazy restmapper
The feature was introduced in controller-runtime 0.14.4+ allows to use lazy restmapper. The main advantage of this restmapper is that it fetches only required api resources in runtime, which highly reduces the number of http calls to the api server.
1 parent 69fdcc2 commit ffeb158

File tree

6 files changed

+30
-1
lines changed

6 files changed

+30
-1
lines changed

bootstrap/kubeadm/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ import (
3030
// +kubebuilder:scaffold:imports
3131
"github.com/spf13/pflag"
3232
corev1 "k8s.io/api/core/v1"
33+
"k8s.io/apimachinery/pkg/api/meta"
3334
"k8s.io/apimachinery/pkg/runtime"
3435
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
36+
"k8s.io/client-go/rest"
3537
"k8s.io/client-go/tools/leaderelection/resourcelock"
3638
cliflag "k8s.io/component-base/cli/flag"
3739
"k8s.io/component-base/logs"
@@ -40,6 +42,7 @@ import (
4042
"k8s.io/klog/v2"
4143
ctrl "sigs.k8s.io/controller-runtime"
4244
"sigs.k8s.io/controller-runtime/pkg/client"
45+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4346
"sigs.k8s.io/controller-runtime/pkg/controller"
4447

4548
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -194,6 +197,9 @@ func main() {
194197
HealthProbeBindAddress: healthAddr,
195198
CertDir: webhookCertDir,
196199
TLSOpts: tlsOptionOverrides,
200+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
201+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
202+
},
197203
})
198204
if err != nil {
199205
setupLog.Error(err, "unable to start manager")

controllers/remote/cluster_cache_tracker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ func (t *ClusterCacheTracker) runningOnWorkloadCluster(ctx context.Context, c cl
371371
// createClient creates a client and a mapper based on a rest.Config.
372372
func (t *ClusterCacheTracker) createClient(config *rest.Config, cluster client.ObjectKey) (client.Client, meta.RESTMapper, error) {
373373
// Create a mapper for it
374-
mapper, err := apiutil.NewDynamicRESTMapper(config)
374+
mapper, err := apiutil.NewDynamicRESTMapper(config, apiutil.WithExperimentalLazyMapper)
375375
if err != nil {
376376
return nil, nil, errors.Wrapf(err, "error creating dynamic rest mapper for remote cluster %q", cluster.String())
377377
}

controlplane/kubeadm/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ import (
3232
appsv1 "k8s.io/api/apps/v1"
3333
corev1 "k8s.io/api/core/v1"
3434
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
35+
"k8s.io/apimachinery/pkg/api/meta"
3536
"k8s.io/apimachinery/pkg/runtime"
3637
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
38+
"k8s.io/client-go/rest"
3739
"k8s.io/client-go/tools/leaderelection/resourcelock"
3840
cliflag "k8s.io/component-base/cli/flag"
3941
"k8s.io/component-base/logs"
@@ -42,6 +44,7 @@ import (
4244
"k8s.io/klog/v2"
4345
ctrl "sigs.k8s.io/controller-runtime"
4446
"sigs.k8s.io/controller-runtime/pkg/client"
47+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4548
"sigs.k8s.io/controller-runtime/pkg/controller"
4649

4750
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -203,6 +206,9 @@ func main() {
203206
HealthProbeBindAddress: healthAddr,
204207
CertDir: webhookCertDir,
205208
TLSOpts: tlsOptionOverrides,
209+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
210+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
211+
},
206212
})
207213
if err != nil {
208214
setupLog.Error(err, "unable to start manager")

internal/test/envtest/environment.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
corev1 "k8s.io/api/core/v1"
3636
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3737
apierrors "k8s.io/apimachinery/pkg/api/errors"
38+
"k8s.io/apimachinery/pkg/api/meta"
3839
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3940
kerrors "k8s.io/apimachinery/pkg/util/errors"
4041
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -45,6 +46,7 @@ import (
4546
"k8s.io/klog/v2/klogr"
4647
ctrl "sigs.k8s.io/controller-runtime"
4748
"sigs.k8s.io/controller-runtime/pkg/client"
49+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4850
"sigs.k8s.io/controller-runtime/pkg/envtest"
4951
"sigs.k8s.io/controller-runtime/pkg/manager"
5052

@@ -255,6 +257,9 @@ func newEnvironment(uncachedObjs ...client.Object) *Environment {
255257
Port: env.WebhookInstallOptions.LocalServingPort,
256258
ClientDisableCacheFor: objs,
257259
Host: host,
260+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
261+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
262+
},
258263
}
259264

260265
mgr, err := ctrl.NewManager(env.Config, options)

main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ import (
3131
"github.com/spf13/pflag"
3232
corev1 "k8s.io/api/core/v1"
3333
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
34+
"k8s.io/apimachinery/pkg/api/meta"
3435
"k8s.io/apimachinery/pkg/runtime"
3536
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
37+
"k8s.io/client-go/rest"
3638
"k8s.io/client-go/tools/leaderelection/resourcelock"
3739
cliflag "k8s.io/component-base/cli/flag"
3840
"k8s.io/component-base/logs"
@@ -41,6 +43,7 @@ import (
4143
"k8s.io/klog/v2"
4244
ctrl "sigs.k8s.io/controller-runtime"
4345
"sigs.k8s.io/controller-runtime/pkg/client"
46+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4447
"sigs.k8s.io/controller-runtime/pkg/controller"
4548

4649
clusterv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3"
@@ -268,6 +271,9 @@ func main() {
268271
CertDir: webhookCertDir,
269272
HealthProbeBindAddress: healthAddr,
270273
TLSOpts: tlsOptionOverrides,
274+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
275+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
276+
},
271277
})
272278
if err != nil {
273279
setupLog.Error(err, "unable to start manager")

test/infrastructure/docker/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,19 @@ import (
2828

2929
// +kubebuilder:scaffold:imports
3030
"github.com/spf13/pflag"
31+
"k8s.io/apimachinery/pkg/api/meta"
3132
"k8s.io/apimachinery/pkg/runtime"
3233
"k8s.io/client-go/kubernetes/scheme"
3334
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
35+
"k8s.io/client-go/rest"
3436
"k8s.io/client-go/tools/leaderelection/resourcelock"
3537
cliflag "k8s.io/component-base/cli/flag"
3638
"k8s.io/component-base/logs"
3739
logsv1 "k8s.io/component-base/logs/api/v1"
3840
_ "k8s.io/component-base/logs/json/register"
3941
"k8s.io/klog/v2"
4042
ctrl "sigs.k8s.io/controller-runtime"
43+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4144
"sigs.k8s.io/controller-runtime/pkg/controller"
4245

4346
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -149,6 +152,9 @@ func main() {
149152
HealthProbeBindAddress: healthAddr,
150153
Port: webhookPort,
151154
CertDir: webhookCertDir,
155+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
156+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
157+
},
152158
})
153159
if err != nil {
154160
setupLog.Error(err, "unable to start manager")

0 commit comments

Comments
 (0)