@@ -63,6 +63,12 @@ const (
6363 // See: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
6464 ServiceAnnotationLoadBalancerTLSSecret = "service.beta.kubernetes.io/oci-load-balancer-tls-secret"
6565
66+ // ServiceAnnotationLoadBalancerTLSBackendSetSecret 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+ ServiceAnnotationLoadBalancerTLSBackendSetSecret = "service.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret"
71+
6672 // ServiceAnnotationLoadBalancerConnectionIdleTimeout is the annotation used
6773 // on the service to specify the idle connection timeout.
6874 ServiceAnnotationLoadBalancerConnectionIdleTimeout = "service.beta.kubernetes.io/oci-load-balancer-connection-idle-timeout"
@@ -89,9 +95,10 @@ const (
8995 // Fallback value if annotation on service is not set
9096 lbDefaultShape = "100Mbps"
9197
92- lbNodesHealthCheckPath = "/healthz"
93- lbNodesHealthCheckPort = k8sports .ProxyHealthzPort
94- lbNodesHealthCheckProto = "HTTP"
98+ lbNodesHealthCheckPath = "/healthz"
99+ lbNodesHealthCheckPort = k8sports .ProxyHealthzPort
100+ lbNodesHealthCheckProtoHTTP = "HTTP"
101+ lbNodesHealthCheckProtoTCP = "TCP"
95102)
96103
97104// GetLoadBalancer returns whether the specified load balancer exists, and if
@@ -189,62 +196,48 @@ func getSubnetsForNodes(ctx context.Context, nodes []*v1.Node, client client.Int
189196
190197// readSSLSecret returns the certificate and private key from a Kubernetes TLS
191198// private key Secret.
192- func (cp * CloudProvider ) readSSLSecret (svc * v1.Service ) (string , string , error ) {
193- secretString , ok := svc .Annotations [ServiceAnnotationLoadBalancerTLSSecret ]
194- if ! ok {
195- return "" , "" , errors .Errorf ("no %q annotation found" , ServiceAnnotationLoadBalancerTLSSecret )
196- }
197-
198- ns , name := parseSecretString (secretString )
199- if ns == "" {
200- ns = svc .Namespace
201- }
199+ func (cp * CloudProvider ) readSSLSecret (ns , name string ) (* certificateData , error ) {
202200 secret , err := cp .kubeclient .CoreV1 ().Secrets (ns ).Get (name , metav1.GetOptions {})
203201 if err != nil {
204- return "" , "" , err
202+ return nil , err
205203 }
206-
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 )
204+ var ok bool
205+ var cacert , cert , key , pass []byte
206+ cacert = secret .Data [SSLCAFileName ]
207+ if cert , ok = secret .Data [SSLCertificateFileName ]; ! ok {
208+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLCertificateFileName , ns , name )
210209 }
211- if key , ok = secret .Data [sslPrivateKeyFileName ]; ! ok {
212- return "" , "" , errors .Errorf ("%s not found in secret %s/%s" , sslPrivateKeyFileName , ns , name )
210+ if key , ok = secret .Data [SSLPrivateKeyFileName ]; ! ok {
211+ return nil , errors .Errorf ("%s not found in secret %s/%s" , SSLPrivateKeyFileName , ns , name )
213212 }
214-
215- return string ( cert ), string ( key ) , nil
213+ pass = secret . Data [ SSLPassphrase ]
214+ return & certificateData { CACert : cacert , PublicCert : cert , PrivateKey : key , Passphrase : pass } , nil
216215}
217216
218217// ensureSSLCertificate creates a OCI SSL certificate to the given load
219218// 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
222- logger := cp .logger .With ("loadBalancerID" , * lb .Id , "certificateName" , name )
223- _ , err := cp .client .LoadBalancer ().GetCertificateByName (ctx , * lb .Id , name )
224- if err == nil {
225- logger .Debug ("Certificate already exists on load balancer. Nothing to do." )
226- return nil
227- }
228- if ! client .IsNotFound (err ) {
229- return err
230- }
231-
232- // Although we iterate here only one certificate is supported at the moment.
219+ func (cp * CloudProvider ) ensureSSLCertificates (ctx context.Context , lb * loadbalancer.LoadBalancer , spec * LBSpec ) error {
220+ logger := cp .logger .With ("loadBalancerID" , * lb .Id )
221+ // Get all required certificates
233222 certs , err := spec .Certificates ()
234223 if err != nil {
235224 return err
236225 }
226+
237227 for _ , cert := range certs {
238- wrID , err := cp .client .LoadBalancer ().CreateCertificate (ctx , * lb .Id , * cert .PublicCertificate , * cert .PrivateKey )
239- if err != nil {
240- return err
241- }
242- _ , err = cp .client .LoadBalancer ().AwaitWorkRequest (ctx , wrID )
243- if err != nil {
244- return err
245- }
228+ if _ , ok := lb .Certificates [* cert .CertificateName ]; ! ok {
229+ logger = cp .logger .With ("certificateName" , * cert .CertificateName )
230+ wrID , err := cp .client .LoadBalancer ().CreateCertificate (ctx , * lb .Id , cert )
231+ if err != nil {
232+ return err
233+ }
234+ _ , err = cp .client .LoadBalancer ().AwaitWorkRequest (ctx , wrID )
235+ if err != nil {
236+ return err
237+ }
246238
247- logger .Info ("Certificate created" )
239+ logger .Info ("Certificate created" )
240+ }
248241 }
249242 return nil
250243}
@@ -323,16 +316,18 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
323316 }
324317 exists := ! client .IsNotFound (err )
325318
326- var ssl * SSLConfig
319+ var sslConfig * SSLConfig
327320 if requiresCertificate (service ) {
328321 ports , err := getSSLEnabledPorts (service )
329322 if err != nil {
330323 return nil , err
331324 }
332- ssl = NewSSLConfig (lbName , ports , cp )
325+ secretListenerString := service .Annotations [ServiceAnnotationLoadBalancerTLSSecret ]
326+ secretBackendSetString := service .Annotations [ServiceAnnotationLoadBalancerTLSBackendSetSecret ]
327+ sslConfig = NewSSLConfig (secretListenerString , secretBackendSetString , ports , cp )
333328 }
334329 subnets := []string {cp .config .LoadBalancer .Subnet1 , cp .config .LoadBalancer .Subnet2 }
335- spec , err := NewLBSpec (service , nodes , subnets , ssl , cp .securityListManagerFactory )
330+ spec , err := NewLBSpec (service , nodes , subnets , sslConfig , cp .securityListManagerFactory )
336331 if err != nil {
337332 logger .With (zap .Error (err )).Error ("Failed to derive LBSpec" )
338333 return nil , err
@@ -351,8 +346,8 @@ func (cp *CloudProvider) EnsureLoadBalancer(ctx context.Context, clusterName str
351346
352347 // If the load balancer needs an SSL cert ensure it is present.
353348 if requiresCertificate (service ) {
354- if err := cp .ensureSSLCertificate (ctx , lb , spec ); err != nil {
355- return nil , errors .Wrap (err , "ensuring ssl certificate " )
349+ if err := cp .ensureSSLCertificates (ctx , lb , spec ); err != nil {
350+ return nil , errors .Wrap (err , "ensuring ssl certificates " )
356351 }
357352 }
358353
0 commit comments