define readinessProbe on statefulSet when Patroni uses ConfigMaps
This commit is contained in:
		
							parent
							
								
									30f2ba6525
								
							
						
					
					
						commit
						4d25217777
					
				|  | @ -258,6 +258,8 @@ func (c *Cluster) Create() error { | ||||||
| 
 | 
 | ||||||
| 	for _, role := range []PostgresRole{Master, Replica} { | 	for _, role := range []PostgresRole{Master, Replica} { | ||||||
| 
 | 
 | ||||||
|  | 		// if kubernetes_use_configmaps is set Patroni will create configmaps
 | ||||||
|  | 		// otherwise it will use endpoints
 | ||||||
| 		if !c.patroniKubernetesUseConfigMaps() { | 		if !c.patroniKubernetesUseConfigMaps() { | ||||||
| 			if c.Endpoints[role] != nil { | 			if c.Endpoints[role] != nil { | ||||||
| 				return fmt.Errorf("%s endpoint already exists in the cluster", role) | 				return fmt.Errorf("%s endpoint already exists in the cluster", role) | ||||||
|  | @ -1576,10 +1578,10 @@ func (c *Cluster) deletePatroniClusterObjects() error { | ||||||
| 		c.logger.Infof("not cleaning up Etcd Patroni objects on cluster delete") | 		c.logger.Infof("not cleaning up Etcd Patroni objects on cluster delete") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if !c.patroniKubernetesUseConfigMaps() { | 	if c.patroniKubernetesUseConfigMaps() { | ||||||
| 		actionsList = append(actionsList, c.deletePatroniClusterEndpoints) |  | ||||||
| 	} else { |  | ||||||
| 		actionsList = append(actionsList, c.deletePatroniClusterServices, c.deletePatroniClusterConfigMaps) | 		actionsList = append(actionsList, c.deletePatroniClusterServices, c.deletePatroniClusterConfigMaps) | ||||||
|  | 	} else { | ||||||
|  | 		actionsList = append(actionsList, c.deletePatroniClusterEndpoints) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c.logger.Debugf("removing leftover Patroni objects (endpoints / services and configmaps)") | 	c.logger.Debugf("removing leftover Patroni objects (endpoints / services and configmaps)") | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ import ( | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/config" | 	"github.com/zalando/postgres-operator/pkg/util/config" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/constants" | 	"github.com/zalando/postgres-operator/pkg/util/constants" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | ||||||
|  | 	"github.com/zalando/postgres-operator/pkg/util/patroni" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/retryutil" | 	"github.com/zalando/postgres-operator/pkg/util/retryutil" | ||||||
| 	batchv1 "k8s.io/api/batch/v1" | 	batchv1 "k8s.io/api/batch/v1" | ||||||
| 	batchv1beta1 "k8s.io/api/batch/v1beta1" | 	batchv1beta1 "k8s.io/api/batch/v1beta1" | ||||||
|  | @ -111,7 +112,7 @@ func (c *Cluster) servicePort(role PostgresRole) int32 { | ||||||
| 		return service.Spec.Ports[0].Port | 		return service.Spec.Ports[0].Port | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c.logger.Warningf("No service for role %s - defaulting to port 5432", role) | 	c.logger.Warningf("No service for role %s - defaulting to port %d", role, pgPort) | ||||||
| 	return pgPort | 	return pgPort | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -558,15 +559,15 @@ func generateContainer( | ||||||
| 		Resources:       *resourceRequirements, | 		Resources:       *resourceRequirements, | ||||||
| 		Ports: []v1.ContainerPort{ | 		Ports: []v1.ContainerPort{ | ||||||
| 			{ | 			{ | ||||||
| 				ContainerPort: 8008, | 				ContainerPort: patroni.ApiPort, | ||||||
| 				Protocol:      v1.ProtocolTCP, | 				Protocol:      v1.ProtocolTCP, | ||||||
| 			}, | 			}, | ||||||
| 			{ | 			{ | ||||||
| 				ContainerPort: 5432, | 				ContainerPort: pgPort, | ||||||
| 				Protocol:      v1.ProtocolTCP, | 				Protocol:      v1.ProtocolTCP, | ||||||
| 			}, | 			}, | ||||||
| 			{ | 			{ | ||||||
| 				ContainerPort: 8080, | 				ContainerPort: patroni.ApiPort, | ||||||
| 				Protocol:      v1.ProtocolTCP, | 				Protocol:      v1.ProtocolTCP, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -1058,6 +1059,22 @@ func extractPgVersionFromBinPath(binPath string, template string) (string, error | ||||||
| 	return fmt.Sprintf("%v", pgVersion), nil | 	return fmt.Sprintf("%v", pgVersion), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func generateSpiloReadinessProbe() *v1.Probe { | ||||||
|  | 	return &v1.Probe{ | ||||||
|  | 		Handler: v1.Handler{ | ||||||
|  | 			HTTPGet: &v1.HTTPGetAction{ | ||||||
|  | 				Path: "/readiness", | ||||||
|  | 				Port: intstr.IntOrString{IntVal: patroni.ApiPort}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		InitialDelaySeconds: 6, | ||||||
|  | 		PeriodSeconds:       10, | ||||||
|  | 		TimeoutSeconds:      5, | ||||||
|  | 		SuccessThreshold:    1, | ||||||
|  | 		FailureThreshold:    3, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.StatefulSet, error) { | func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.StatefulSet, error) { | ||||||
| 
 | 
 | ||||||
| 	var ( | 	var ( | ||||||
|  | @ -1239,6 +1256,12 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef | ||||||
| 		generateCapabilities(c.OpConfig.AdditionalPodCapabilities), | 		generateCapabilities(c.OpConfig.AdditionalPodCapabilities), | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
|  | 	// if kubernetes_use_configmaps define a readinessProbe since the master service has a selector
 | ||||||
|  | 	// Patroni responds 200 to probe only if it either owns the leader lock or postgres is running and DCS is accessible
 | ||||||
|  | 	if c.patroniKubernetesUseConfigMaps() { | ||||||
|  | 		spiloContainer.ReadinessProbe = generateSpiloReadinessProbe() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// generate container specs for sidecars specified in the cluster manifest
 | 	// generate container specs for sidecars specified in the cluster manifest
 | ||||||
| 	clusterSpecificSidecars := []v1.Container{} | 	clusterSpecificSidecars := []v1.Container{} | ||||||
| 	if spec.Sidecars != nil && len(spec.Sidecars) > 0 { | 	if spec.Sidecars != nil && len(spec.Sidecars) > 0 { | ||||||
|  | @ -1708,10 +1731,12 @@ func (c *Cluster) shouldCreateLoadBalancerForService(role PostgresRole, spec *ac | ||||||
| 
 | 
 | ||||||
| func (c *Cluster) generateService(role PostgresRole, spec *acidv1.PostgresSpec) *v1.Service { | func (c *Cluster) generateService(role PostgresRole, spec *acidv1.PostgresSpec) *v1.Service { | ||||||
| 	serviceSpec := v1.ServiceSpec{ | 	serviceSpec := v1.ServiceSpec{ | ||||||
| 		Ports: []v1.ServicePort{{Name: "postgresql", Port: 5432, TargetPort: intstr.IntOrString{IntVal: 5432}}}, | 		Ports: []v1.ServicePort{{Name: "postgresql", Port: pgPort, TargetPort: intstr.IntOrString{IntVal: pgPort}}}, | ||||||
| 		Type:  v1.ServiceTypeClusterIP, | 		Type:  v1.ServiceTypeClusterIP, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// no selector for master, see https://github.com/zalando/postgres-operator/issues/340
 | ||||||
|  | 	// if kubernetes_use_configmaps is set master service needs a selector
 | ||||||
| 	if role == Replica || c.patroniKubernetesUseConfigMaps() { | 	if role == Replica || c.patroniKubernetesUseConfigMaps() { | ||||||
| 		serviceSpec.Selector = c.roleLabelsSet(false, role) | 		serviceSpec.Selector = c.roleLabelsSet(false, role) | ||||||
| 	} | 	} | ||||||
|  | @ -1989,7 +2014,7 @@ func (c *Cluster) generatePodDisruptionBudget() *policybeta1.PodDisruptionBudget | ||||||
| // TODO: handle clusters in different namespaces
 | // TODO: handle clusters in different namespaces
 | ||||||
| func (c *Cluster) getClusterServiceConnectionParameters(clusterName string) (host string, port string) { | func (c *Cluster) getClusterServiceConnectionParameters(clusterName string) (host string, port string) { | ||||||
| 	host = clusterName | 	host = clusterName | ||||||
| 	port = "5432" | 	port = fmt.Sprintf("%d", pgPort) | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2170,7 +2195,7 @@ func (c *Cluster) generateLogicalBackupPodEnvVars() []v1.EnvVar { | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			Name:  "PGPORT", | 			Name:  "PGPORT", | ||||||
| 			Value: "5432", | 			Value: fmt.Sprintf("%d", pgPort), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			Name:  "PGUSER", | 			Name:  "PGUSER", | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ const ( | ||||||
| 	clusterPath  = "/cluster" | 	clusterPath  = "/cluster" | ||||||
| 	statusPath   = "/patroni" | 	statusPath   = "/patroni" | ||||||
| 	restartPath  = "/restart" | 	restartPath  = "/restart" | ||||||
| 	apiPort      = 8008 | 	ApiPort      = 8008 | ||||||
| 	timeout      = 30 * time.Second | 	timeout      = 30 * time.Second | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -74,7 +74,7 @@ func apiURL(masterPod *v1.Pod) (string, error) { | ||||||
| 			return "", fmt.Errorf("%s is not a valid IPv4/IPv6 address", masterPod.Status.PodIP) | 			return "", fmt.Errorf("%s is not a valid IPv4/IPv6 address", masterPod.Status.PodIP) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return fmt.Sprintf("http://%s", net.JoinHostPort(ip.String(), strconv.Itoa(apiPort))), nil | 	return fmt.Sprintf("http://%s", net.JoinHostPort(ip.String(), strconv.Itoa(ApiPort))), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Patroni) httpPostOrPatch(method string, url string, body *bytes.Buffer) (err error) { | func (p *Patroni) httpPostOrPatch(method string, url string, body *bytes.Buffer) (err error) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue