@@ -34,6 +34,9 @@ type controllerCmd struct {
3434 tlsInsecureSkipVerify bool
3535 tlsOverrideCertificateName string
3636
37+ leaderElectionID string
38+ leaderElectionNamespace string
39+
3740 sharedSecret string
3841
3942 debug bool
@@ -62,6 +65,8 @@ const (
6265 databrokerTLSCA = "databroker-tls-ca"
6366 tlsInsecureSkipVerify = "databroker-tls-insecure-skip-verify"
6467 tlsOverrideCertificateName = "databroker-tls-override-certificate-name"
68+ leaderElectionID = "leader-election-id"
69+ leaderElectionNamespace = "leader-election-namespace"
6570)
6671
6772func (s * controllerCmd ) setupFlags () error {
@@ -76,6 +81,8 @@ func (s *controllerCmd) setupFlags() error {
7681 "disable remote hosts TLS certificate chain and hostname check for the databroker connection" )
7782 flags .StringVar (& s .tlsOverrideCertificateName , tlsOverrideCertificateName , "" ,
7883 "override the certificate name used for the databroker connection" )
84+ flags .StringVar (& s .leaderElectionID , leaderElectionID , "pomerium-ingress-controller" , "leader election lease name" )
85+ flags .StringVar (& s .leaderElectionNamespace , leaderElectionNamespace , "" , "leader election lease namespace" )
7986
8087 flags .StringVar (& s .sharedSecret , sharedSecret , "" ,
8188 "base64-encoded shared secret for signing JWTs" )
@@ -99,7 +106,7 @@ func (s *controllerCmd) exec(*cobra.Command, []string) error {
99106
100107 eg , ctx := errgroup .WithContext (ctx )
101108 eg .Go (func () error {
102- return runHealthz (ctx , s .probeAddr , healthz .NamedCheck ("acquire-databroker- lease" , c .ReadyzCheck ))
109+ return runHealthz (ctx , s .probeAddr , healthz .NamedCheck ("acquire-lease" , c .ReadyzCheck ))
103110 })
104111 eg .Go (func () error { return c .Run (ctx ) })
105112
@@ -141,37 +148,40 @@ func (s *controllerCmd) buildController(ctx context.Context) (*controllers.Contr
141148 return nil , fmt .Errorf ("get scheme: %w" , err )
142149 }
143150
144- conn , err := s .getDataBrokerConnection ( ctx )
151+ globalSettings , err := s .getGlobalSettings ( )
145152 if err != nil {
146- return nil , fmt .Errorf ("databroker connection: %w" , err )
147- }
148- client := databroker .NewDataBrokerServiceClient (conn )
149- var reconciler pomerium.Reconciler
150- if s .SyncAPIURL != "" {
151- reconciler = pomerium .NewAPIReconciler (s .SyncAPIURL , s .SyncAPIToken )
152- } else {
153- reconciler = pomerium .NewDataBrokerReconciler (client , s .debug )
153+ return nil , err
154154 }
155155
156156 c := & controllers.Controller {
157- Reconciler : reconciler ,
158- DataBrokerServiceClient : client ,
159157 MgrOpts : ctrl.Options {
160- Scheme : scheme ,
161- Metrics : metricsserver.Options {BindAddress : s .metricsAddr },
162- LeaderElection : false ,
158+ Scheme : scheme ,
159+ Metrics : metricsserver.Options {BindAddress : s .metricsAddr },
163160 Controller : config.Controller {
164161 SkipNameValidation : ptr .To (true ),
165162 },
166163 },
167164 IngressCtrlOpts : opts ,
168165 GatewayControllerConfig : gatewayConfig ,
166+ GlobalSettings : globalSettings ,
169167 }
170168
171- c .GlobalSettings , err = s .getGlobalSettings ()
169+ if s .SyncAPIURL != "" {
170+ c .Reconciler = pomerium .NewAPIReconciler (s .SyncAPIURL , s .SyncAPIToken )
171+ c .MgrOpts .LeaderElection = true
172+ c .MgrOpts .LeaderElectionID = s .leaderElectionID
173+ c .MgrOpts .LeaderElectionNamespace = s .leaderElectionNamespace
174+ return c , nil
175+ } else if f := s .Flags (); f .Changed (leaderElectionID ) || f .Changed (leaderElectionNamespace ) {
176+ return nil , fmt .Errorf ("kubernetes leader election can be used only with sync API" )
177+ }
178+
179+ conn , err := s .getDataBrokerConnection (ctx )
172180 if err != nil {
173- return nil , err
181+ return nil , fmt . Errorf ( "databroker connection: %w" , err )
174182 }
175183
184+ c .DataBrokerServiceClient = databroker .NewDataBrokerServiceClient (conn )
185+ c .Reconciler = pomerium .NewDataBrokerReconciler (c .DataBrokerServiceClient , s .debug )
176186 return c , nil
177187}
0 commit comments