EDB CloudNativePG Cluster 1.29.0 release notes v1.29.0

Released: 31 March 2026

This release of EDB Postgres® AI for CloudNativePG™ Cluster includes the following:

Highlights

Updated the deprecation notice for native (in-tree) Barman Cloud support to reflect that it will now be removed in EDB Postgres for Kubernetes 1.30.0, rather than 1.29.0. Users are still encouraged to migrate to the Barman Cloud Plugin. (#10167)

Features

DescriptionAddresses
PostgreSQL extensions in image catalogs

extended the ImageCatalogfunctionality to support PostgreSQL extensions. This allows users to define and manage extension-specific images within a catalog, simplifying the deployment of customized PostgreSQL builds.

#9781
Dynamic network access control via pod selectors

introduced the declarative definition of podSelectorRefs to manage pg_hba.conf rules dynamically. By using label selectors to identify client pods, the operator automatically resolves their ephemeral IP addresses and updates the PostgreSQL host-based authentication rules accordingly. This ensures that only authorized workloads in the same namespace can connect to the database, eliminating the need for manual IP management or static CIDR ranges.

#9781
Shared ServiceAccount support

added an optional serviceAccountNamefield to both Cluster and Pooler specifications. This allows multiple resources to share a pre-existing ServiceAccount, facilitating one-time IAM configurations (such as AWS IRSA, GCP Workload Identity, or Azure Workload Identity) across all clusters and poolers. Contributed by @bozkayasalihx.

#9287

Enhancements

DescriptionAddresses
Improved the Pooler CRD with support for granular configuration of TLS cipher suites and minimum/maximum TLS versions.

This enables administrators to meet strict security compliance requirements for pooler-to-client and pooler-to-server connections. Contributed by @alex1989hu.

#9571
Improved the reliability of major upgrades by setting BackoffLimit=0 on the upgrade job, preventing unnecessary retries of a failed pg_upgrade.

The operator now automatically deletes the failed job when a user reverts the container image, allowing the cluster to restart gracefully on the original version.

#10104, #10298
Improved the operator's observability by emitting native Kubernetes events during key phases of the reconciliation loop.

This provides visibility into the operator's decision-making process and the lifecycle of managed resources directly through kubectl get events.

#10040
Extended support for the k8s.enterprisedb.io/reconciliationDisabled annotation on Backup resources.

This allows administrators to temporarily freeze the operator's reconciliation logic for specific backup objects. Contributed by @GabriFedi97.

#10020
Added a bin_path field to the postgresql.extensions stanza, as well as inImageCatalog and ClusterImageCatalog resources.

This allows extensions to specify directory paths for external binaries, which are automatically appended to the PATH environment variable of the Postgres process.

#10250
Added an env field to the postgresql.extensions stanza, as well as inImageCatalog and ClusterImageCatalog resources.

This allows cluster administrators to define custom environment variables for the Postgres process. This field supports the ${image_root} placeholder to dynamically resolve to the extension's absolute mount path.

#10375
Implemented a finalizer for plugins to ensure that resources managed by a plugin are gracefully cleaned up when the corresponding service is deleted.#9560
Improved role management by verifying the instance is the primary before each reconciliation cycle

...avoiding unnecessary reconciliation attempts and spurious error messages on read-only replicas.

#9971
The operator now honors the `primaryUpdateMethod` when adding new PVCs to a cluster, ensuring that the rollout strategy (e.g., switchover vs. restart) is respected during storage expansion or additions.#9720
Refined the `alpha.k8s.enterprisedb.io/unrecoverable` annotation logic to allow it to function even on pods that have not yet reached the `Ready` state, facilitating the recovery of stuck instances.#9968
Introduced a "Terminal Error" phase for backups that encounter unrecoverable issues (such as invalid credentials or non-existent cloud buckets).

This ensures the operator stops retrying doomed operations, preventing resource exhaustion and providing immediate, clear feedback in the status.

#9353
Improved monitoring of long-running backups by introducingreconciliationStartedAt and reconciliationTerminatedAt fields to theBackup status.

This change separates the operator's internal lifecycle from the actual backup tool's execution timing (startedAt/stoppedAt), allowing users to track when the operator begins processing a request.

#9351
Added a `Pending` phase to the `Backup` status to explicitly indicate when a backup is queued and waiting for an available worker or instance availability.#9364

Security Fixes

DescriptionAddresses
Security best practices integration**: integrated the OpenSSF baseline scanner and added a `SECURITY-INSIGHTS.yaml` file to the repository to align with industry-standard security reporting.#10054, #10062
SLSA provenance and SBOMs**: added SLSA (Supply-chain Levels for Software Artifacts) provenance to release binaries and container images.

Additionally, enabled Software Bill of Materials (SBOM) generation within the GoReleaser pipeline for improved dependency transparency.

#10048, #10074
Password leak prevention**: fixed a potential security risk where PostgreSQL could leak role passwords in the logs during specific reconciliation phases.#9950

Changes

DescriptionAddresses
Updated the default PostgreSQL version to 18.3 (image `18.3-standard-ubi9`).#10090

Bug Fixes

DescriptionAddresses
Fixed a deadlock during operator upgrades affecting clusters using synchronous replication

...where pods running the old and new operator versions computed different PostgreSQL configuration hashes, causing the uniformity check to block indefinitely and preventing both rolling updates and in-place upgrades from proceeding.

#10342
Fixed an issue where fencing annotations could not be processed when the WAL disk was full

...because the disk space check blocked the instance manager from starting. The check is now performed later in the lifecycle loop, after fencing is evaluated.

#10302
Fixed an issue where replicas would get stuck in a Pending state if theVolumeSnapshot used for the initial bootstrap had been deleted.

The operator now validates snapshot existence before use; if a snapshot is missing, it attempts to use the next available candidate or falls back topg_basebackup.

#10192
Prevented the "supervised primary" rollout strategy from consuming all available rollout slots, which previously caused delays in scheduled updates. Contributed by @ermakov-oleg.#9977
Fixed an issue where certain hot-standby parameter changes were not being correctly applied to replica clusters.#9952
Fixed a bug in the CNPG-I reconciler hook that could lead to skipping subsequent plugins when a "continue" result was returned. Contributed by @sharifmshaker.#9978
Fixed a deadlock scenario that occurred when attempting to resize a filesystem on a PVC that was not currently attached to a Pod. Contributed by @jmealo.#9981
Fixed webhook validation of bootstrap recovery sources to accept external clusters configured with ConnectionParameters (for pg_basebackup-based recovery).

Previously, these were incorrectly rejected unless a Barman object store or CNPG-i plugin was also configured.

#10268
Volume names for extensions and tablespaces are now prefixed to avoid naming collisions with standard cluster volumes.#9973
When hibernating a non-healthy cluster, the operator now reports a `WaitingForHealthy` condition, making the deferred hibernation state visible#10193
Fixed fencing to work correctly even when the target pod does not exist.

Fencing operates on a cluster-level annotation and should not depend on pod existence; instance name validation is now performed only in the cnp fencing on command.

#10035
Fixed the cluster and pooler service reconcilers to correctly handle changes to all spec fields when using the patch update strategy. The reconciler now uses RFC 7386 JSON Merge Patching, preventing cloud-provider-set fields (such as `loadBalancerClass`) from being inadvertently removed.#10190, #10311
Fixed a race condition in the deprecated in-tree Barman Cloud backup implementation affecting parallel WAL restore, where prefetched files could be read while still being downloaded, causing PostgreSQL recovery to fail with "invalid checkpoint record" errors.#10285
Fixed the timeline history file validation to also apply to plugin-based WAL restore.

Previously, the protection introduced in#9650 only covered in-tree restores, allowing plugins to bypass the check and download future timeline history files, causing timeline mismatch errors on replicas.

#9849
The cnp plugin now correctly propagates ImagePullSecrets to the `pgbench` Job pod template.#10174