From 01913ecd358214bdc3a81e6148e20f96b964f4e3 Mon Sep 17 00:00:00 2001 From: Philip Hurst Date: Tue, 14 Jan 2025 23:42:09 +0000 Subject: [PATCH 1/4] add IP Family Policy to CRD --- ...ator.crunchydata.com_postgresclusters.yaml | 28 +++++++++++++++++++ .../v1beta1/shared_types.go | 6 ++++ 2 files changed, 34 insertions(+) diff --git a/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml b/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml index 914440f580..396fca3fc2 100644 --- a/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml +++ b/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml @@ -14663,6 +14663,13 @@ spec: - Local maxLength: 10 type: string + ipFamilyPolicy: + description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' + enum: + - SingleStack + - PreferDualStack + - RequireDualStack + type: string metadata: description: Metadata contains metadata for custom resources properties: @@ -15005,6 +15012,13 @@ spec: - Local maxLength: 10 type: string + ipFamilyPolicy: + description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' + enum: + - SingleStack + - PreferDualStack + - RequireDualStack + type: string metadata: description: Metadata contains metadata for custom resources properties: @@ -15053,6 +15067,13 @@ spec: - Local maxLength: 10 type: string + ipFamilyPolicy: + description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' + enum: + - SingleStack + - PreferDualStack + - RequireDualStack + type: string metadata: description: Metadata contains metadata for custom resources properties: @@ -16749,6 +16770,13 @@ spec: - Local maxLength: 10 type: string + ipFamilyPolicy: + description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' + enum: + - SingleStack + - PreferDualStack + - RequireDualStack + type: string metadata: description: Metadata contains metadata for custom resources properties: diff --git a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go index 6de2b35336..1bd612c9e8 100644 --- a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go +++ b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go @@ -44,6 +44,12 @@ type ServiceSpec struct { // +kubebuilder:validation:Enum={ClusterIP,NodePort,LoadBalancer} Type string `json:"type"` + // More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/ + // --- + // +optional + // +kubebuilder:validation:Enum=SingleStack;PreferDualStack;RequireDualStack + IPFamilyPolicy string `json:"ipFamilyPolicy,omitempty"` + // More info: https://kubernetes.io/docs/concepts/services-networking/service/#traffic-policies // --- // Kubernetes assumes the evaluation cost of an enum value is very large. From 8900ba8d44d043f11654ad4fac8cfad3f225afc4 Mon Sep 17 00:00:00 2001 From: Philip Hurst Date: Tue, 14 Jan 2025 23:42:43 +0000 Subject: [PATCH 2/4] update controller logic for IP Family Policy --- internal/controller/postgrescluster/cluster.go | 7 +++++++ internal/controller/postgrescluster/patroni.go | 6 ++++++ internal/controller/postgrescluster/pgadmin.go | 6 ++++++ internal/controller/postgrescluster/pgbouncer.go | 6 ++++++ 4 files changed, 25 insertions(+) diff --git a/internal/controller/postgrescluster/cluster.go b/internal/controller/postgrescluster/cluster.go index 7e863fdadf..dc0210e029 100644 --- a/internal/controller/postgrescluster/cluster.go +++ b/internal/controller/postgrescluster/cluster.go @@ -267,6 +267,13 @@ func (r *Reconciler) generateClusterReplicaService( } service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy + + // Default to SingleStack if IP Family Policy is not defined + if spec.IPFamilyPolicy == "" { + spec.IPFamilyPolicy = "SingleStack" + } + service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) + } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/patroni.go b/internal/controller/postgrescluster/patroni.go index 293690a77b..2fe683340a 100644 --- a/internal/controller/postgrescluster/patroni.go +++ b/internal/controller/postgrescluster/patroni.go @@ -271,6 +271,12 @@ func (r *Reconciler) generatePatroniLeaderLeaseService( } service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy + + // Default to SingleStack if IP Family Policy is not defined + if spec.IPFamilyPolicy == "" { + spec.IPFamilyPolicy = "SingleStack" + } + service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/pgadmin.go b/internal/controller/postgrescluster/pgadmin.go index f102405b47..977bfdf607 100644 --- a/internal/controller/postgrescluster/pgadmin.go +++ b/internal/controller/postgrescluster/pgadmin.go @@ -183,6 +183,12 @@ func (r *Reconciler) generatePGAdminService( } service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy + + // Default to SingleStack if IP Family Policy is not defined + if spec.IPFamilyPolicy == "" { + spec.IPFamilyPolicy = "SingleStack" + } + service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/pgbouncer.go b/internal/controller/postgrescluster/pgbouncer.go index eb71c189f6..2fcc790e6b 100644 --- a/internal/controller/postgrescluster/pgbouncer.go +++ b/internal/controller/postgrescluster/pgbouncer.go @@ -306,6 +306,12 @@ func (r *Reconciler) generatePGBouncerService( } service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy + + // Default to SingleStack if IP Family Policy is not defined + if spec.IPFamilyPolicy == "" { + spec.IPFamilyPolicy = "SingleStack" + } + service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} From f8d311262878be249fbe031bb108095e1b0fc3a1 Mon Sep 17 00:00:00 2001 From: Philip Hurst Date: Wed, 22 Jan 2025 20:15:16 +0000 Subject: [PATCH 3/4] added IPFamilies to the CRD --- ...ator.crunchydata.com_postgresclusters.yaml | 32 +++++++++++++++++++ .../v1beta1/shared_types.go | 7 ++++ .../v1beta1/zz_generated.deepcopy.go | 5 +++ 3 files changed, 44 insertions(+) diff --git a/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml b/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml index 396fca3fc2..0aa09e626e 100644 --- a/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml +++ b/config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml @@ -14663,6 +14663,14 @@ spec: - Local maxLength: 10 type: string + ipFamilies: + items: + enum: + - IPv4 + - IPv6 + - foo + type: string + type: array ipFamilyPolicy: description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' enum: @@ -15012,6 +15020,14 @@ spec: - Local maxLength: 10 type: string + ipFamilies: + items: + enum: + - IPv4 + - IPv6 + - foo + type: string + type: array ipFamilyPolicy: description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' enum: @@ -15067,6 +15083,14 @@ spec: - Local maxLength: 10 type: string + ipFamilies: + items: + enum: + - IPv4 + - IPv6 + - foo + type: string + type: array ipFamilyPolicy: description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' enum: @@ -16770,6 +16794,14 @@ spec: - Local maxLength: 10 type: string + ipFamilies: + items: + enum: + - IPv4 + - IPv6 + - foo + type: string + type: array ipFamilyPolicy: description: 'More info: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/' enum: diff --git a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go index 1bd612c9e8..2897c539a6 100644 --- a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go +++ b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/shared_types.go @@ -20,8 +20,12 @@ type SchemalessObject map[string]any // DeepCopy creates a new SchemalessObject by copying the receiver. func (in SchemalessObject) DeepCopy() SchemalessObject { return runtime.DeepCopyJSON(in) + } +// +kubebuilder:validation:Enum=IPv4;IPv6;foo +type IPFamily string + type ServiceSpec struct { // +optional Metadata *Metadata `json:"metadata,omitempty"` @@ -50,6 +54,9 @@ type ServiceSpec struct { // +kubebuilder:validation:Enum=SingleStack;PreferDualStack;RequireDualStack IPFamilyPolicy string `json:"ipFamilyPolicy,omitempty"` + // +optional + IPFamilies []IPFamily `json:"ipFamilies,omitempty"` + // More info: https://kubernetes.io/docs/concepts/services-networking/service/#traffic-policies // --- // Kubernetes assumes the evaluation cost of an enum value is very large. diff --git a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/zz_generated.deepcopy.go b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/zz_generated.deepcopy.go index 5eb63bd867..b632e4ac38 100644 --- a/pkg/apis/postgres-operator.crunchydata.com/v1beta1/zz_generated.deepcopy.go +++ b/pkg/apis/postgres-operator.crunchydata.com/v1beta1/zz_generated.deepcopy.go @@ -2213,6 +2213,11 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(int32) **out = **in } + if in.IPFamilies != nil { + in, out := &in.IPFamilies, &out.IPFamilies + *out = make([]IPFamily, len(*in)) + copy(*out, *in) + } if in.InternalTrafficPolicy != nil { in, out := &in.InternalTrafficPolicy, &out.InternalTrafficPolicy *out = new(corev1.ServiceInternalTrafficPolicy) From 0bdcb71c6c997591f4a12e0a076732b212e779c9 Mon Sep 17 00:00:00 2001 From: Philip Hurst Date: Wed, 22 Jan 2025 20:18:16 +0000 Subject: [PATCH 4/4] update controller logic for IP Families and IP Family Policy --- internal/controller/postgrescluster/cluster.go | 14 ++++++++++---- internal/controller/postgrescluster/patroni.go | 14 ++++++++++---- internal/controller/postgrescluster/pgadmin.go | 14 ++++++++++---- internal/controller/postgrescluster/pgbouncer.go | 14 ++++++++++---- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/internal/controller/postgrescluster/cluster.go b/internal/controller/postgrescluster/cluster.go index dc0210e029..b03b15048c 100644 --- a/internal/controller/postgrescluster/cluster.go +++ b/internal/controller/postgrescluster/cluster.go @@ -268,11 +268,17 @@ func (r *Reconciler) generateClusterReplicaService( service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy - // Default to SingleStack if IP Family Policy is not defined - if spec.IPFamilyPolicy == "" { - spec.IPFamilyPolicy = "SingleStack" + // Set IPFamilyPolicy and IPFamilies + if spec.IPFamilyPolicy != "" { + policy := corev1.IPFamilyPolicyType(spec.IPFamilyPolicy) + service.Spec.IPFamilyPolicy = &policy + } + if len(spec.IPFamilies) > 0 { + service.Spec.IPFamilies = []corev1.IPFamily{} + for _, family := range spec.IPFamilies { + service.Spec.IPFamilies = append(service.Spec.IPFamilies, corev1.IPFamily(family)) + } } - service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/patroni.go b/internal/controller/postgrescluster/patroni.go index 2fe683340a..5efb763314 100644 --- a/internal/controller/postgrescluster/patroni.go +++ b/internal/controller/postgrescluster/patroni.go @@ -272,11 +272,17 @@ func (r *Reconciler) generatePatroniLeaderLeaseService( service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy - // Default to SingleStack if IP Family Policy is not defined - if spec.IPFamilyPolicy == "" { - spec.IPFamilyPolicy = "SingleStack" + // Set IPFamilyPolicy and IPFamilies + if spec.IPFamilyPolicy != "" { + policy := corev1.IPFamilyPolicyType(spec.IPFamilyPolicy) + service.Spec.IPFamilyPolicy = &policy + } + if len(spec.IPFamilies) > 0 { + service.Spec.IPFamilies = []corev1.IPFamily{} + for _, family := range spec.IPFamilies { + service.Spec.IPFamilies = append(service.Spec.IPFamilies, corev1.IPFamily(family)) + } } - service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/pgadmin.go b/internal/controller/postgrescluster/pgadmin.go index 977bfdf607..4332b80189 100644 --- a/internal/controller/postgrescluster/pgadmin.go +++ b/internal/controller/postgrescluster/pgadmin.go @@ -184,11 +184,17 @@ func (r *Reconciler) generatePGAdminService( service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy - // Default to SingleStack if IP Family Policy is not defined - if spec.IPFamilyPolicy == "" { - spec.IPFamilyPolicy = "SingleStack" + // Set IPFamilyPolicy and IPFamilies + if spec.IPFamilyPolicy != "" { + policy := corev1.IPFamilyPolicyType(spec.IPFamilyPolicy) + service.Spec.IPFamilyPolicy = &policy + } + if len(spec.IPFamilies) > 0 { + service.Spec.IPFamilies = []corev1.IPFamily{} + for _, family := range spec.IPFamilies { + service.Spec.IPFamilies = append(service.Spec.IPFamilies, corev1.IPFamily(family)) + } } - service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort} diff --git a/internal/controller/postgrescluster/pgbouncer.go b/internal/controller/postgrescluster/pgbouncer.go index 2fcc790e6b..704f8b5f3d 100644 --- a/internal/controller/postgrescluster/pgbouncer.go +++ b/internal/controller/postgrescluster/pgbouncer.go @@ -307,11 +307,17 @@ func (r *Reconciler) generatePGBouncerService( service.Spec.ExternalTrafficPolicy = initialize.FromPointer(spec.ExternalTrafficPolicy) service.Spec.InternalTrafficPolicy = spec.InternalTrafficPolicy - // Default to SingleStack if IP Family Policy is not defined - if spec.IPFamilyPolicy == "" { - spec.IPFamilyPolicy = "SingleStack" + // Set IPFamilyPolicy and IPFamilies + if spec.IPFamilyPolicy != "" { + policy := corev1.IPFamilyPolicyType(spec.IPFamilyPolicy) + service.Spec.IPFamilyPolicy = &policy + } + if len(spec.IPFamilies) > 0 { + service.Spec.IPFamilies = []corev1.IPFamily{} + for _, family := range spec.IPFamilies { + service.Spec.IPFamilies = append(service.Spec.IPFamilies, corev1.IPFamily(family)) + } } - service.Spec.IPFamilyPolicy = (*corev1.IPFamilyPolicy)(&spec.IPFamilyPolicy) } service.Spec.Ports = []corev1.ServicePort{servicePort}