diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index ed3eb3d75..7adae9846 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -324,7 +324,15 @@ func (c *Cluster) updateService(role PostgresRole, oldService *v1.Service, newSe // patch does not work because of LoadBalancerSourceRanges field (even if set to nil) oldServiceType := oldService.Spec.Type newServiceType := newService.Spec.Type - if newServiceType == "ClusterIP" && newServiceType != oldServiceType { + if newServiceType != oldServiceType && oldServiceType == v1.ServiceTypeLoadBalancer { + // Kubernetes rejects updates that change type away from LoadBalancer while + // loadBalancerSourceRanges is still set; clear it before updating + newService.Spec.LoadBalancerSourceRanges = nil + newService.ResourceVersion = oldService.ResourceVersion + if newServiceType == v1.ServiceTypeClusterIP { + newService.Spec.ClusterIP = oldService.Spec.ClusterIP + } + } else if newServiceType == v1.ServiceTypeClusterIP && newServiceType != oldServiceType { newService.ResourceVersion = oldService.ResourceVersion newService.Spec.ClusterIP = oldService.Spec.ClusterIP }