@@ -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,13 @@ 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 nil , nil
196
206
}
197
207
198
208
ns , name := parseSecretString (secretString )
@@ -201,24 +211,35 @@ func (cp *CloudProvider) readSSLSecret(svc *v1.Service) (string, string, error)
201
211
}
202
212
secret , err := cp .kubeclient .CoreV1 ().Secrets (ns ).Get (name , metav1.GetOptions {})
203
213
if err != nil {
204
- return "" , "" , err
214
+ return nil , err
205
215
}
206
216
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 )
217
+ var cacert , cert , key , pass []byte
218
+ var cacertstr , passstr string
219
+ if cacert , ok = secret .Data [SSLCAFileName ]; ! ok {
220
+ cacertstr = ""
221
+ } else {
222
+ cacertstr = string (cacert )
210
223
}
211
- if key , ok = secret .Data [sslPrivateKeyFileName ]; ! ok {
212
- return "" , "" , errors .Errorf ("%s not found in secret %s/%s" , sslPrivateKeyFileName , ns , name )
224
+ if cert , ok = secret .Data [SSLCertificateFileName ]; ! ok {
225
+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLCertificateFileName , ns , name )
213
226
}
214
-
215
- return string (cert ), string (key ), nil
227
+ if key , ok = secret .Data [SSLPrivateKeyFileName ]; ! ok {
228
+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLPrivateKeyFileName , ns , name )
229
+ }
230
+ if pass , ok = secret .Data [SSLPassphrase ]; ! ok {
231
+ passstr = ""
232
+ } else {
233
+ passstr = string (pass )
234
+ }
235
+ return & SSLK8SSecret {CACert : cacertstr , PublicCert : string (cert ), PrivateKey : string (key ),
236
+ Passphrase : passstr }, nil
216
237
}
217
238
218
239
// ensureSSLCertificate creates a OCI SSL certificate to the given load
219
240
// 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
241
+ func (cp * CloudProvider ) ensureSSLCertificate (ctx context.Context , lb * loadbalancer.LoadBalancer , sslConfig * SSLConfig , svc * v1. Service ) error {
242
+ name := sslConfig .Name
222
243
logger := cp .logger .With ("loadBalancerID" , * lb .Id , "certificateName" , name )
223
244
_ , err := cp .client .LoadBalancer ().GetCertificateByName (ctx , * lb .Id , name )
224
245
if err == nil {
@@ -230,7 +251,8 @@ func (cp *CloudProvider) ensureSSLCertificate(ctx context.Context, lb *loadbalan
230
251
}
231
252
232
253
// Although we iterate here only one certificate is supported at the moment.
233
- certs , err := spec .Certificates ()
254
+ certs := make (map [string ]loadbalancer.CertificateDetails )
255
+ err = buildCertificates (sslConfig , svc , certs )
234
256
if err != nil {
235
257
return err
236
258
}
@@ -266,7 +288,12 @@ func (cp *CloudProvider) createLoadBalancer(ctx context.Context, spec *LBSpec) (
266
288
}
267
289
268
290
// Then we create the load balancer and wait for it to be online.
269
- certs , err := spec .Certificates ()
291
+ certs := make (map [string ]loadbalancer.CertificateDetails )
292
+ err = buildCertificates (spec .ListenerSSLConfig , spec .service , certs )
293
+ if err != nil {
294
+ return nil , errors .Wrap (err , "get certificates" )
295
+ }
296
+ err = buildCertificates (spec .BackendSetSSLConfig , spec .service , certs )
270
297
if err != nil {
271
298
return nil , errors .Wrap (err , "get certificates" )
272
299
}
@@ -323,16 +350,17 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
323
350
}
324
351
exists := ! client .IsNotFound (err )
325
352
326
- var ssl * SSLConfig
353
+ var sslListener , sslBackendSet * SSLConfig
327
354
if requiresCertificate (service ) {
328
355
ports , err := getSSLEnabledPorts (service )
329
356
if err != nil {
330
357
return nil , err
331
358
}
332
- ssl = NewSSLConfig (lbName , ports , cp )
359
+ sslListener = NewSSLConfig (lbName , ServiceAnnotationLoadBalancerTLSSecret , ports , cp )
360
+ sslBackendSet = NewSSLConfig (lbName , ServiceAnnotationLoadBalancerBackendSetSecret , ports , cp )
333
361
}
334
362
subnets := []string {cp .config .LoadBalancer .Subnet1 , cp .config .LoadBalancer .Subnet2 }
335
- spec , err := NewLBSpec (service , nodes , subnets , ssl , cp .securityListManagerFactory )
363
+ spec , err := NewLBSpec (service , nodes , subnets , sslListener , sslBackendSet , cp .securityListManagerFactory )
336
364
if err != nil {
337
365
logger .With (zap .Error (err )).Error ("Failed to derive LBSpec" )
338
366
return nil , err
@@ -351,8 +379,11 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
351
379
352
380
// If the load balancer needs an SSL cert ensure it is present.
353
381
if requiresCertificate (service ) {
354
- if err := cp .ensureSSLCertificate (ctx , lb , spec ); err != nil {
355
- return nil , errors .Wrap (err , "ensuring ssl certificate" )
382
+ if err := cp .ensureSSLCertificate (ctx , lb , spec .ListenerSSLConfig , spec .service ); err != nil {
383
+ return nil , errors .Wrap (err , "ensuring ssl certificate for listeners" )
384
+ }
385
+ if err := cp .ensureSSLCertificate (ctx , lb , spec .BackendSetSSLConfig , spec .service ); err != nil {
386
+ return nil , errors .Wrap (err , "ensuring ssl certificate for backend sets" )
356
387
}
357
388
}
358
389
0 commit comments