@@ -63,6 +63,12 @@ const (
63
63
// See: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
64
64
ServiceAnnotationLoadBalancerTLSSecret = "service.beta.kubernetes.io/oci-load-balancer-tls-secret"
65
65
66
+ // ServiceAnnotationLoadBalancerBackendSetSecret is a Service annotation for
67
+ // specifying the generic secret to install on the load balancer listeners which
68
+ // have SSL enabled.
69
+ // See: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
70
+ ServiceAnnotationLoadBalancerBackendSetSecret = "service.beta.kubernetes.io/oci-load-balancer-backendset-secret"
71
+
66
72
// ServiceAnnotationLoadBalancerConnectionIdleTimeout is the annotation used
67
73
// on the service to specify the idle connection timeout.
68
74
ServiceAnnotationLoadBalancerConnectionIdleTimeout = "service.beta.kubernetes.io/oci-load-balancer-connection-idle-timeout"
@@ -89,9 +95,10 @@ const (
89
95
// Fallback value if annotation on service is not set
90
96
lbDefaultShape = "100Mbps"
91
97
92
- lbNodesHealthCheckPath = "/healthz"
93
- lbNodesHealthCheckPort = k8sports .ProxyHealthzPort
94
- lbNodesHealthCheckProto = "HTTP"
98
+ lbNodesHealthCheckPath = "/healthz"
99
+ lbNodesHealthCheckPort = k8sports .ProxyHealthzPort
100
+ lbNodesHealthCheckProtoHTTP = "HTTP"
101
+ lbNodesHealthCheckProtoTCP = "TCP"
95
102
)
96
103
97
104
// GetLoadBalancer returns whether the specified load balancer exists, and if
@@ -189,10 +196,14 @@ func getSubnetsForNodes(ctx context.Context, nodes []*v1.Node, client client.Int
189
196
190
197
// readSSLSecret returns the certificate and private key from a Kubernetes TLS
191
198
// private key Secret.
192
- func (cp * CloudProvider ) readSSLSecret (svc * v1.Service ) (string , string , error ) {
193
- secretString , ok := svc .Annotations [ServiceAnnotationLoadBalancerTLSSecret ]
199
+ func (cp * CloudProvider ) readSSLSecret (secretType string , svc * v1.Service ) (* SSLK8SSecret , error ) {
200
+ secretString , ok := svc .Annotations [secretType ]
201
+ if ! ok && secretType == ServiceAnnotationLoadBalancerTLSSecret {
202
+ return nil , errors .Errorf ("no %q annotation found" , secretType )
203
+ }
194
204
if ! ok {
195
- return "" , "" , errors .Errorf ("no %q annotation found" , ServiceAnnotationLoadBalancerTLSSecret )
205
+ return & SSLK8SSecret {CACert : "" , PublicCert : "" , PrivateKey : "" ,
206
+ Passphrase : "" }, nil
196
207
}
197
208
198
209
ns , name := parseSecretString (secretString )
@@ -201,24 +212,35 @@ func (cp *CloudProvider) readSSLSecret(svc *v1.Service) (string, string, error)
201
212
}
202
213
secret , err := cp .kubeclient .CoreV1 ().Secrets (ns ).Get (name , metav1.GetOptions {})
203
214
if err != nil {
204
- return "" , "" , err
215
+ return nil , err
205
216
}
206
217
207
- var cert , key []byte
208
- if cert , ok = secret .Data [sslCertificateFileName ]; ! ok {
209
- return "" , "" , errors .Errorf ("%s not found in secret %s/%s" , sslCertificateFileName , ns , name )
218
+ var cacert , cert , key , pass []byte
219
+ var cacertstr , passstr string
220
+ if cacert , ok = secret .Data [SSLCAFileName ]; ! ok {
221
+ cacertstr = ""
222
+ } else {
223
+ cacertstr = string (cacert )
210
224
}
211
- if key , ok = secret .Data [sslPrivateKeyFileName ]; ! ok {
212
- return "" , "" , errors .Errorf ("%s not found in secret %s/%s" , sslPrivateKeyFileName , ns , name )
225
+ if cert , ok = secret .Data [SSLCertificateFileName ]; ! ok {
226
+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLCertificateFileName , ns , name )
213
227
}
214
-
215
- return string (cert ), string (key ), nil
228
+ if key , ok = secret .Data [SSLPrivateKeyFileName ]; ! ok {
229
+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLPrivateKeyFileName , ns , name )
230
+ }
231
+ if pass , ok = secret .Data [SSLPassphrase ]; ! ok {
232
+ passstr = ""
233
+ } else {
234
+ passstr = string (pass )
235
+ }
236
+ return & SSLK8SSecret {CACert : cacertstr , PublicCert : string (cert ), PrivateKey : string (key ),
237
+ Passphrase : passstr }, nil
216
238
}
217
239
218
240
// ensureSSLCertificate creates a OCI SSL certificate to the given load
219
241
// balancer, if it doesn't already exist.
220
- func (cp * CloudProvider ) ensureSSLCertificate (ctx context.Context , lb * loadbalancer.LoadBalancer , spec * LBSpec ) error {
221
- name := spec . SSLConfig .Name
242
+ func (cp * CloudProvider ) ensureSSLCertificate (ctx context.Context , lb * loadbalancer.LoadBalancer , sslConfig * SSLConfig , svc * v1. Service ) error {
243
+ name := sslConfig .Name
222
244
logger := cp .logger .With ("loadBalancerID" , * lb .Id , "certificateName" , name )
223
245
_ , err := cp .client .LoadBalancer ().GetCertificateByName (ctx , * lb .Id , name )
224
246
if err == nil {
@@ -230,7 +252,8 @@ func (cp *CloudProvider) ensureSSLCertificate(ctx context.Context, lb *loadbalan
230
252
}
231
253
232
254
// Although we iterate here only one certificate is supported at the moment.
233
- certs , err := spec .Certificates ()
255
+ certs := make (map [string ]loadbalancer.CertificateDetails )
256
+ err = buildCertificates (sslConfig , svc , certs )
234
257
if err != nil {
235
258
return err
236
259
}
@@ -266,7 +289,12 @@ func (cp *CloudProvider) createLoadBalancer(ctx context.Context, spec *LBSpec) (
266
289
}
267
290
268
291
// Then we create the load balancer and wait for it to be online.
269
- certs , err := spec .Certificates ()
292
+ certs := make (map [string ]loadbalancer.CertificateDetails )
293
+ err = buildCertificates (spec .ListenerSSLConfig , spec .service , certs )
294
+ if err != nil {
295
+ return nil , errors .Wrap (err , "get certificates" )
296
+ }
297
+ err = buildCertificates (spec .BackendSetSSLConfig , spec .service , certs )
270
298
if err != nil {
271
299
return nil , errors .Wrap (err , "get certificates" )
272
300
}
@@ -323,16 +351,17 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
323
351
}
324
352
exists := ! client .IsNotFound (err )
325
353
326
- var ssl * SSLConfig
354
+ var sslListener , sslBackendSet * SSLConfig
327
355
if requiresCertificate (service ) {
328
356
ports , err := getSSLEnabledPorts (service )
329
357
if err != nil {
330
358
return nil , err
331
359
}
332
- ssl = NewSSLConfig (lbName , ports , cp )
360
+ sslListener = NewSSLConfig (lbName , ServiceAnnotationLoadBalancerTLSSecret , ports , cp )
361
+ sslBackendSet = NewSSLConfig (lbName , ServiceAnnotationLoadBalancerBackendSetSecret , ports , cp )
333
362
}
334
363
subnets := []string {cp .config .LoadBalancer .Subnet1 , cp .config .LoadBalancer .Subnet2 }
335
- spec , err := NewLBSpec (service , nodes , subnets , ssl , cp .securityListManagerFactory )
364
+ spec , err := NewLBSpec (service , nodes , subnets , sslListener , sslBackendSet , cp .securityListManagerFactory )
336
365
if err != nil {
337
366
logger .With (zap .Error (err )).Error ("Failed to derive LBSpec" )
338
367
return nil , err
@@ -351,8 +380,11 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
351
380
352
381
// If the load balancer needs an SSL cert ensure it is present.
353
382
if requiresCertificate (service ) {
354
- if err := cp .ensureSSLCertificate (ctx , lb , spec ); err != nil {
355
- return nil , errors .Wrap (err , "ensuring ssl certificate" )
383
+ if err := cp .ensureSSLCertificate (ctx , lb , spec .ListenerSSLConfig , spec .service ); err != nil {
384
+ return nil , errors .Wrap (err , "ensuring ssl certificate for listeners" )
385
+ }
386
+ if err := cp .ensureSSLCertificate (ctx , lb , spec .BackendSetSSLConfig , spec .service ); err != nil {
387
+ return nil , errors .Wrap (err , "ensuring ssl certificate for backend sets" )
356
388
}
357
389
}
358
390
0 commit comments