diff --git a/cmd/gardener-resource-manager/app/app.go b/cmd/gardener-resource-manager/app/app.go index ff7e1f512e0..1fa9962dc5b 100644 --- a/cmd/gardener-resource-manager/app/app.go +++ b/cmd/gardener-resource-manager/app/app.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net" + "net/http" "os" goruntime "runtime" "strconv" @@ -205,9 +206,10 @@ func run(ctx context.Context, log logr.Logger, cfg *config.ResourceManagerConfig // use dynamic rest mapper for target cluster, which will automatically rediscover resources on NoMatchErrors // but is rate-limited to not issue to many discovery calls (rate-limit shared across all reconciliations) - opts.MapperProvider = func(config *rest.Config) (meta.RESTMapper, error) { + opts.MapperProvider = func(config *rest.Config, httpClient *http.Client) (meta.RESTMapper, error) { return apiutil.NewDynamicRESTMapper( config, + httpClient, apiutil.WithLazyDiscovery, apiutil.WithLimiter(rate.NewLimiter(rate.Every(1*time.Minute), 1)), // rediscover at maximum every minute ) diff --git a/extensions/pkg/util/shoot_clients.go b/extensions/pkg/util/shoot_clients.go index 202f032f70a..0dbc5de9e5b 100644 --- a/extensions/pkg/util/shoot_clients.go +++ b/extensions/pkg/util/shoot_clients.go @@ -108,7 +108,12 @@ func NewClientForShoot(ctx context.Context, c client.Client, namespace string, o ApplyRESTOptions(shootRESTConfig, restOptions) if opts.Mapper == nil { - mapper, err := apiutil.NewDynamicRESTMapper(shootRESTConfig, apiutil.WithLazyDiscovery) + httpClient, err := rest.HTTPClientFor(shootRESTConfig) + if err != nil { + return nil, nil, fmt.Errorf("failed to get HTTP client for config: %w", err) + } + + mapper, err := apiutil.NewDynamicRESTMapper(shootRESTConfig, httpClient, apiutil.WithLazyDiscovery) if err != nil { return nil, nil, fmt.Errorf("failed to create new DynamicRESTMapper: %w", err) } diff --git a/pkg/client/kubernetes/runtime_client.go b/pkg/client/kubernetes/runtime_client.go index 79dc98b9429..7137265f232 100644 --- a/pkg/client/kubernetes/runtime_client.go +++ b/pkg/client/kubernetes/runtime_client.go @@ -56,9 +56,15 @@ func setCacheOptionsDefaults(options *cache.Options) error { func setClientOptionsDefaults(config *rest.Config, options *client.Options) error { if options.Mapper == nil { + httpClient, err := rest.HTTPClientFor(config) + if err != nil { + return fmt.Errorf("failed to get HTTP client for config: %w", err) + } + // default the client's REST mapper to a dynamic REST mapper (automatically rediscovers resources on NoMatchErrors) mapper, err := apiutil.NewDynamicRESTMapper( config, + httpClient, apiutil.WithLazyDiscovery, apiutil.WithLimiter(rate.NewLimiter(rate.Every(5*time.Second), 1)), ) diff --git a/test/integration/gardenlet/seed/seed/seed_test.go b/test/integration/gardenlet/seed/seed/seed_test.go index 56f5d2a3e96..4e58955918e 100644 --- a/test/integration/gardenlet/seed/seed/seed_test.go +++ b/test/integration/gardenlet/seed/seed/seed_test.go @@ -29,6 +29,7 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/rest" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" @@ -89,7 +90,9 @@ var _ = Describe("Seed controller tests", func() { }) By("Setup manager") - mapper, err := apiutil.NewDynamicRESTMapper(restConfig) + httpClient, err := rest.HTTPClientFor(restConfig) + Expect(err).NotTo(HaveOccurred()) + mapper, err := apiutil.NewDynamicRESTMapper(restConfig, httpClient) Expect(err).NotTo(HaveOccurred()) mgr, err := manager.New(restConfig, manager.Options{ diff --git a/test/integration/operator/garden/garden_test.go b/test/integration/operator/garden/garden_test.go index 6a7dd43349e..e4f7ac641e4 100644 --- a/test/integration/operator/garden/garden_test.go +++ b/test/integration/operator/garden/garden_test.go @@ -30,6 +30,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/rest" clientcmdlatest "k8s.io/client-go/tools/clientcmd/api/latest" clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" "k8s.io/utils/pointer" @@ -110,7 +111,9 @@ var _ = Describe("Garden controller tests", func() { }) By("Setup manager") - mapper, err := apiutil.NewDynamicRESTMapper(restConfig) + httpClient, err := rest.HTTPClientFor(restConfig) + Expect(err).NotTo(HaveOccurred()) + mapper, err := apiutil.NewDynamicRESTMapper(restConfig, httpClient) Expect(err).NotTo(HaveOccurred()) mgr, err := manager.New(restConfig, manager.Options{