From 575c6d7ad8ff0b7d76ef4e66c1505d82d050b4b6 Mon Sep 17 00:00:00 2001 From: deads2k Date: Thu, 13 Apr 2017 12:45:22 -0400 Subject: [PATCH] increase the QPS for namespace controller --- cmd/kube-controller-manager/app/core.go | 12 ++++++++++-- pkg/controller/namespace/namespace_controller.go | 14 +------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 8de3eb9fae0..439fa455a9d 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/controller" endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint" "k8s.io/kubernetes/pkg/controller/garbagecollector" @@ -102,9 +103,16 @@ func startNamespaceController(ctx ControllerContext) (bool, error) { // TODO: should use a dynamic RESTMapper built from the discovery results. restMapper := api.Registry.RESTMapper() + // the namespace cleanup controller is very chatty. It makes lots of discovery calls and then it makes lots of delete calls + // the ratelimiter negatively affects its speed. Deleting 100 total items in a namespace (that's only a few of each resource + // including events), takes ~10 seconds by default. + nsKubeconfig := ctx.ClientBuilder.ConfigOrDie("namespace-controller") + nsKubeconfig.QPS *= 10 + nsKubeconfig.Burst *= 10 + namespaceKubeClient := clientset.NewForConfigOrDie(nsKubeconfig) + namespaceClientPool := dynamic.NewClientPool(nsKubeconfig, restMapper, dynamic.LegacyAPIPathResolverFunc) + // Find the list of namespaced resources via discovery that the namespace controller must manage - namespaceKubeClient := ctx.ClientBuilder.ClientOrDie("namespace-controller") - namespaceClientPool := dynamic.NewClientPool(ctx.ClientBuilder.ConfigOrDie("namespace-controller"), restMapper, dynamic.LegacyAPIPathResolverFunc) // TODO: consider using a list-watch + cache here rather than polling resources, err := namespaceKubeClient.Discovery().ServerResources() if err != nil { diff --git a/pkg/controller/namespace/namespace_controller.go b/pkg/controller/namespace/namespace_controller.go index df1d535dc40..a9896cba053 100644 --- a/pkg/controller/namespace/namespace_controller.go +++ b/pkg/controller/namespace/namespace_controller.go @@ -50,20 +50,12 @@ const ( // NamespaceController is responsible for performing actions dependent upon a namespace phase type NamespaceController struct { - // client that purges namespace content, must have list/delete privileges on all content - kubeClient clientset.Interface - // clientPool manages a pool of dynamic clients - clientPool dynamic.ClientPool // lister that can list namespaces from a shared cache lister corelisters.NamespaceLister // returns true when the namespace cache is ready listerSynced cache.InformerSynced // namespaces that have been queued up for processing by workers queue workqueue.RateLimitingInterface - // function to list of preferred resources for namespace deletion - discoverResourcesFn func() ([]*metav1.APIResourceList, error) - // finalizerToken is the finalizer token managed by this controller - finalizerToken v1.FinalizerName // helper to delete all resources in the namespace when the namespace is deleted. namespacedResourcesDeleter deletion.NamespacedResourcesDeleterInterface } @@ -79,11 +71,7 @@ func NewNamespaceController( // create the controller so we can inject the enqueue function namespaceController := &NamespaceController{ - kubeClient: kubeClient, - clientPool: clientPool, - queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "namespace"), - discoverResourcesFn: discoverResourcesFn, - finalizerToken: finalizerToken, + queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "namespace"), namespacedResourcesDeleter: deletion.NewNamespacedResourcesDeleter(kubeClient.Core().Namespaces(), clientPool, kubeClient.Core(), discoverResourcesFn, finalizerToken, true), }