From 31d04cbdfcd82670eddd43c290b14b1c15116472 Mon Sep 17 00:00:00 2001 From: Sergey Shatunov Date: Tue, 28 Apr 2020 14:45:25 +0700 Subject: [PATCH 1/2] Add support for pooler load balancer Signed-off-by: Sergey Shatunov --- charts/postgres-operator/values-crd.yaml | 2 ++ charts/postgres-operator/values.yaml | 2 ++ manifests/operatorconfiguration.crd.yaml | 2 ++ manifests/postgresql.crd.yaml | 2 ++ .../v1/operator_configuration_type.go | 1 + pkg/apis/acid.zalan.do/v1/postgresql_type.go | 1 + .../acid.zalan.do/v1/zz_generated.deepcopy.go | 5 +++++ pkg/cluster/k8sres.go | 15 ++++++++++++++- pkg/controller/operator_config.go | 1 + pkg/util/config/config.go | 1 + 10 files changed, 31 insertions(+), 1 deletion(-) diff --git a/charts/postgres-operator/values-crd.yaml b/charts/postgres-operator/values-crd.yaml index caa4dda4d..1f9473835 100644 --- a/charts/postgres-operator/values-crd.yaml +++ b/charts/postgres-operator/values-crd.yaml @@ -163,6 +163,8 @@ configLoadBalancer: enable_master_load_balancer: false # toggles service type load balancer pointing to the replica pod of the cluster enable_replica_load_balancer: false + # toggles service type load balancer pointing to the pooler pod of the cluster + enable_pooler_load_balancer: false # defines the DNS name string template for the master load balancer cluster master_dns_name_format: "{cluster}.{team}.{hostedzone}" # defines the DNS name string template for the replica load balancer cluster diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml index e7db249f0..0c3394f77 100644 --- a/charts/postgres-operator/values.yaml +++ b/charts/postgres-operator/values.yaml @@ -154,6 +154,8 @@ configLoadBalancer: enable_master_load_balancer: "false" # toggles service type load balancer pointing to the replica pod of the cluster enable_replica_load_balancer: "false" + # toggles service type load balancer pointing to the pooler pod of the cluster + enable_pooler_load_balancer: "false" # defines the DNS name string template for the master load balancer cluster master_dns_name_format: '{cluster}.{team}.{hostedzone}' # defines the DNS name string template for the replica load balancer cluster diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index b2496c9c9..2b3e007ee 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -197,6 +197,8 @@ spec: type: boolean enable_replica_load_balancer: type: boolean + enable_pooler_load_balancer: + type: boolean master_dns_name_format: type: string replica_dns_name_format: diff --git a/manifests/postgresql.crd.yaml b/manifests/postgresql.crd.yaml index 1ee6a1ae5..468917eb4 100644 --- a/manifests/postgresql.crd.yaml +++ b/manifests/postgresql.crd.yaml @@ -156,6 +156,8 @@ spec: type: boolean enableReplicaLoadBalancer: type: boolean + enablePoolerLoadBalancer: + type: boolean enableShmVolume: type: boolean init_containers: # deprecated diff --git a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go index c377a294b..f1dea3ff9 100644 --- a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go +++ b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go @@ -100,6 +100,7 @@ type LoadBalancerConfiguration struct { DbHostedZone string `json:"db_hosted_zone,omitempty"` EnableMasterLoadBalancer bool `json:"enable_master_load_balancer,omitempty"` EnableReplicaLoadBalancer bool `json:"enable_replica_load_balancer,omitempty"` + EnablePoolerLoadBalancer bool `json:"enable_pooler_load_balancer,omitempty"` CustomServiceAnnotations map[string]string `json:"custom_service_annotations,omitempty"` MasterDNSNameFormat config.StringTemplate `json:"master_dns_name_format,omitempty"` ReplicaDNSNameFormat config.StringTemplate `json:"replica_dns_name_format,omitempty"` diff --git a/pkg/apis/acid.zalan.do/v1/postgresql_type.go b/pkg/apis/acid.zalan.do/v1/postgresql_type.go index e36009208..32815907c 100644 --- a/pkg/apis/acid.zalan.do/v1/postgresql_type.go +++ b/pkg/apis/acid.zalan.do/v1/postgresql_type.go @@ -41,6 +41,7 @@ type PostgresSpec struct { // in that case the var evaluates to nil and the value is taken from the operator config EnableMasterLoadBalancer *bool `json:"enableMasterLoadBalancer,omitempty"` EnableReplicaLoadBalancer *bool `json:"enableReplicaLoadBalancer,omitempty"` + EnablePoolerLoadBalancer *bool `json:"enablePoolerLoadBalancer,omitempty"` // deprecated load balancer settings maintained for backward compatibility // see "Load balancers" operator docs diff --git a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go index e2e1d5bd1..11de49b3f 100644 --- a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go +++ b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go @@ -525,6 +525,11 @@ func (in *PostgresSpec) DeepCopyInto(out *PostgresSpec) { *out = new(bool) **out = **in } + if in.EnablePoolerLoadBalancer != nil { + in, out := &in.EnablePoolerLoadBalancer, &out.EnablePoolerLoadBalancer + *out = new(bool) + **out = **in + } if in.UseLoadBalancer != nil { in, out := &in.UseLoadBalancer, &out.UseLoadBalancer *out = new(bool) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 43190491b..e1a77dbcd 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -2210,6 +2210,14 @@ func (c *Cluster) generateConnectionPoolerDeployment(spec *acidv1.PostgresSpec) return deployment, nil } +func (c *Cluster) shouldCreateLoadBalancerForPoolerService(spec *acidv1.PostgresSpec) bool { + if spec.EnablePoolerLoadBalancer != nil { + return *spec.EnablePoolerLoadBalancer + } + + return c.OpConfig.EnablePoolerLoadBalancer +} + func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1.Service { // there are two ways to enable connection pooler, either to specify a @@ -2230,12 +2238,17 @@ func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1 TargetPort: intstr.IntOrString{StrVal: c.servicePort(Master)}, }, }, - Type: v1.ServiceTypeClusterIP, Selector: map[string]string{ "connection-pooler": c.connectionPoolerName(), }, } + if c.shouldCreateLoadBalancerForPoolerService(spec) { + serviceSpec.Type = v1.ServiceTypeLoadBalancer + } else { + serviceSpec.Type = v1.ServiceTypeClusterIP + } + service := &v1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: c.connectionPoolerName(), diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index c1756604b..73ac1d58a 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -100,6 +100,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.DbHostedZone = fromCRD.LoadBalancer.DbHostedZone result.EnableMasterLoadBalancer = fromCRD.LoadBalancer.EnableMasterLoadBalancer result.EnableReplicaLoadBalancer = fromCRD.LoadBalancer.EnableReplicaLoadBalancer + result.EnablePoolerLoadBalancer = fromCRD.LoadBalancer.EnablePoolerLoadBalancer result.CustomServiceAnnotations = fromCRD.LoadBalancer.CustomServiceAnnotations result.MasterDNSNameFormat = fromCRD.LoadBalancer.MasterDNSNameFormat result.ReplicaDNSNameFormat = fromCRD.LoadBalancer.ReplicaDNSNameFormat diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index 9c2257e78..c146ba088 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -135,6 +135,7 @@ type Config struct { EnableAdminRoleForUsers bool `name:"enable_admin_role_for_users" default:"true"` EnableMasterLoadBalancer bool `name:"enable_master_load_balancer" default:"true"` EnableReplicaLoadBalancer bool `name:"enable_replica_load_balancer" default:"false"` + EnablePoolerLoadBalancer bool `name:"enable_pooler_load_balancer" default:"false"` CustomServiceAnnotations map[string]string `name:"custom_service_annotations"` CustomPodAnnotations map[string]string `name:"custom_pod_annotations"` EnablePodAntiAffinity bool `name:"enable_pod_antiaffinity" default:"false"` From f45fc5cffea97b0ae3fa8f9425a9260fac34323e Mon Sep 17 00:00:00 2001 From: Sergey Shatunov Date: Wed, 29 Apr 2020 07:30:19 +0700 Subject: [PATCH 2/2] Rename to enable_master_pooler_load_balancer Signed-off-by: Sergey Shatunov --- charts/postgres-operator/values-crd.yaml | 4 ++-- charts/postgres-operator/values.yaml | 4 ++-- manifests/operatorconfiguration.crd.yaml | 2 +- manifests/postgresql.crd.yaml | 2 +- .../v1/operator_configuration_type.go | 14 +++++++------- pkg/apis/acid.zalan.do/v1/postgresql_type.go | 6 +++--- pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go | 4 ++-- pkg/cluster/k8sres.go | 6 +++--- pkg/controller/operator_config.go | 2 +- pkg/util/config/config.go | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/charts/postgres-operator/values-crd.yaml b/charts/postgres-operator/values-crd.yaml index 1f9473835..bd125d783 100644 --- a/charts/postgres-operator/values-crd.yaml +++ b/charts/postgres-operator/values-crd.yaml @@ -163,8 +163,8 @@ configLoadBalancer: enable_master_load_balancer: false # toggles service type load balancer pointing to the replica pod of the cluster enable_replica_load_balancer: false - # toggles service type load balancer pointing to the pooler pod of the cluster - enable_pooler_load_balancer: false + # toggles service type load balancer pointing to the master pooler pod of the cluster + enable_master_pooler_load_balancer: false # defines the DNS name string template for the master load balancer cluster master_dns_name_format: "{cluster}.{team}.{hostedzone}" # defines the DNS name string template for the replica load balancer cluster diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml index 0c3394f77..b22a4f673 100644 --- a/charts/postgres-operator/values.yaml +++ b/charts/postgres-operator/values.yaml @@ -154,8 +154,8 @@ configLoadBalancer: enable_master_load_balancer: "false" # toggles service type load balancer pointing to the replica pod of the cluster enable_replica_load_balancer: "false" - # toggles service type load balancer pointing to the pooler pod of the cluster - enable_pooler_load_balancer: "false" + # toggles service type load balancer pointing to the master pooler pod of the cluster + enable_master_pooler_load_balancer: "false" # defines the DNS name string template for the master load balancer cluster master_dns_name_format: '{cluster}.{team}.{hostedzone}' # defines the DNS name string template for the replica load balancer cluster diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index 2b3e007ee..667556f0a 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -197,7 +197,7 @@ spec: type: boolean enable_replica_load_balancer: type: boolean - enable_pooler_load_balancer: + enable_master_pooler_load_balancer: type: boolean master_dns_name_format: type: string diff --git a/manifests/postgresql.crd.yaml b/manifests/postgresql.crd.yaml index 468917eb4..f493b9401 100644 --- a/manifests/postgresql.crd.yaml +++ b/manifests/postgresql.crd.yaml @@ -156,7 +156,7 @@ spec: type: boolean enableReplicaLoadBalancer: type: boolean - enablePoolerLoadBalancer: + enableMasterPoolerLoadBalancer: type: boolean enableShmVolume: type: boolean diff --git a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go index f1dea3ff9..c02f14634 100644 --- a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go +++ b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go @@ -97,13 +97,13 @@ type OperatorTimeouts struct { // LoadBalancerConfiguration defines the LB configuration type LoadBalancerConfiguration struct { - DbHostedZone string `json:"db_hosted_zone,omitempty"` - EnableMasterLoadBalancer bool `json:"enable_master_load_balancer,omitempty"` - EnableReplicaLoadBalancer bool `json:"enable_replica_load_balancer,omitempty"` - EnablePoolerLoadBalancer bool `json:"enable_pooler_load_balancer,omitempty"` - CustomServiceAnnotations map[string]string `json:"custom_service_annotations,omitempty"` - MasterDNSNameFormat config.StringTemplate `json:"master_dns_name_format,omitempty"` - ReplicaDNSNameFormat config.StringTemplate `json:"replica_dns_name_format,omitempty"` + DbHostedZone string `json:"db_hosted_zone,omitempty"` + EnableMasterLoadBalancer bool `json:"enable_master_load_balancer,omitempty"` + EnableReplicaLoadBalancer bool `json:"enable_replica_load_balancer,omitempty"` + EnableMasterPoolerLoadBalancer bool `json:"enable_master_pooler_load_balancer,omitempty"` + CustomServiceAnnotations map[string]string `json:"custom_service_annotations,omitempty"` + MasterDNSNameFormat config.StringTemplate `json:"master_dns_name_format,omitempty"` + ReplicaDNSNameFormat config.StringTemplate `json:"replica_dns_name_format,omitempty"` } // AWSGCPConfiguration defines the configuration for AWS diff --git a/pkg/apis/acid.zalan.do/v1/postgresql_type.go b/pkg/apis/acid.zalan.do/v1/postgresql_type.go index 32815907c..21f5aca3c 100644 --- a/pkg/apis/acid.zalan.do/v1/postgresql_type.go +++ b/pkg/apis/acid.zalan.do/v1/postgresql_type.go @@ -39,9 +39,9 @@ type PostgresSpec struct { // vars that enable load balancers are pointers because it is important to know if any of them is omitted from the Postgres manifest // in that case the var evaluates to nil and the value is taken from the operator config - EnableMasterLoadBalancer *bool `json:"enableMasterLoadBalancer,omitempty"` - EnableReplicaLoadBalancer *bool `json:"enableReplicaLoadBalancer,omitempty"` - EnablePoolerLoadBalancer *bool `json:"enablePoolerLoadBalancer,omitempty"` + EnableMasterLoadBalancer *bool `json:"enableMasterLoadBalancer,omitempty"` + EnableReplicaLoadBalancer *bool `json:"enableReplicaLoadBalancer,omitempty"` + EnableMasterPoolerLoadBalancer *bool `json:"enableMasterPoolerLoadBalancer,omitempty"` // deprecated load balancer settings maintained for backward compatibility // see "Load balancers" operator docs diff --git a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go index 11de49b3f..eac352b1d 100644 --- a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go +++ b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go @@ -525,8 +525,8 @@ func (in *PostgresSpec) DeepCopyInto(out *PostgresSpec) { *out = new(bool) **out = **in } - if in.EnablePoolerLoadBalancer != nil { - in, out := &in.EnablePoolerLoadBalancer, &out.EnablePoolerLoadBalancer + if in.EnableMasterPoolerLoadBalancer != nil { + in, out := &in.EnableMasterPoolerLoadBalancer, &out.EnableMasterPoolerLoadBalancer *out = new(bool) **out = **in } diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index e1a77dbcd..2ae17efef 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -2211,11 +2211,11 @@ func (c *Cluster) generateConnectionPoolerDeployment(spec *acidv1.PostgresSpec) } func (c *Cluster) shouldCreateLoadBalancerForPoolerService(spec *acidv1.PostgresSpec) bool { - if spec.EnablePoolerLoadBalancer != nil { - return *spec.EnablePoolerLoadBalancer + if spec.EnableMasterPoolerLoadBalancer != nil { + return *spec.EnableMasterPoolerLoadBalancer } - return c.OpConfig.EnablePoolerLoadBalancer + return c.OpConfig.EnableMasterPoolerLoadBalancer } func (c *Cluster) generateConnectionPoolerService(spec *acidv1.PostgresSpec) *v1.Service { diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 73ac1d58a..9d42c75d0 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -100,7 +100,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.DbHostedZone = fromCRD.LoadBalancer.DbHostedZone result.EnableMasterLoadBalancer = fromCRD.LoadBalancer.EnableMasterLoadBalancer result.EnableReplicaLoadBalancer = fromCRD.LoadBalancer.EnableReplicaLoadBalancer - result.EnablePoolerLoadBalancer = fromCRD.LoadBalancer.EnablePoolerLoadBalancer + result.EnableMasterPoolerLoadBalancer = fromCRD.LoadBalancer.EnableMasterPoolerLoadBalancer result.CustomServiceAnnotations = fromCRD.LoadBalancer.CustomServiceAnnotations result.MasterDNSNameFormat = fromCRD.LoadBalancer.MasterDNSNameFormat result.ReplicaDNSNameFormat = fromCRD.LoadBalancer.ReplicaDNSNameFormat diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index c146ba088..d8a88d2d1 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -135,7 +135,7 @@ type Config struct { EnableAdminRoleForUsers bool `name:"enable_admin_role_for_users" default:"true"` EnableMasterLoadBalancer bool `name:"enable_master_load_balancer" default:"true"` EnableReplicaLoadBalancer bool `name:"enable_replica_load_balancer" default:"false"` - EnablePoolerLoadBalancer bool `name:"enable_pooler_load_balancer" default:"false"` + EnableMasterPoolerLoadBalancer bool `name:"enable_master_pooler_load_balancer" default:"false"` CustomServiceAnnotations map[string]string `name:"custom_service_annotations"` CustomPodAnnotations map[string]string `name:"custom_pod_annotations"` EnablePodAntiAffinity bool `name:"enable_pod_antiaffinity" default:"false"`