Skip to content

Commit 2793626

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 a6b7442 commit 2793626

File tree

6 files changed

+65
-7
lines changed

6 files changed

+65
-7
lines changed

bootstrap/kubeadm/main.go

Lines changed: 13 additions & 2 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"
@@ -175,7 +178,7 @@ func main() {
175178
os.Exit(1)
176179
}
177180

178-
mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
181+
ctrlOptions := ctrl.Options{
179182
Scheme: scheme,
180183
MetricsBindAddress: metricsBindAddr,
181184
LeaderElection: enableLeaderElection,
@@ -194,7 +197,15 @@ func main() {
194197
HealthProbeBindAddress: healthAddr,
195198
CertDir: webhookCertDir,
196199
TLSOpts: tlsOptionOverrides,
197-
})
200+
}
201+
202+
if feature.Gates.Enabled(feature.LazyRestmapper) {
203+
ctrlOptions.MapperProvider = func(c *rest.Config) (meta.RESTMapper, error) {
204+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
205+
}
206+
}
207+
208+
mgr, err := ctrl.NewManager(restConfig, ctrlOptions)
198209
if err != nil {
199210
setupLog.Error(err, "unable to start manager")
200211
os.Exit(1)

controllers/remote/cluster_cache_tracker.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import (
4747
"sigs.k8s.io/controller-runtime/pkg/source"
4848

4949
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
50+
"sigs.k8s.io/cluster-api/feature"
5051
"sigs.k8s.io/cluster-api/util/conditions"
5152
)
5253

@@ -370,8 +371,15 @@ func (t *ClusterCacheTracker) runningOnWorkloadCluster(ctx context.Context, c cl
370371

371372
// createClient creates a client and a mapper based on a rest.Config.
372373
func (t *ClusterCacheTracker) createClient(config *rest.Config, cluster client.ObjectKey) (client.Client, meta.RESTMapper, error) {
374+
var mapper meta.RESTMapper
375+
var err error
376+
373377
// Create a mapper for it
374-
mapper, err := apiutil.NewDynamicRESTMapper(config)
378+
if !feature.Gates.Enabled(feature.LazyRestmapper) {
379+
mapper, err = apiutil.NewDynamicRESTMapper(config)
380+
} else {
381+
mapper, err = apiutil.NewDynamicRESTMapper(config, apiutil.WithExperimentalLazyMapper)
382+
}
375383
if err != nil {
376384
return nil, nil, errors.Wrapf(err, "error creating dynamic rest mapper for remote cluster %q", cluster.String())
377385
}

controlplane/kubeadm/main.go

Lines changed: 16 additions & 2 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"
@@ -184,7 +187,7 @@ func main() {
184187
os.Exit(1)
185188
}
186189

187-
mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
190+
ctrlOptions := ctrl.Options{
188191
Scheme: scheme,
189192
MetricsBindAddress: metricsBindAddr,
190193
LeaderElection: enableLeaderElection,
@@ -203,7 +206,18 @@ func main() {
203206
HealthProbeBindAddress: healthAddr,
204207
CertDir: webhookCertDir,
205208
TLSOpts: tlsOptionOverrides,
206-
})
209+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
210+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
211+
},
212+
}
213+
214+
if feature.Gates.Enabled(feature.LazyRestmapper) {
215+
ctrlOptions.MapperProvider = func(c *rest.Config) (meta.RESTMapper, error) {
216+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
217+
}
218+
}
219+
220+
mgr, err := ctrl.NewManager(restConfig, ctrlOptions)
207221
if err != nil {
208222
setupLog.Error(err, "unable to start manager")
209223
os.Exit(1)

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: 16 additions & 2 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"
@@ -249,7 +252,7 @@ func main() {
249252
os.Exit(1)
250253
}
251254

252-
mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
255+
ctrlOptions := ctrl.Options{
253256
Scheme: scheme,
254257
MetricsBindAddress: metricsBindAddr,
255258
LeaderElection: enableLeaderElection,
@@ -268,7 +271,18 @@ func main() {
268271
CertDir: webhookCertDir,
269272
HealthProbeBindAddress: healthAddr,
270273
TLSOpts: tlsOptionOverrides,
271-
})
274+
MapperProvider: func(c *rest.Config) (meta.RESTMapper, error) {
275+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
276+
},
277+
}
278+
279+
if feature.Gates.Enabled(feature.LazyRestmapper) {
280+
ctrlOptions.MapperProvider = func(c *rest.Config) (meta.RESTMapper, error) {
281+
return apiutil.NewDynamicRESTMapper(c, apiutil.WithExperimentalLazyMapper)
282+
}
283+
}
284+
285+
mgr, err := ctrl.NewManager(restConfig, ctrlOptions)
272286
if err != nil {
273287
setupLog.Error(err, "unable to start manager")
274288
os.Exit(1)

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)