Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions charts/vigil-controller/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@ spec:
{{- end }}
{{- if .Values.controllerManager.leaderElection.enabled }}
- --leader-elect
{{- with .Values.controllerManager.leaderElection.leaseDuration }}
- --leader-election-lease-duration={{ . }}
{{- end }}
{{- with .Values.controllerManager.leaderElection.renewDeadline }}
- --leader-election-renew-deadline={{ . }}
{{- end }}
{{- with .Values.controllerManager.leaderElection.retryPeriod }}
- --leader-election-retry-period={{ . }}
{{- end }}
{{- end }}
- --health-probe-bind-address={{ .Values.controllerManager.healthProbeBindAddress }}
- --metrics-bind-address={{ .Values.controllerManager.metricsBindAddress }}
Expand Down
9 changes: 9 additions & 0 deletions charts/vigil-controller/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,15 @@ controllerManager:
leaderElection:
# -- Enable leader election
enabled: true
# -- Duration that non-leader candidates will wait to force acquire leadership.
# Shorter values mean faster failover but more API server load.
leaseDuration: "15s"
# -- Duration the acting leader will retry refreshing leadership before giving up.
# Must be less than leaseDuration.
renewDeadline: "10s"
# -- Duration between leader election retry attempts.
# Must be less than renewDeadline.
retryPeriod: "2s"
# -- Log level (debug, info, warn, error)
logLevel: "info"
# -- Health probe bind address
Expand Down
29 changes: 24 additions & 5 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ func main() {
var metricsAddr string
var probeAddr string
var enableLeaderElection bool
var leaseDuration time.Duration
var renewDeadline time.Duration
var retryPeriod time.Duration

flag.StringVar(&configFile, "config", "/etc/vigil/config/config.yaml",
"Path to the controller configuration file.")
Expand All @@ -47,13 +50,31 @@ func main() {
"The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
"Enable leader election for controller manager.")
flag.DurationVar(&leaseDuration, "leader-election-lease-duration", 15*time.Second,
"Duration that non-leader candidates will wait to force acquire leadership.")
flag.DurationVar(&renewDeadline, "leader-election-renew-deadline", 10*time.Second,
"Duration the acting leader will retry refreshing leadership before giving up.")
flag.DurationVar(&retryPeriod, "leader-election-retry-period", 2*time.Second,
"Duration between leader election retry attempts.")

opts := zap.Options{Development: true}
opts.BindFlags(flag.CommandLine)
flag.Parse()

ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))

// Validate leader election timing constraints
if renewDeadline >= leaseDuration {
setupLog.Error(nil, "leader-election-renew-deadline must be less than leader-election-lease-duration",
"renew-deadline", renewDeadline, "lease-duration", leaseDuration)
os.Exit(1)
}
if retryPeriod >= renewDeadline {
setupLog.Error(nil, "leader-election-retry-period must be less than leader-election-renew-deadline",
"retry-period", retryPeriod, "renew-deadline", renewDeadline)
os.Exit(1)
}

// Load configuration
cfg, err := config.Load(configFile)
if err != nil {
Expand Down Expand Up @@ -82,9 +103,9 @@ func main() {
HealthProbeBindAddress: probeAddr,
LeaderElection: enableLeaderElection,
LeaderElectionID: "vigil-controller.nextdoor.com",
LeaseDuration: ptr(15 * time.Second),
RenewDeadline: ptr(10 * time.Second),
RetryPeriod: ptr(2 * time.Second),
LeaseDuration: &leaseDuration,
RenewDeadline: &renewDeadline,
RetryPeriod: &retryPeriod,
LeaderElectionReleaseOnCancel: true,
})
if err != nil {
Expand Down Expand Up @@ -150,5 +171,3 @@ func main() {
os.Exit(1)
}
}

func ptr[T any](v T) *T { return &v }