Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/apis/cpo.opensource.cybertec.at/v1/postgresql_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ type Sidecar struct {
DockerImage string `json:"image,omitempty"`
Ports []v1.ContainerPort `json:"ports,omitempty"`
Env []v1.EnvVar `json:"env,omitempty"`
ReadinessProbe *v1.Probe `json:"readinessProbe,omitempty"`
SecurityContext *v1.SecurityContext `json:"securityContext,omitempty"`
VolumeMounts []v1.VolumeMount `json:"volumeMounts,omitempty"`
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 20 additions & 2 deletions pkg/cluster/k8sres.go
Original file line number Diff line number Diff line change
Expand Up @@ -1283,6 +1283,7 @@ func getSidecarContainer(sidecar cpov1.Sidecar, index int, resources *v1.Resourc
Resources: *resources,
Env: sidecar.Env,
Ports: sidecar.Ports,
ReadinessProbe: sidecar.ReadinessProbe,
SecurityContext: sidecar.SecurityContext,
VolumeMounts: sidecar.VolumeMounts,
}
Expand Down Expand Up @@ -1317,7 +1318,7 @@ func extractPgVersionFromBinPath(binPath string, template string) (string, error
return fmt.Sprintf("%v", pgVersion), nil
}

func generateSpiloReadinessProbe() *v1.Probe {
func generatePatroniReadinessProbe() *v1.Probe {
return &v1.Probe{
FailureThreshold: 3,
ProbeHandler: v1.ProbeHandler{
Expand All @@ -1334,6 +1335,23 @@ func generateSpiloReadinessProbe() *v1.Probe {
}
}

func generateExporterReadinessProbe() *v1.Probe {
return &v1.Probe{
FailureThreshold: 3,
ProbeHandler: v1.ProbeHandler{
HTTPGet: &v1.HTTPGetAction{
Path: "/",
Port: intstr.IntOrString{IntVal: 9187},
Scheme: v1.URISchemeHTTP,
},
},
InitialDelaySeconds: 6,
PeriodSeconds: 10,
SuccessThreshold: 1,
TimeoutSeconds: 5,
}
}

func generatePatroniLivenessProbe() *v1.Probe {
return &v1.Probe{
FailureThreshold: 6,
Expand Down Expand Up @@ -1521,7 +1539,7 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu

// Patroni responds 200 to probe only if it either owns the leader lock or postgres is running and DCS is accessible
if c.OpConfig.EnableReadinessProbe {
spiloContainer.ReadinessProbe = generateSpiloReadinessProbe()
spiloContainer.ReadinessProbe = generatePatroniReadinessProbe()
}
//
if c.OpConfig.EnableLivenessProbe {
Expand Down
58 changes: 40 additions & 18 deletions pkg/cluster/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,42 @@ func (c *Cluster) listResources() error {
return nil
}

func hasSidecar(sidecars []cpov1.Sidecar, name string) bool {
for _, s := range sidecars {
if s.Name == name {
return true
}
}
return false
}

func (c *Cluster) generateExporterSidecar() *cpov1.Sidecar {
monitor := c.Spec.Monitoring
sidecar := &cpov1.Sidecar{
Name: "postgres-exporter",
DockerImage: monitor.Image,
Ports: []v1.ContainerPort{
{
ContainerPort: monitorPort,
Protocol: v1.ProtocolTCP,
},
},
Env: c.generateMonitoringEnvVars(),
SecurityContext: &v1.SecurityContext{
AllowPrivilegeEscalation: c.OpConfig.Resources.SpiloAllowPrivilegeEscalation,
Privileged: &c.OpConfig.Resources.SpiloPrivileged,
ReadOnlyRootFilesystem: util.True(),
Capabilities: generateCapabilities(c.OpConfig.AdditionalPodCapabilities),
},
}

if c.OpConfig.EnableReadinessProbe {
sidecar.ReadinessProbe = generateExporterReadinessProbe()
}

return sidecar
}

func (c *Cluster) createStatefulSet() (*appsv1.StatefulSet, error) {
c.setProcessName("creating statefulset")
// check if it's allowed that spec contains initContainers
Expand All @@ -82,25 +118,11 @@ func (c *Cluster) createStatefulSet() (*appsv1.StatefulSet, error) {
}

if c.Spec.Monitoring != nil {
monitor := c.Spec.Monitoring
sidecar := &cpov1.Sidecar{
Name: "postgres-exporter",
DockerImage: monitor.Image,
Ports: []v1.ContainerPort{
{
ContainerPort: monitorPort,
Protocol: v1.ProtocolTCP,
},
},
Env: c.generateMonitoringEnvVars(),
SecurityContext: &v1.SecurityContext{
AllowPrivilegeEscalation: c.OpConfig.Resources.SpiloAllowPrivilegeEscalation,
Privileged: &c.OpConfig.Resources.SpiloPrivileged,
ReadOnlyRootFilesystem: util.True(),
Capabilities: generateCapabilities(c.OpConfig.AdditionalPodCapabilities),
},
if exporterSidecar := c.generateExporterSidecar(); exporterSidecar != nil {
if !hasSidecar(c.Spec.Sidecars, "postgres-exporter") {
c.Spec.Sidecars = append(c.Spec.Sidecars, *exporterSidecar)
}
}
c.Spec.Sidecars = append(c.Spec.Sidecars, *sidecar) //populate the sidecar spec so that the sidecar is automatically created
}

statefulSetSpec, err := c.generateStatefulSet(&c.Spec)
Expand Down
28 changes: 8 additions & 20 deletions pkg/cluster/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,27 +502,15 @@ func (c *Cluster) syncStatefulSet() error {
if err != nil {
c.logger.Warnf("could not list pods of the statefulset: %v", err)
}
if c.Spec.Monitoring != nil { // XXX: Why are we generating a sidecar in the sync code?
monitor := c.Spec.Monitoring
sidecar := &cpov1.Sidecar{
Name: "postgres-exporter",
DockerImage: monitor.Image,
Ports: []v1.ContainerPort{
{
ContainerPort: monitorPort,
Protocol: v1.ProtocolTCP,
},
},
Env: c.generateMonitoringEnvVars(),
SecurityContext: &v1.SecurityContext{
AllowPrivilegeEscalation: c.OpConfig.Resources.SpiloAllowPrivilegeEscalation,
Privileged: &c.OpConfig.Resources.SpiloPrivileged,
ReadOnlyRootFilesystem: util.True(),
Capabilities: generateCapabilities(c.OpConfig.AdditionalPodCapabilities),
},
}
c.Spec.Sidecars = append(c.Spec.Sidecars, *sidecar) //populate the sidecar spec so that the sidecar is automatically created

if c.Spec.Monitoring != nil {
if exporterSidecar := c.generateExporterSidecar(); exporterSidecar != nil {
if !hasSidecar(c.Spec.Sidecars, "postgres-exporter") {
c.Spec.Sidecars = append(c.Spec.Sidecars, *exporterSidecar)
}
}
}

// NB: Be careful to consider the codepath that acts on podsRollingUpdateRequired before returning early.
sset, err := c.KubeClient.StatefulSets(c.Namespace).Get(context.TODO(), c.statefulSetName(), metav1.GetOptions{})
if err != nil {
Expand Down
Loading