From 3fb78f379641d8b38b39c794b3366f274b318f14 Mon Sep 17 00:00:00 2001 From: Richard Kovacs Date: Fri, 3 Jun 2022 07:58:53 +0200 Subject: [PATCH 1/2] Tune leader election --- main.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 4ce2dcf6..32ef4f28 100644 --- a/main.go +++ b/main.go @@ -77,8 +77,9 @@ const ( ) var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("api-manager") + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("api-manager") + leaderRetryDuration = 5 * time.Second ) func init() { @@ -137,6 +138,7 @@ func main() { var pvcLabelSyncWorkers int var enablePVCLabelSync bool var enableNodeLabelSync bool + var leaderRenewSeconds uint flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") flag.BoolVar(&enableLeaderElection, "enable-leader-election", false, @@ -179,6 +181,7 @@ func main() { flag.IntVar(&pvcLabelSyncWorkers, "pvc-label-sync-workers", 5, "Maximum concurrent PVC label sync operations.") flag.BoolVar(&enablePVCLabelSync, "enable-pvc-label-sync", true, "Enable pvc label sync controller.") flag.BoolVar(&enableNodeLabelSync, "enable-node-label-sync", true, "Enable node label sync controller.") + flag.UintVar(&leaderRenewSeconds, "leader-renew-seconds", 10, "Leader renewal frequency.") loggerOpts.BindFlags(flag.CommandLine) flag.Parse() @@ -234,14 +237,21 @@ func main() { } } + renewDeadline := time.Duration(leaderRenewSeconds) * time.Second + leaseDuration := time.Duration(int(1.2*float64(leaderRenewSeconds))) * time.Second + // Only attempt to grab leader lock once we have an API connection. mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, - LeaderElection: enableLeaderElection, - LeaderElectionID: "storageos-api-manager-leader", - LeaderElectionNamespace: namespace, + Scheme: scheme, + MetricsBindAddress: metricsAddr, + Port: 9443, + LeaderElection: enableLeaderElection, + LeaderElectionID: "storageos-api-manager-leader", + LeaderElectionNamespace: namespace, + LeaderElectionResourceLock: "leases", + RenewDeadline: &renewDeadline, + LeaseDuration: &leaseDuration, + RetryPeriod: &leaderRetryDuration, }) if err != nil { fatal(err, "unable to start manager") From 473d9c42ae74a82cda47885c4cf8da202cabc57b Mon Sep 17 00:00:00 2001 From: Richard Kovacs Date: Tue, 7 Jun 2022 10:44:24 +0200 Subject: [PATCH 2/2] Review fix --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 32ef4f28..98595c8e 100644 --- a/main.go +++ b/main.go @@ -40,6 +40,7 @@ import ( "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -248,7 +249,7 @@ func main() { LeaderElection: enableLeaderElection, LeaderElectionID: "storageos-api-manager-leader", LeaderElectionNamespace: namespace, - LeaderElectionResourceLock: "leases", + LeaderElectionResourceLock: resourcelock.LeasesResourceLock, RenewDeadline: &renewDeadline, LeaseDuration: &leaseDuration, RetryPeriod: &leaderRetryDuration,