Add new pooler service for replica
This commit is contained in:
		
							parent
							
								
									3a906aba93
								
							
						
					
					
						commit
						83ddd5c85b
					
				| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
apiVersion: "acid.zalan.do/v1"
 | 
					apiVersion: "acid.zalan.do/v1"
 | 
				
			||||||
kind: postgresql
 | 
					kind: postgresql
 | 
				
			||||||
metadata:
 | 
					metadata:
 | 
				
			||||||
  name: acid-test-cluster2
 | 
					  name: acid-test-cluster
 | 
				
			||||||
#  labels:
 | 
					#  labels:
 | 
				
			||||||
#    environment: demo
 | 
					#    environment: demo
 | 
				
			||||||
#  annotations:
 | 
					#  annotations:
 | 
				
			||||||
| 
						 | 
					@ -18,8 +18,8 @@ spec:
 | 
				
			||||||
    - createdb
 | 
					    - createdb
 | 
				
			||||||
  enableMasterLoadBalancer: false
 | 
					  enableMasterLoadBalancer: false
 | 
				
			||||||
  enableReplicaLoadBalancer: false
 | 
					  enableReplicaLoadBalancer: false
 | 
				
			||||||
  #enableConnectionPooler: true  # not needed when connectionPooler section is present (see below)
 | 
					  enableConnectionPooler: true  # not needed when connectionPooler section is present (see below)
 | 
				
			||||||
  enableReplicaConnectionPooler: true # set to enable connectionPooler for replica endpoints
 | 
					  #enableReplicaConnectionPooler: true # set to enable connectionPooler for replica endpoints
 | 
				
			||||||
  allowedSourceRanges:  # load balancers' source ranges for both master and replica services
 | 
					  allowedSourceRanges:  # load balancers' source ranges for both master and replica services
 | 
				
			||||||
  - 127.0.0.1/32
 | 
					  - 127.0.0.1/32
 | 
				
			||||||
  databases:
 | 
					  databases:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,7 @@ type Config struct {
 | 
				
			||||||
type ConnectionPoolerObjects struct {
 | 
					type ConnectionPoolerObjects struct {
 | 
				
			||||||
	Deployment  *appsv1.Deployment
 | 
						Deployment  *appsv1.Deployment
 | 
				
			||||||
	Service     *v1.Service
 | 
						Service     *v1.Service
 | 
				
			||||||
 | 
						ReplService *v1.Service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// It could happen that a connection pooler was enabled, but the operator
 | 
						// It could happen that a connection pooler was enabled, but the operator
 | 
				
			||||||
	// was not able to properly process a corresponding event or was restarted.
 | 
						// was not able to properly process a corresponding event or was restarted.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2088,10 +2088,6 @@ func (c *Cluster) getConnectionPoolerEnvVars(spec *acidv1.PostgresSpec) []v1.Env
 | 
				
			||||||
			Name:  "CONNECTION_POOLER_MASTER_PORT",
 | 
								Name:  "CONNECTION_POOLER_MASTER_PORT",
 | 
				
			||||||
			Value: fmt.Sprint(pgPort),
 | 
								Value: fmt.Sprint(pgPort),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			Name:  "CONNECTION_POOLER_REPLICA_PORT",
 | 
					 | 
				
			||||||
			Value: fmt.Sprint(5433),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Name:  "CONNECTION_POOLER_MODE",
 | 
								Name:  "CONNECTION_POOLER_MODE",
 | 
				
			||||||
			Value: effectiveMode,
 | 
								Value: effectiveMode,
 | 
				
			||||||
| 
						 | 
					@ -2308,10 +2304,8 @@ func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1
 | 
				
			||||||
	if spec.ConnectionPooler == nil {
 | 
						if spec.ConnectionPooler == nil {
 | 
				
			||||||
		spec.ConnectionPooler = &acidv1.ConnectionPooler{}
 | 
							spec.ConnectionPooler = &acidv1.ConnectionPooler{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var serviceSpec = v1.ServiceSpec{}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if *spec.EnableReplicaConnectionPooler == false {
 | 
						serviceSpec := v1.ServiceSpec{
 | 
				
			||||||
		serviceSpec = v1.ServiceSpec{
 | 
					 | 
				
			||||||
		Ports: []v1.ServicePort{
 | 
							Ports: []v1.ServicePort{
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Name:       c.connectionPoolerName(),
 | 
									Name:       c.connectionPoolerName(),
 | 
				
			||||||
| 
						 | 
					@ -2321,29 +2315,9 @@ func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Type: v1.ServiceTypeClusterIP,
 | 
							Type: v1.ServiceTypeClusterIP,
 | 
				
			||||||
		Selector: map[string]string{
 | 
							Selector: map[string]string{
 | 
				
			||||||
				"connection-pooler": c.connectionPoolerName(),
 | 
								"connection-pooler-repl": c.connectionPoolerName(),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		serviceSpec = v1.ServiceSpec{
 | 
					 | 
				
			||||||
			Ports: []v1.ServicePort{
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					Name:       c.connectionPoolerName(),
 | 
					 | 
				
			||||||
					Port:       pgPort,
 | 
					 | 
				
			||||||
					TargetPort: intstr.IntOrString{StrVal: c.servicePort(Master)},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					Name:       c.connectionPoolerName() + "-repl",
 | 
					 | 
				
			||||||
					Port:       5433,
 | 
					 | 
				
			||||||
					TargetPort: intstr.IntOrString{StrVal: c.servicePort(Replica)},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			Type: v1.ServiceTypeClusterIP,
 | 
					 | 
				
			||||||
			Selector: map[string]string{
 | 
					 | 
				
			||||||
				"connection-pooler": c.connectionPoolerName(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	service := &v1.Service{
 | 
						service := &v1.Service{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
| 
						 | 
					@ -2365,6 +2339,42 @@ func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1
 | 
				
			||||||
	return service
 | 
						return service
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Cluster) generateReplicaConnectionPoolerService(spec *acidv1.PostgresSpec) *v1.Service {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						replicaserviceSpec := v1.ServiceSpec{
 | 
				
			||||||
 | 
							Ports: []v1.ServicePort{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Name:       c.connectionPoolerName() + "-repl",
 | 
				
			||||||
 | 
									Port:       pgPort,
 | 
				
			||||||
 | 
									TargetPort: intstr.IntOrString{StrVal: c.servicePort(Replica)},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Type: v1.ServiceTypeClusterIP,
 | 
				
			||||||
 | 
							Selector: map[string]string{
 | 
				
			||||||
 | 
								"connection-pooler-repl": c.connectionPoolerName() + "-repl",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						service := &v1.Service{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:        c.connectionPoolerName() + "-repl",
 | 
				
			||||||
 | 
								Namespace:   c.Namespace,
 | 
				
			||||||
 | 
								Labels:      c.connectionPoolerLabelsSelector().MatchLabels,
 | 
				
			||||||
 | 
								Annotations: map[string]string{},
 | 
				
			||||||
 | 
								// make StatefulSet object its owner to represent the dependency.
 | 
				
			||||||
 | 
								// By itself StatefulSet is being deleted with "Orphaned"
 | 
				
			||||||
 | 
								// propagation policy, which means that it's deletion will not
 | 
				
			||||||
 | 
								// clean up this service, but there is a hope that this object will
 | 
				
			||||||
 | 
								// be garbage collected if something went wrong and operator didn't
 | 
				
			||||||
 | 
								// deleted it.
 | 
				
			||||||
 | 
								OwnerReferences: c.ownerReferences(),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: replicaserviceSpec,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return service
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ensurePath(file string, defaultDir string, defaultFile string) string {
 | 
					func ensurePath(file string, defaultDir string, defaultFile string) string {
 | 
				
			||||||
	if file == "" {
 | 
						if file == "" {
 | 
				
			||||||
		return path.Join(defaultDir, defaultFile)
 | 
							return path.Join(defaultDir, defaultFile)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,11 +152,27 @@ func (c *Cluster) createConnectionPooler(lookup InstallFunction) (*ConnectionPoo
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if c.Spec.EnableReplicaConnectionPooler != nil && *c.Spec.EnableReplicaConnectionPooler == true {
 | 
				
			||||||
 | 
							replServiceSpec := c.generateReplicaConnectionPoolerService(&c.Spec)
 | 
				
			||||||
 | 
							replService, err := c.KubeClient.
 | 
				
			||||||
 | 
								Services(serviceSpec.Namespace).
 | 
				
			||||||
 | 
								Create(context.TODO(), replServiceSpec, metav1.CreateOptions{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							c.ConnectionPooler = &ConnectionPoolerObjects{
 | 
				
			||||||
 | 
								Deployment:  deployment,
 | 
				
			||||||
 | 
								Service:     service,
 | 
				
			||||||
 | 
								ReplService: replService,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
		c.ConnectionPooler = &ConnectionPoolerObjects{
 | 
							c.ConnectionPooler = &ConnectionPoolerObjects{
 | 
				
			||||||
			Deployment: deployment,
 | 
								Deployment: deployment,
 | 
				
			||||||
			Service:    service,
 | 
								Service:    service,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c.logger.Debugf("created new connection pooler %q, uid: %q",
 | 
						c.logger.Debugf("created new connection pooler %q, uid: %q",
 | 
				
			||||||
		util.NameFromMeta(deployment.ObjectMeta), deployment.UID)
 | 
							util.NameFromMeta(deployment.ObjectMeta), deployment.UID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue