Add Support for Custom TLS Certificates in Connection Pooler (#2146)
* add volume with custom TLS config to pooler deployment * bump pg bouncer image tag which support new feature Co-authored-by: Jérémie Seguin <jeremie.seguin@malt.com>
This commit is contained in:
		
							parent
							
								
									625e804dc4
								
							
						
					
					
						commit
						3139c1f3d0
					
				|  | @ -631,7 +631,7 @@ spec: | ||||||
|                     default: "pooler" |                     default: "pooler" | ||||||
|                   connection_pooler_image: |                   connection_pooler_image: | ||||||
|                     type: string |                     type: string | ||||||
|                     default: "registry.opensource.zalan.do/acid/pgbouncer:master-24" |                     default: "registry.opensource.zalan.do/acid/pgbouncer:master-26" | ||||||
|                   connection_pooler_max_db_connections: |                   connection_pooler_max_db_connections: | ||||||
|                     type: integer |                     type: integer | ||||||
|                     default: 60 |                     default: 60 | ||||||
|  |  | ||||||
|  | @ -412,7 +412,7 @@ configConnectionPooler: | ||||||
|   # db user for pooler to use |   # db user for pooler to use | ||||||
|   connection_pooler_user: "pooler" |   connection_pooler_user: "pooler" | ||||||
|   # docker image |   # docker image | ||||||
|   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-24" |   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-26" | ||||||
|   # max db connections the pooler should hold |   # max db connections the pooler should hold | ||||||
|   connection_pooler_max_db_connections: 60 |   connection_pooler_max_db_connections: 60 | ||||||
|   # default pooling mode |   # default pooling mode | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ data: | ||||||
|   # connection_pooler_default_cpu_request: "500m" |   # connection_pooler_default_cpu_request: "500m" | ||||||
|   # connection_pooler_default_memory_limit: 100Mi |   # connection_pooler_default_memory_limit: 100Mi | ||||||
|   # connection_pooler_default_memory_request: 100Mi |   # connection_pooler_default_memory_request: 100Mi | ||||||
|   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-24" |   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-26" | ||||||
|   # connection_pooler_max_db_connections: 60 |   # connection_pooler_max_db_connections: 60 | ||||||
|   # connection_pooler_mode: "transaction" |   # connection_pooler_mode: "transaction" | ||||||
|   # connection_pooler_number_of_instances: 2 |   # connection_pooler_number_of_instances: 2 | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ spec: | ||||||
|       serviceAccountName: postgres-operator |       serviceAccountName: postgres-operator | ||||||
|       containers: |       containers: | ||||||
|       - name: postgres-operator |       - name: postgres-operator | ||||||
|         image: registry.opensource.zalan.do/acid/pgbouncer:master-24 |         image: registry.opensource.zalan.do/acid/pgbouncer:master-26 | ||||||
|         imagePullPolicy: IfNotPresent |         imagePullPolicy: IfNotPresent | ||||||
|         resources: |         resources: | ||||||
|           requests: |           requests: | ||||||
|  |  | ||||||
|  | @ -629,7 +629,7 @@ spec: | ||||||
|                     default: "pooler" |                     default: "pooler" | ||||||
|                   connection_pooler_image: |                   connection_pooler_image: | ||||||
|                     type: string |                     type: string | ||||||
|                     default: "registry.opensource.zalan.do/acid/pgbouncer:master-24" |                     default: "registry.opensource.zalan.do/acid/pgbouncer:master-26" | ||||||
|                   connection_pooler_max_db_connections: |                   connection_pooler_max_db_connections: | ||||||
|                     type: integer |                     type: integer | ||||||
|                     default: 60 |                     default: 60 | ||||||
|  |  | ||||||
|  | @ -201,7 +201,7 @@ configuration: | ||||||
|     connection_pooler_default_cpu_request: "500m" |     connection_pooler_default_cpu_request: "500m" | ||||||
|     connection_pooler_default_memory_limit: 100Mi |     connection_pooler_default_memory_limit: 100Mi | ||||||
|     connection_pooler_default_memory_request: 100Mi |     connection_pooler_default_memory_request: 100Mi | ||||||
|     connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-24" |     connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-26" | ||||||
|     # connection_pooler_max_db_connections: 60 |     # connection_pooler_max_db_connections: 60 | ||||||
|     connection_pooler_mode: "transaction" |     connection_pooler_mode: "transaction" | ||||||
|     connection_pooler_number_of_instances: 2 |     connection_pooler_number_of_instances: 2 | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ package cluster | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"path/filepath" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | @ -336,6 +337,52 @@ func (c *Cluster) generateConnectionPoolerPodTemplate(role PostgresRole) ( | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// If the cluster has custom TLS certificates configured, we do the following:
 | ||||||
|  | 	//  1. Add environment variables to tell pgBouncer where to find the TLS certificates
 | ||||||
|  | 	//  2. Reference the secret in a volume
 | ||||||
|  | 	//  3. Mount the volume to the container at /tls
 | ||||||
|  | 	poolerVolumes := []v1.Volume{} | ||||||
|  | 	if spec.TLS != nil && spec.TLS.SecretName != "" { | ||||||
|  | 		// Env vars
 | ||||||
|  | 		crtFile := spec.TLS.CertificateFile | ||||||
|  | 		keyFile := spec.TLS.PrivateKeyFile | ||||||
|  | 		if crtFile == "" { | ||||||
|  | 			crtFile = "tls.crt" | ||||||
|  | 		} | ||||||
|  | 		if keyFile == "" { | ||||||
|  | 			crtFile = "tls.key" | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		envVars = append( | ||||||
|  | 			envVars, | ||||||
|  | 			v1.EnvVar{ | ||||||
|  | 				Name: "CONNECTION_POOLER_CLIENT_TLS_CRT", Value: filepath.Join("/tls", crtFile), | ||||||
|  | 			}, | ||||||
|  | 			v1.EnvVar{ | ||||||
|  | 				Name: "CONNECTION_POOLER_CLIENT_TLS_KEY", Value: filepath.Join("/tls", keyFile), | ||||||
|  | 			}, | ||||||
|  | 		) | ||||||
|  | 
 | ||||||
|  | 		// Volume
 | ||||||
|  | 		mode := int32(0640) | ||||||
|  | 		volume := v1.Volume{ | ||||||
|  | 			Name: "tls", | ||||||
|  | 			VolumeSource: v1.VolumeSource{ | ||||||
|  | 				Secret: &v1.SecretVolumeSource{ | ||||||
|  | 					SecretName:  spec.TLS.SecretName, | ||||||
|  | 					DefaultMode: &mode, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		} | ||||||
|  | 		poolerVolumes = append(poolerVolumes, volume) | ||||||
|  | 
 | ||||||
|  | 		// Mount
 | ||||||
|  | 		poolerContainer.VolumeMounts = []v1.VolumeMount{{ | ||||||
|  | 			Name:      "tls", | ||||||
|  | 			MountPath: "/tls", | ||||||
|  | 		}} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	tolerationsSpec := tolerations(&spec.Tolerations, c.OpConfig.PodToleration) | 	tolerationsSpec := tolerations(&spec.Tolerations, c.OpConfig.PodToleration) | ||||||
| 
 | 
 | ||||||
| 	podTemplate := &v1.PodTemplateSpec{ | 	podTemplate := &v1.PodTemplateSpec{ | ||||||
|  | @ -348,6 +395,7 @@ func (c *Cluster) generateConnectionPoolerPodTemplate(role PostgresRole) ( | ||||||
| 			TerminationGracePeriodSeconds: &gracePeriod, | 			TerminationGracePeriodSeconds: &gracePeriod, | ||||||
| 			Containers:                    []v1.Container{poolerContainer}, | 			Containers:                    []v1.Container{poolerContainer}, | ||||||
| 			Tolerations:                   tolerationsSpec, | 			Tolerations:                   tolerationsSpec, | ||||||
|  | 			Volumes:                       poolerVolumes, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue