Postgres operator creates and manages PostgreSQL clusters running in Kubernetes
Go to file
Thomas Rosenstein 9ca87d9db4 Fix deletion timestamp handling for clusters with finalizers
When a Postgres cluster has a finalizer, deleting it sets a DeletionTimestamp
but doesn't remove the object until the finalizer is cleared. The operator
was not properly handling these DeletionTimestamp changes:

1. postgresqlUpdate() was filtering out events where only DeletionTimestamp
   changed (it only checked Spec and Annotations), causing the delete to
   never be processed.

2. EventUpdate case in processEvent() didn't check for DeletionTimestamp,
   so even if the event reached the processor, it would run Update() instead
   of Delete().

3. removeFinalizer() used a cached object with stale resourceVersion,
   causing "object has been modified" errors.

Fixes:
- Add explicit DeletionTimestamp check in postgresqlUpdate() to queue the event
- Add DeletionTimestamp check in EventUpdate to call Delete() when set
- Fetch latest object from API before removing finalizer to avoid conflicts
2025-12-14 20:29:01 +01:00
.github only trigger ghcr build on tag event (#3010) 2025-12-10 17:11:53 +01:00
charts bump to v1.15.0 (#2965) 2025-10-21 11:56:33 +02:00
cmd Add abitility to set QPS and Burst limits for api client (#2667) 2024-12-23 08:53:27 +01:00
docker Separate pipeline for internal/external build and support multi arch (#2991) 2025-12-10 16:45:42 +01:00
docs DOC: Minikube has many drivers now, incl. Docker (#2949) 2025-10-14 13:50:11 +02:00
e2e skip db user actions when its secret failed to sync on update (#2969) 2025-11-05 16:28:37 +01:00
hack update go and dependencies (#2554) 2024-02-23 13:58:11 +01:00
kubectl-pg Bump golang.org/x/oauth2 from 0.23.0 to 0.27.0 in /kubectl-pg (#3008) 2025-12-10 17:11:22 +01:00
logical-backup logical-backup:gcs_upload: try to use gcp metadata if LOGICAL_GOOGLE_APPLICATION_CREDENTIALS is not set (#2837) 2025-09-17 16:01:28 +02:00
manifests bump to v1.15.0 (#2965) 2025-10-21 11:56:33 +02:00
mocks Support EBS gp2 to gp3 migration on sync for below 1tb volumes (#1242) 2020-12-11 15:52:32 +01:00
pkg Fix deletion timestamp handling for clusters with finalizers 2025-12-14 20:29:01 +01:00
ui [ui] internal pipeline fix to build ui image (#3013) 2025-12-12 16:49:58 +01:00
.flake8 Implement runner for e2e tests (#548) 2019-06-05 17:07:27 +02:00
.gitignore Add support for EBS CSI Driver (#2677) 2024-12-19 12:32:09 +01:00
.golangci.yml add .golangci.yml (#422) 2018-11-27 12:00:15 +01:00
.zappr.yaml Min 2 zalando approvers. (#1338) 2021-01-29 11:12:08 +01:00
CODEOWNERS add Mikkel (#3002) 2025-12-03 11:00:59 +01:00
CONTRIBUTING.md Update docs for v1.2 (#609) 2019-07-11 17:19:27 +02:00
LICENSE bump to v1.15.0 (#2965) 2025-10-21 11:56:33 +02:00
MAINTAINERS add Mikkel (#3002) 2025-12-03 11:00:59 +01:00
Makefile Separate pipeline for internal/external build and support multi arch (#2991) 2025-12-10 16:45:42 +01:00
README.md Fix typo in README.md regarding bootstrap phase (#2978) 2025-12-09 09:36:32 +01:00
SECURITY.md docs(general): Adding Security.md (#88) 2017-09-04 14:33:30 +02:00
build-ci.sh reflect change in github url (#496) 2019-02-25 11:26:55 +01:00
delivery.yaml [ui] internal pipeline fix to build ui image (#3013) 2025-12-12 16:49:58 +01:00
go.mod Bump golang.org/x/crypto from 0.43.0 to 0.45.0 (#2997) 2025-12-10 17:07:20 +01:00
go.sum Bump golang.org/x/crypto from 0.43.0 to 0.45.0 (#2997) 2025-12-10 17:07:20 +01:00
mkdocs.yml Initial commit for new 1.6 release with Postgres 13 support. (#1257) 2020-12-17 15:00:29 +01:00
run_operator_locally.sh run_operator_locally.sh: more retrying, debuggability (#2218) 2023-04-19 12:05:36 +02:00

README.md

Postgres Operator

Tests E2E Tests Coverage Status

The Postgres Operator delivers an easy to run highly-available PostgreSQL clusters on Kubernetes (K8s) powered by Patroni. It is configured only through Postgres manifests (CRDs) to ease integration into automated CI/CD pipelines with no access to Kubernetes API directly, promoting infrastructure as code vs manual operations.

Operator features

  • Rolling updates on Postgres cluster changes, incl. quick minor version updates
  • Live volume resize without pod restarts (AWS EBS, PVC)
  • Database connection pooling with PGBouncer
  • Support fast in place major version upgrade. Supports global upgrade of all clusters.
  • Pod protection during bootstrap phase and configurable maintenance windows
  • Restore and cloning Postgres clusters on AWS, GCS and Azure
  • Additionally logical backups to S3 or GCS bucket can be configured
  • Standby cluster from S3 or GCS WAL archive
  • Configurable for non-cloud environments
  • Basic credential and user management on K8s, eases application deployments
  • Support for custom TLS certificates
  • UI to create and edit Postgres cluster manifests
  • Compatible with OpenShift

PostgreSQL features

The Postgres Operator has been developed at Zalando and is being used in production for over five years.

Supported Postgres & K8s versions

Release Postgres versions K8s versions Golang
v1.15.0 13 → 17 1.27+ 1.25.3
v1.14.0 13 → 17 1.27+ 1.23.4
v1.13.0 12 → 16 1.27+ 1.22.5
v1.12.0 11 → 16 1.27+ 1.22.3
v1.11.0 11 → 16 1.27+ 1.21.7
v1.10.1 10 → 15 1.21+ 1.19.8

Getting started

For a quick first impression follow the instructions of this tutorial.

Supported setups of Postgres and Applications

Features Features

Documentation

There is a browser-friendly version of this documentation at postgres-operator.readthedocs.io