From 87924e53f0249900b0a9dc8eaf262f376abdba65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Przychodze=C5=84?= Date: Thu, 14 Jan 2021 10:49:42 +0100 Subject: [PATCH] [kube-controller-manager] Lower timeout for leaderelection resourcelock Migrate how resource lock and leader election config is generated to new way, hidding kubeClient. This also halfs kubeClient timeout, making it an useful value. If timeout is equal to RenewDeadline and we hit client timeout on request, there will be no retry, as RenewDeadline part will cancel the context and lose leader election. So setting a timeout to value at least equal to RenewDeadline is pointless. Setting it as half of RenewDeadline is a heuristic to resolve this missing retry problem without adding additional parameter. --- cmd/kube-controller-manager/app/config/config.go | 3 --- cmd/kube-controller-manager/app/controllermanager.go | 8 ++++---- cmd/kube-controller-manager/app/options/options.go | 12 +++--------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/cmd/kube-controller-manager/app/config/config.go b/cmd/kube-controller-manager/app/config/config.go index d3125b4a512..c5ae3348370 100644 --- a/cmd/kube-controller-manager/app/config/config.go +++ b/cmd/kube-controller-manager/app/config/config.go @@ -40,9 +40,6 @@ type Config struct { // the general kube client Client *clientset.Clientset - // the client only used for leader election - LeaderElectionClient *clientset.Clientset - // the rest config for the master Kubeconfig *restclient.Config diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 5bc022dd2f0..75153576a0b 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -270,15 +270,15 @@ func Run(c *config.CompletedConfig, stopCh <-chan struct{}) error { // add a uniquifier so that two processes on the same host don't accidentally both become active id = id + "_" + string(uuid.NewUUID()) - rl, err := resourcelock.New(c.ComponentConfig.Generic.LeaderElection.ResourceLock, + rl, err := resourcelock.NewFromKubeconfig(c.ComponentConfig.Generic.LeaderElection.ResourceLock, c.ComponentConfig.Generic.LeaderElection.ResourceNamespace, c.ComponentConfig.Generic.LeaderElection.ResourceName, - c.LeaderElectionClient.CoreV1(), - c.LeaderElectionClient.CoordinationV1(), resourcelock.ResourceLockConfig{ Identity: id, EventRecorder: c.EventRecorder, - }) + }, + c.Kubeconfig, + c.ComponentConfig.Generic.LeaderElection.RenewDeadline.Duration) if err != nil { klog.Fatalf("error creating lock: %v", err) } diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index d0475bd0c20..bbc03b8674e 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -441,18 +441,12 @@ func (s KubeControllerManagerOptions) Config(allControllers []string, disabledBy return nil, err } - // shallow copy, do not modify the kubeconfig.Timeout. - config := *kubeconfig - config.Timeout = s.Generic.LeaderElection.RenewDeadline.Duration - leaderElectionClient := clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "leader-election")) - eventRecorder := createRecorder(client, KubeControllerManagerUserAgent) c := &kubecontrollerconfig.Config{ - Client: client, - Kubeconfig: kubeconfig, - EventRecorder: eventRecorder, - LeaderElectionClient: leaderElectionClient, + Client: client, + Kubeconfig: kubeconfig, + EventRecorder: eventRecorder, } if err := s.ApplyTo(c); err != nil { return nil, err