Skip to content

Commit c767773

Browse files
committed
use csi-lib-utils for leader election, also add support for lease based leader election
Signed-off-by: Andrew Sy Kim <[email protected]>
1 parent dad74d4 commit c767773

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

cmd/csi-provisioner/csi-provisioner.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
goflag "flag"
2122
"fmt"
2223
"math/rand"
@@ -28,6 +29,7 @@ import (
2829
flag "github.com/spf13/pflag"
2930

3031
"github.com/kubernetes-csi/csi-lib-utils/deprecatedflags"
32+
"github.com/kubernetes-csi/csi-lib-utils/leaderelection"
3133
ctrl "github.com/kubernetes-csi/external-provisioner/pkg/controller"
3234
snapclientset "github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned"
3335
"sigs.k8s.io/sig-storage-lib-external-provisioner/controller"
@@ -52,19 +54,25 @@ var (
5254
volumeNamePrefix = flag.String("volume-name-prefix", "pvc", "Prefix to apply to the name of a created volume.")
5355
volumeNameUUIDLength = flag.Int("volume-name-uuid-length", -1, "Truncates generated UUID of a created volume to this length. Defaults behavior is to NOT truncate.")
5456
showVersion = flag.Bool("version", false, "Show version.")
55-
enableLeaderElection = flag.Bool("enable-leader-election", false, "Enables leader election. If leader election is enabled, additional RBAC rules are required. Please refer to the Kubernetes CSI documentation for instructions on setting up these RBAC rules.")
5657
retryIntervalStart = flag.Duration("retry-interval-start", time.Second, "Initial retry interval of failed provisioning or deletion. It doubles with each failure, up to retry-interval-max.")
5758
retryIntervalMax = flag.Duration("retry-interval-max", 5*time.Minute, "Maximum retry interval of failed provisioning or deletion.")
5859
workerThreads = flag.Uint("worker-threads", 100, "Number of provisioner worker threads, in other words nr. of simultaneous CSI calls.")
5960
operationTimeout = flag.Duration("timeout", 10*time.Second, "Timeout for waiting for creation or deletion of a volume")
6061
_ = deprecatedflags.Add("provisioner")
6162

63+
enableLeaderElection = flag.Bool("enable-leader-election", false, "Enables leader election. If leader election is enabled, additional RBAC rules are required. Please refer to the Kubernetes CSI documentation for instructions on setting up these RBAC rules.")
64+
leaderElectionType = flag.String("leader-election-type", "endpoints", "the type of leader election, options are 'endpoints' (default) or 'leases' (strongly recommended)")
65+
6266
featureGates map[string]bool
6367
provisionController *controller.ProvisionController
6468
version = "unknown"
6569
)
6670

67-
func init() {
71+
type leaderElection interface {
72+
Run() error
73+
}
74+
75+
func main() {
6876
var config *rest.Config
6977
var err error
7078

@@ -178,8 +186,31 @@ func init() {
178186
serverVersion.GitVersion,
179187
provisionerOptions...,
180188
)
181-
}
182189

183-
func main() {
184-
provisionController.Run(wait.NeverStop)
190+
run := func(context.Context) {
191+
provisionController.Run(wait.NeverStop)
192+
}
193+
194+
if !*enableLeaderElection {
195+
run(context.TODO())
196+
} else {
197+
// this lock name pattern is also copied from sigs.k8s.io/sig-storage-lib-external-provisioner/controller
198+
// to preserve backwards compatibility
199+
lockName := strings.Replace(provisionerName, "/", "-", -1)
200+
201+
var le leaderElection
202+
if *leaderElectionType == "endpoints" {
203+
le = leaderelection.NewLeaderElectionWithEndpoints(clientset, lockName, run)
204+
} else if *leaderElectionType == "leases" {
205+
le = leaderelection.NewLeaderElection(clientset, lockName, run)
206+
} else {
207+
klog.Error("--leader-election-type must be either 'endpoints' or 'lease'")
208+
os.Exit(1)
209+
}
210+
211+
if err := le.Run(); err != nil {
212+
klog.Fatalf("failed to initialize leader election: %v", err)
213+
}
214+
}
215+
185216
}

0 commit comments

Comments
 (0)