diff --git a/internal/controller/constants.go b/internal/controller/constants.go index 9c5d19a..7e42faf 100644 --- a/internal/controller/constants.go +++ b/internal/controller/constants.go @@ -67,6 +67,20 @@ const ( PostgresVarRunVolumeMountPath = "/var/run/postgresql" TmpVolumeName = "tmp-writable-volume" TmpVolumeMountPath = "/tmp" + // Health probe settings for the PostgreSQL container. + // Startup probe allows up to 300s for initialization (e.g. WAL recovery). + // Liveness uses a longer period/timeout to avoid killing a busy-but-healthy instance. + // Readiness uses a shorter period to quickly pull the pod from traffic when not accepting connections. + PostgresStartupProbeInitialDelaySeconds = int32(5) + PostgresStartupProbePeriodSeconds = int32(10) + PostgresStartupProbeTimeoutSeconds = int32(5) + PostgresStartupProbeFailureThreshold = int32(30) + PostgresLivenessProbePeriodSeconds = int32(30) + PostgresLivenessProbeTimeoutSeconds = int32(10) + PostgresLivenessProbeFailureThreshold = int32(3) + PostgresReadinessProbePeriodSeconds = int32(10) + PostgresReadinessProbeTimeoutSeconds = int32(5) + PostgresReadinessProbeFailureThreshold = int32(3) // LCore specific LlamaStackContainerPort = int32(8321) diff --git a/internal/controller/postgres_deployment.go b/internal/controller/postgres_deployment.go index 94cfd46..72af028 100644 --- a/internal/controller/postgres_deployment.go +++ b/internal/controller/postgres_deployment.go @@ -142,7 +142,10 @@ func buildPostgresPodTemplateSpec() corev1.PodTemplateSpec { AllowPrivilegeEscalation: &[]bool{false}[0], ReadOnlyRootFilesystem: &[]bool{true}[0], }, - VolumeMounts: volumeMounts, + StartupProbe: buildPostgresProbe(PostgresStartupProbePeriodSeconds, PostgresStartupProbeTimeoutSeconds, PostgresStartupProbeFailureThreshold, PostgresStartupProbeInitialDelaySeconds), + LivenessProbe: buildPostgresProbe(PostgresLivenessProbePeriodSeconds, PostgresLivenessProbeTimeoutSeconds, PostgresLivenessProbeFailureThreshold, 0), + ReadinessProbe: buildPostgresProbe(PostgresReadinessProbePeriodSeconds, PostgresReadinessProbeTimeoutSeconds, PostgresReadinessProbeFailureThreshold, 0), + VolumeMounts: volumeMounts, Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ corev1.ResourceCPU: resource.MustParse("30m"), @@ -195,3 +198,17 @@ func buildPostgresPodTemplateSpec() corev1.PodTemplateSpec { }, } } + +func buildPostgresProbe(period, timeout, failure, initialDelay int32) *corev1.Probe { + return &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"pg_isready", "-U", PostgresDefaultUser, "-d", PostgresDefaultDbName}, + }, + }, + InitialDelaySeconds: initialDelay, + PeriodSeconds: period, + TimeoutSeconds: timeout, + FailureThreshold: failure, + } +}