Skip to content

Commit 318aa09

Browse files
authored
Merge pull request #3036 from k8s-infra-cherrypick-robot/cherry-pick-3031-to-release-0.18
[release-0.18] 🐛 Use leader elector with client timeout
2 parents 267b59e + 98e5e8d commit 318aa09

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

pkg/leaderelection/leader_election.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"errors"
2121
"fmt"
2222
"os"
23+
"time"
2324

2425
"k8s.io/apimachinery/pkg/util/uuid"
2526
coordinationv1client "k8s.io/client-go/kubernetes/typed/coordination/v1"
@@ -49,6 +50,12 @@ type Options struct {
4950
// LeaderElectionID determines the name of the resource that leader election
5051
// will use for holding the leader lock.
5152
LeaderElectionID string
53+
54+
// RenewDeadline is the renew deadline for this leader election client.
55+
// Must be set to ensure the resource lock has an appropriate client timeout.
56+
// Without that, a single slow response from the API server can result
57+
// in losing leadership.
58+
RenewDeadline time.Duration
5259
}
5360

5461
// NewResourceLock creates a new resource lock for use in a leader election loop.
@@ -88,6 +95,20 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op
8895

8996
// Construct clients for leader election
9097
rest.AddUserAgent(config, "leader-election")
98+
99+
if options.RenewDeadline != 0 {
100+
return resourcelock.NewFromKubeconfig(options.LeaderElectionResourceLock,
101+
options.LeaderElectionNamespace,
102+
options.LeaderElectionID,
103+
resourcelock.ResourceLockConfig{
104+
Identity: id,
105+
EventRecorder: recorderProvider.GetEventRecorderFor(id),
106+
},
107+
config,
108+
options.RenewDeadline,
109+
)
110+
}
111+
91112
corev1Client, err := corev1client.NewForConfig(config)
92113
if err != nil {
93114
return nil, err
@@ -97,7 +118,6 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op
97118
if err != nil {
98119
return nil, err
99120
}
100-
101121
return resourcelock.New(options.LeaderElectionResourceLock,
102122
options.LeaderElectionNamespace,
103123
options.LeaderElectionID,
@@ -106,7 +126,8 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op
106126
resourcelock.ResourceLockConfig{
107127
Identity: id,
108128
EventRecorder: recorderProvider.GetEventRecorderFor(id),
109-
})
129+
},
130+
)
110131
}
111132

112133
func getInClusterNamespace() (string, error) {

pkg/manager/manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ func New(config *rest.Config, options Options) (Manager, error) {
389389
LeaderElectionResourceLock: options.LeaderElectionResourceLock,
390390
LeaderElectionID: options.LeaderElectionID,
391391
LeaderElectionNamespace: options.LeaderElectionNamespace,
392+
RenewDeadline: *options.RenewDeadline,
392393
})
393394
if err != nil {
394395
return nil, err

pkg/manager/manager_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,28 @@ var _ = Describe("manger.Manager", func() {
316316
<-m2done
317317
})
318318

319+
It("should default RenewDeadline for leader election config", func() {
320+
var rl resourcelock.Interface
321+
m1, err := New(cfg, Options{
322+
LeaderElection: true,
323+
LeaderElectionNamespace: "default",
324+
LeaderElectionID: "test-leader-election-id",
325+
newResourceLock: func(config *rest.Config, recorderProvider recorder.Provider, options leaderelection.Options) (resourcelock.Interface, error) {
326+
if options.RenewDeadline != 10*time.Second {
327+
return nil, fmt.Errorf("expected RenewDeadline to be 10s, got %v", options.RenewDeadline)
328+
}
329+
var err error
330+
rl, err = leaderelection.NewResourceLock(config, recorderProvider, options)
331+
return rl, err
332+
},
333+
HealthProbeBindAddress: "0",
334+
Metrics: metricsserver.Options{BindAddress: "0"},
335+
PprofBindAddress: "0",
336+
})
337+
Expect(err).ToNot(HaveOccurred())
338+
Expect(m1).ToNot(BeNil())
339+
})
340+
319341
It("should default ID to controller-runtime if ID is not set", func() {
320342
var rl resourcelock.Interface
321343
m1, err := New(cfg, Options{

0 commit comments

Comments
 (0)