Skip to content

Releases: EnterpriseDB/kubectl-cnp

v1.28.1

06 Feb 17:19
988bdd3

Choose a tag to compare

Release date: Feb 10, 2026

Enhancements

  • Added support for Azure's DefaultAzureCredential authentication mechanism for backup and recovery operations. This can be enabled by setting azureCredentials.useDefaultAzureCredentials: true in the backup configuration, simplifying authentication in Azure environments without requiring explicit storage account keys or SAS tokens. (#9468)

Fixes

  • Fixed validation of PostgreSQL extension names containing underscores (e.g., pg_partman, pg_ivm). Extension names with underscores are automatically sanitized to use hyphens for Kubernetes volume names while preserving the original name in mount paths. Webhook validation prevents naming conflicts after sanitization. Contributed by @shusaan. (#9386)

  • Fixed a critical issue where the TimelineID in the cluster status was not reset to 1 after a major version upgrade. Because pg_upgrade initializes a new timeline, keeping the old ID (e.g., timeline 2) caused replicas to attempt to restore incompatible history files from object storage, leading to fatal "requested timeline is not a child of this server's history" errors. (#9830)

  • Fixed an issue where stale TLS status fields in the Pooler were not cleared after being removed from the specification. This was particularly critical when upgrading to v1.28.0, where the ServerTLS field was repurposed, causing PgBouncer to use incorrect certificates and resulting in "unsupported certificate" errors that blocked all application connectivity. The operator now explicitly clears ServerCA, ClientCA, ClientTLS, and ServerTLS status fields when they are no longer configured. (#9397)

  • Fixed a bug where replicas could enter a crash-loop by attempting to download timeline history files from future timelines. This occurred when stale files remained in the WAL archive from a previous cluster life, and replicas would incorrectly try to fetch them during recovery. (#9650)

  • Fixed a race condition in replica_cluster setups during designated primary transitions, preventing transient "no primary" states in the replica cluster. (#9601)

  • The backup controller now uses the unique instance session ID to detect instance manager restarts. This prevents the operator from incorrectly assuming a backup is still progressing if the underlying container has crashed and restarted, which previously led to orphaned backup objects. (#9370)

  • Fixed a validation gap in Azure object store configurations where the storageAccount was not required when using explicit credentials (such as a storage key or SAS token). The operator now enforces that a storage account name is provided in these cases and that connectionString is mutually exclusive with other authentication parameters. (#9604)

  • Optimized the deletion path so the operator begins cleaning up resources immediately when a cluster is marked for deletion. This significantly reduces the time a cluster remains in Terminating status while waiting for internal reconciliation loops. (#9555)

  • Fixed an issue where replication slots were not properly dropped from replicas when the feature was disabled or the cluster was reconfigured. This ensures that unused slots do not cause WAL build-up on the primary. (#9381)

  • Fixed an issue where imagePullSecrets were not added to the ServiceAccount created for the Pooler. Previously, these secrets were applied to the Deployment but not the SA, which caused image pull failures in restricted environments using certain security policies. (#9427)

  • Added a check to verify ownership before the operator deletes a PodMonitor. This prevents the operator from accidentally deleting manually managed monitoring resources that happen to share a name with expected CNP resources. Contributed by @juliamertz. (#9340)

  • Fixed a bug where pg_stat_archiver metrics would continue to report stale data on standby instances after a switchover. The exporter now skips these metrics on standbys, as PostgreSQL only provides valid archiver stats on the primary. (#9411)

  • Clarified the interpretation of timestamp formats for recovery targetTime. Timestamps provided without an explicit timezone are now consistently interpreted as UTC. Contributed by @pchovelon. (#8937)

  • Fixed backup status updates to prevent "resource has been modified" errors during concurrent updates. (#9551)

  • Fixed event reporting to use the correct pod name when a backup pod is not found. (#9552)

  • Improved performance of scheduled backup operations for clusters with a very high number of historical backups. (#9489)

  • Fixed error handling when removing finalizers on Database objects. (#9431)

  • cnp plugin:

    • Updated the status command to display "Disabled" when the skipWalArchiving annotation is present on a cluster. This replaces confusing "starting up" or "unknown" states when WAL archiving is intentionally bypassed. (#9709)

    • Fixed the logs --follow command to continue polling for new pods instead of exiting prematurely when all current log streams complete. (#9599)

v1.28.0

16 Dec 10:17
988bdd3

Choose a tag to compare

Release date: Dec 9, 2025

Features

  • Quorum-Based Failover Promoted to Stable: Promoted the quorum-based failover feature, introduced experimentally in 1.27.0, to a stable API. This data-driven failover mechanism is now configured via the spec.postgresql.synchronous.failoverQuorum field, graduating from the previous alpha.k8s.enterprisedb.io/failoverQuorum annotation. (#8589)

  • Declarative Foreign Data Management: Introduced comprehensive declarative management for Foreign Data Wrappers (FDW) by extending the Database CRD. This feature adds the .spec.fdws and .spec.servers fields, allowing you to manage FDW extensions and their corresponding foreign servers directly from the Database resource. This work was implemented by Ying Zhu (@EdwinaZhu) as part of the LFX Mentorship Program 2025 Term 2. (#7942, #8401)

Changes

  • Updated the default PostgreSQL version to 18.1-standard-ubi9. (#9178)

  • Updated the default PgBouncer version to 1.25.1 for new Pooler deployments. (#9367)

Enhancements

  • Enabled simultaneous image and configuration changes when using primaryUpdateMethod: restart, allowing you to update the container image (including PostgreSQL version or extensions) and PostgreSQL configuration settings in the same operation. Note that when using primaryUpdateMethod: switchover, image and configuration changes must still be performed separately to avoid configuration mismatches during the switchover process. (#8241)

  • Improved network failure detection for replica instances by setting the default tcp_user_timeout to 5 seconds. This change helps replicas detect and recover from silent network drops more quickly. Previously, replicas could wait up to 127 seconds before detecting such failures; with the new timeout, they reconnect to the primary within 5 seconds. To preserve the previous behavior, set STANDBY_TCP_USER_TIMEOUT to 0 in the operator configuration. (#9317)

  • Adopted standard Kubernetes recommended labels (e.g., app.kubernetes.io/name) for all resources generated by EDB Postgres for Kubernetes (Clusters, Backups, Poolers, etc.). Contributed by @JefeDavis. (#8087)

  • Introduced securityContext at the pod level and containerSecurityContext for individual containers (including postgres, init, and sidecars). This provides granular control over security settings, replacing the previous cluster-wide postgres and operator user settings. Contributed by @x0ddf. (#6614)

  • Introduced the alpha.k8s.enterprisedb.io/unrecoverable=true annotation for replica pods. When applied, this annotation instructs the operator to permanently delete the instance by removing its Pod and PVCs, after which it will recreate the replica from the primary. (#8178)

  • Introduced a new caching layer for user-defined monitoring queries to reduce load on the PostgreSQL database. (#8003)

  • Enhanced PgBouncer integration by automatically setting auth_dbname to the pgbouncer database, simplifying auth setup. (#8671)

  • Allowed providing stage-specific pg_restore options (preRestore, postRestore, dataRestore) during database import. Contributed by @hanshal101. (#7690)

  • Added the PostgreSQL majorVersion to the Backup object's status for easier identification and management. (#8464)

  • Enhanced cluster restore to wait for all init containers to complete before starting the restore process. This ensures that backup tools running in init containers finish preparing the data before the restore begins. The implementation correctly handles Kubernetes init container sidecars by ignoring those with RestartPolicy=Always. (#9026)

  • Added the PGBOUNCER_IMAGE_NAME operator configuration parameter to allow overriding the default PgBouncer image. This is useful for air-gapped environments or when using internal registries. (#9232)

  • cnp plugin:

    • Added a --timeout flag to the kubectl cnp status command for configuring the timeout for filesystem operations such as calculating cluster size. The default remains 10 seconds but can be adjusted for large clusters where operations may take longer. (#9201)

    • Improved cnp report to generate more shell-friendly file names. (#8984)

Security

  • Allowed providing fine-grained custom TLS configurations for PgBouncer. The Pooler CRD was extended with clientTLSSecret, clientCASecret, serverTLSSecret, and serverCASecret fields under .spec.pgbouncer. These fields enable users to supply their own certificates for both client-to-pooler and pooler-to-server connections, taking precedence over the operator-generated certificates. (#8692)

  • Added optional TLS support for the operator's metrics server (port 8080). This feature is opt-in and enabled by setting the METRICS_CERT_DIR environment variable, which instructs the operator to look for tls.crt and tls.key files in the specified directory. When unset, the server continues to use HTTP for backward compatibility. (#8997)

  • Enabled cnp report operator to work with minimal permissions by making only the operator deployment required. All other resources (pods, secrets, config maps, events, webhooks, and OLM data) are now optional and collected on a best-efforts basis. The command gracefully handles permission errors for those resources by logging clear warnings and continuing report generation with available data, rather than failing completely. This enables least-privileged access, where users may have limited, namespace-scoped permissions. (#8982)

Fixes

  • Improved resilience of all probe types (liveness, readiness, and startup) to transient Kubernetes API server connectivity issues. Probes now use a caching mechanism that falls back to cached cluster definitions during brief network interruptions, preventing unnecessary pod restarts and probe failures. (#9148)

  • Fixed the CheckEmptyWalArchive safeguard to run correctly when restoring from a volume snapshot using CNP-I backup/WAL plugins (e.g., plugin-barman-cloud). Previously, this check was skipped for plugin-based implementations. (#9306)

  • Improved error reporting when ImageCatalog retrieval fails. The operator now emits a Warning event and logs errors for all failure types, not just NotFound errors, improving visibility into configuration issues. (#9266)

  • Fixed TLS certificate verification issues when connecting to CNP-I plugins by adding the k8s.enterprisedb.io/pluginServerName annotation. This allows customizing the DNS name used for certificate verification in environments where the plugin's certificate uses a different DNS name than the Service name. (#9222)

  • Fixed an issue where the instance manager controller could fail to restart after an error, reporting a "controller already exists" message. The controller now uses SkipNameValidation for subsequent initialization attempts. Contributed by @mateusoliveira43. (#9123)

  • Fixed incorrect WAL restore path handling in plugins when the destination path is absolute, preventing path duplication issues. Contributed by @Endevir. (#9093)

  • Fixed the CREATE PUBLICATION SQL generation for multi-table publications to be backward-compatible with PostgreSQL 13+. The previously generated syntax was only valid for PostgreSQL 15+ and caused syntax errors on older versions. (#8888)

  • Fixed backup failures in complex pod definitions by reliably selecting the postgres container by name instead of by index. Contributed by @Joda89. (#8964)

  • cnp plugin:

    • Fixed bugs in cnp report log collection, especially when fetching previous logs. The collector now correctly fetches previous and current logs in separate requests and gracefully handles missing previous logs (e.g., on cont...
Read more

v1.28.0-rc2

05 Dec 14:46
988bdd3

Choose a tag to compare

v1.28.0-rc2 Pre-release
Pre-release

Release date: Nov 28, 2025

Enhancements:

  • Improved network failure detection for replica instances by setting the default tcp_user_timeout to 5 seconds. This change helps replicas detect and recover from silent network drops more quickly. Previously, replicas could wait up to 127 seconds before detecting such failures; with the new timeout, they reconnect to the primary within 5 seconds. To preserve the previous behavior, set STANDBY_TCP_USER_TIMEOUT to 0 in the operator configuration. (#9317)

  • Enhanced cluster restore to wait for all init containers to complete before starting the restore process. This ensures that backup tools running in init containers finish preparing the data before the restore begins. The implementation correctly handles Kubernetes init container sidecars by ignoring those with RestartPolicy=Always. (#9026)

  • Added the PGBOUNCER_IMAGE_NAME operator configuration parameter to allow overriding the default PgBouncer image. This is useful for air-gapped environments or when using internal registries. (#9232)

  • cnp plugin:

    • Added a --timeout flag to the kubectl cnp status command for configuring the timeout for filesystem operations such as calculating cluster size. The default remains 10 seconds but can be adjusted for large clusters where operations may take longer. (#9201)

Fixes:

  • Improved resilience of all probe types (liveness, readiness, and startup) to transient Kubernetes API server connectivity issues. Probes now use a caching mechanism that falls back to cached cluster definitions during brief network interruptions, preventing unnecessary pod restarts and probe failures. (#9148)
  • Fixed the CheckEmptyWalArchive safeguard to run correctly when restoring from a volume snapshot using CNP-I backup/WAL plugins (e.g., plugin-barman-cloud). Previously, this check was skipped for plugin-based implementations. (#9306)
  • Improved error reporting when ImageCatalog retrieval fails. The operator now emits a Warning event and logs errors for all failure types, not just NotFound errors, improving visibility into configuration issues. (#9266)
  • Fixed TLS certificate verification issues when connecting to CNP-I plugins by adding the k8s.enterprisedb.io/pluginServerName annotation. This allows customizing the DNS name used for certificate verification in environments where the plugin's certificate uses a different DNS name than the Service name. (#9222)
  • Fixed an issue where the instance manager controller could fail to restart after an error, reporting a "controller already exists" message. The controller now uses SkipNameValidation for subsequent initialization attempts. Contributed by @mateusoliveira43. (#9123)
  • Fixed incorrect WAL restore path handling in plugins when the destination path is absolute, preventing path duplication issues. Contributed by @Endevir. (#9093)

v1.28.0-rc1

21 Nov 20:38
988bdd3

Choose a tag to compare

v1.28.0-rc1 Pre-release
Pre-release

Release date: Nov 7, 2025

Features

  • Quorum-Based Failover Promoted to Stable: Promoted the quorum-based failover feature, introduced experimentally in 1.27.0, to a stable API. This data-driven failover mechanism is now configured via the spec.postgresql.synchronous.failoverQuorum field, graduating from the previous alpha.k8s.enterprisedb.io/failoverQuorum annotation. (#8589)

  • Declarative Foreign Data Management: Introduced comprehensive declarative management for Foreign Data Wrappers (FDW) by extending the Database CRD. This feature adds the .spec.fdws and .spec.servers fields, allowing you to manage FDW extensions and their corresponding foreign servers directly from the Database resource. This work was implemented by Ying Zhu (@EdwinaZhu) as part of the LFX Mentorship Program 2025 Term 2. (#7942, #8401)

Enhancements:

  • Enabled simultaneous image and configuration changes, allowing you to update the container image (including PostgreSQL version or extensions) and PostgreSQL configuration settings in the same operation. The operator first applies the image change, followed by the configuration changes in a subsequent rollout, ensuring safe and consistent cluster updates. (#8115)

  • Introduced securityContext at the pod level and containerSecurityContext for individual containers (including postgres, init, and sidecars). This provides granular control over security settings, replacing the previous cluster-wide postgres and operator user settings. Contributed by @x0ddf. (#6614)

  • Adopted standard Kubernetes recommended labels (e.g., app.kubernetes.io/name) for all resources generated by EDB Postgres for Kubernetes (Clusters, Backups, Poolers, etc.). Contributed by @JefeDavis. (#8087)

  • Introduced a new caching layer for user-defined monitoring queries to reduce load on the PostgreSQL database. (#8003)

  • Introduced the alpha.k8s.enterprisedb.io/unrecoverable=true annotation for replica pods. When applied, this annotation instructs the operator to permanently delete the instance by removing its Pod and PVCs, after which it will recreate the replica from the primary. (#8178)

  • Enhanced PgBouncer integration by automatically setting auth_dbname to the pgbouncer database, simplifying auth setup. (#8671)

  • Allowed providing stage-specific pg_restore options (preRestore, postRestore, dataRestore) during database import. Contributed by @hanshal101. (#7690)

  • Added the PostgreSQL majorVersion to the Backup object's status for easier identification and management. (#8464)

Security:

  • Allowed providing fine-grained custom TLS configurations for PgBouncer. The Pooler CRD was extended with clientTLSSecret, clientCASecret, serverTLSSecret, and serverCASecret fields under .spec.pgbouncer. These fields enable users to supply their own certificates for both client-to-pooler and pooler-to-server connections, taking precedence over the operator-generated certificates. (#8692)

  • Added optional TLS support for the operator's metrics server (port 8080). This feature is opt-in and enabled by setting the METRICS_CERT_DIR environment variable, which instructs the operator to look for tls.crt and tls.key files in the specified directory. When unset, the server continues to use HTTP for backward compatibility. (#8997)

  • Enabled cnp report operator to work with minimal permissions by making only the operator deployment required. All other resources (pods, secrets, config maps, events, webhooks, and OLM data) are now optional and collected on a best-efforts basis. The command gracefully handles permission errors for those resources by logging clear warnings and continuing report generation with available data, rather than failing completely. This enables least-privileged access, where users may have limited, namespace-scoped permissions. (#8982)

Fixes:

  • Fixed the CREATE PUBLICATION SQL generation for multi-table publications to be backward-compatible with PostgreSQL 13+. The previously generated syntax was only valid for PostgreSQL 15+ and caused syntax errors on older versions. (#8888)

  • Fixed backup failures in complex pod definitions by reliably selecting the postgres container by name instead of by index. (#8964)

  • cnp plugin:

    • Fixed bugs in cnp report log collection, especially when fetching previous logs. The collector now correctly fetches previous and current logs in separate requests and gracefully handles missing previous logs (e.g., on containers with no restart history), ensuring current logs are always collected. (#8992)

Supported versions

  • Kubernetes 1.34, 1.33, and 1.32
  • PostgreSQL 18, 17, 16, 15, and 14
    • PostgreSQL 18.0 is the default image

v1.27.3

06 Feb 16:51
988bdd3

Choose a tag to compare

Release date: Feb 10, 2026

Enhancements

  • Added support for Azure's DefaultAzureCredential authentication mechanism for backup and recovery operations. This can be enabled by setting azureCredentials.useDefaultAzureCredentials: true in the backup configuration, simplifying authentication in Azure environments without requiring explicit storage account keys or SAS tokens. (#9468)

Fixes

  • Fixed validation of PostgreSQL extension names containing underscores (e.g., pg_partman, pg_ivm). Extension names with underscores are automatically sanitized to use hyphens for Kubernetes volume names while preserving the original name in mount paths. Webhook validation prevents naming conflicts after sanitization. Contributed by @shusaan. (#9386)

  • Fixed a critical issue where the TimelineID in the cluster status was not reset to 1 after a major version upgrade. Because pg_upgrade initializes a new timeline, keeping the old ID (e.g., timeline 2) caused replicas to attempt to restore incompatible history files from object storage, leading to fatal "requested timeline is not a child of this server's history" errors. (#9830)

  • Fixed a bug where replicas could enter a crash-loop by attempting to download timeline history files from future timelines. This occurred when stale files remained in the WAL archive from a previous cluster life, and replicas would incorrectly try to fetch them during recovery. (#9650)

  • Fixed a race condition in replica_cluster setups during designated primary transitions, preventing transient "no primary" states in the replica cluster. (#9601)

  • The backup controller now uses the unique instance session ID to detect instance manager restarts. This prevents the operator from incorrectly assuming a backup is still progressing if the underlying container has crashed and restarted, which previously led to orphaned backup objects. (#9370)

  • Fixed a validation gap in Azure object store configurations where the storageAccount was not required when using explicit credentials (such as a storage key or SAS token). The operator now enforces that a storage account name is provided in these cases and that connectionString is mutually exclusive with other authentication parameters. (#9604)

  • Optimized the deletion path so the operator begins cleaning up resources immediately when a cluster is marked for deletion. This significantly reduces the time a cluster remains in Terminating status while waiting for internal reconciliation loops. (#9555)

  • Fixed an issue where replication slots were not properly dropped from replicas when the feature was disabled or the cluster was reconfigured. This ensures that unused slots do not cause WAL build-up on the primary. (#9381)

  • Fixed an issue where imagePullSecrets were not added to the ServiceAccount created for the Pooler. Previously, these secrets were applied to the Deployment but not the SA, which caused image pull failures in restricted environments using certain security policies. (#9427)

  • Added a check to verify ownership before the operator deletes a PodMonitor. This prevents the operator from accidentally deleting manually managed monitoring resources that happen to share a name with expected CNP resources. Contributed by @juliamertz. (#9340)

  • Fixed a bug where pg_stat_archiver metrics would continue to report stale data on standby instances after a switchover. The exporter now skips these metrics on standbys, as PostgreSQL only provides valid archiver stats on the primary. (#9411)

  • Clarified the interpretation of timestamp formats for recovery targetTime. Timestamps provided without an explicit timezone are now consistently interpreted as UTC. Contributed by @pchovelon. (#8937)

  • Fixed backup status updates to prevent "resource has been modified" errors during concurrent updates. (#9551)

  • Fixed event reporting to use the correct pod name when a backup pod is not found. (#9552)

  • Improved performance of scheduled backup operations for clusters with a very high number of historical backups. (#9489)

  • Fixed error handling when removing finalizers on Database objects. (#9431)

  • cnp plugin:

    • Updated the status command to display "Disabled" when the skipWalArchiving annotation is present on a cluster. This replaces confusing "starting up" or "unknown" states when WAL archiving is intentionally bypassed. (#9709)

    • Fixed the logs --follow command to continue polling for new pods instead of exiting prematurely when all current log streams complete. (#9599)

v1.27.2

16 Dec 09:30
988bdd3

Choose a tag to compare

Release date: Dec 9, 2025

:::warning Version 1.27 will be supported until 9 March 2026. :::

Changes

  • Updated the default PostgreSQL version to 18.1-standard-ubi9. (#9178)

  • Updated the default PgBouncer version to 1.25.1 for new Pooler deployments. (#9367)

Enhancements

  • Added the PostgreSQL majorVersion to the Backup object's status for easier identification and management. (#8464)

  • Added the PGBOUNCER_IMAGE_NAME operator configuration parameter to allow overriding the default PgBouncer image. This is useful for air-gapped environments or when using internal registries. (#9232)

  • cnp plugin:

    • Added a --timeout flag to the kubectl cnp status command for configuring the timeout for filesystem operations such as calculating cluster size. The default remains 10 seconds but can be adjusted for large clusters where operations may take longer. (#9201)

    • Improved cnp report to generate more shell-friendly file names. (#8984)

Fixes

  • Improved resilience of all probe types (liveness, readiness, and startup) to transient Kubernetes API server connectivity issues. Probes now use a caching mechanism that falls back to cached cluster definitions during brief network interruptions, preventing unnecessary pod restarts and probe failures. (#9148)

  • Fixed the CheckEmptyWalArchive safeguard to run correctly when restoring from a volume snapshot using CNP-I backup/WAL plugins (e.g., plugin-barman-cloud). Previously, this check was skipped for plugin-based implementations. (#9306)

  • Improved error reporting when ImageCatalog retrieval fails. The operator now emits a Warning event and logs errors for all failure types, not just NotFound errors, improving visibility into configuration issues. (#9266)

  • Fixed TLS certificate verification issues when connecting to CNP-I plugins by adding the k8s.enterprisedb.io/pluginServerName annotation. This allows customizing the DNS name used for certificate verification in environments where the plugin's certificate uses a different DNS name than the Service name. (#9222)

  • Fixed an issue where the instance manager controller could fail to restart after an error, reporting a "controller already exists" message. The controller now uses SkipNameValidation for subsequent initialization attempts. Contributed by @mateusoliveira43. (#9123)

  • Fixed incorrect WAL restore path handling in plugins when the destination path is absolute, preventing path duplication issues. Contributed by @Endevir. (#9093)

  • Fixed the CREATE PUBLICATION SQL generation for multi-table publications to be backward-compatible with PostgreSQL 13+. The previously generated syntax was only valid for PostgreSQL 15+ and caused syntax errors on older versions. (#8888)

  • Fixed backup failures in complex pod definitions by reliably selecting the postgres container by name instead of by index. Contributed by @Joda89. (#8964)

  • cnp plugin:

    • Fixed bugs in cnp report log collection, especially when fetching previous logs. The collector now correctly fetches previous and current logs in separate requests and gracefully handles missing previous logs (e.g., on containers with no restart history), ensuring current logs are always collected. (#8992)

v1.27.1

24 Oct 17:18
988bdd3

Choose a tag to compare

Release date: Oct 23, 2025

Changes

  • Delayed the decommissioning of native in-core support for Barman Cloud to at least version 1.29. (#8670)

  • Adopted the new format of postgres-containers and postgis-containers images and image catalog artifacts, and updated the default PostgreSQL version to 18.0-system-trixie (PostgreSQL 18 is now supported). (#8578, #8760, #8558)

  • Deprecated the monitoring.enablePodMonitor field in the Cluster and Pooler resources. This field will be removed in a future release. Users who rely on PodMonitor resources should create them manually instead. (#8753)

Enhancements

  • Added support for overriding the PgBouncer auth_type, server_tls_sslmode, and client_tls_sslmode settings, which were previously hardcoded. Default values remain consistent with the former behavior but can now be customized when required. (#8674)

  • Added a CHECKPOINT step before PostgreSQL smart and fast shutdowns to reduce shutdown duration and replica promotion time, especially on systems with a high checkpoint_timeout. (#8867)

  • Added a warning in the instance manager for deprecated or unsupported OS versions, based on the official postgres-containers project. (#8601)

  • Improved certificate parsing error reporting. Failures now log specific errors instead of a generic message, aiding troubleshooting. This is particularly relevant after the CVE-2025-58187 fix in Go 1.25.2 and 1.24.8, which may trigger parsing failures for invalid DNS SANs. (#8801)

  • Added a check to ensure the destination WAL archive path is empty when bootstrapping a cluster using the pg_basebackup method, consistent with other bootstrap methods. (#8895)

  • Added validation to prevent backups from running on hibernated clusters. Backups attempted on such clusters now fail with reason ClusterIsHibernated, following the standard prerequisite check pattern. (#8870)

  • Added support for pprof profiling. Instances can now enable the pprof tool by adding the alpha.k8s.enterprisedb.io/enableInstancePprof annotation to the Cluster resource for advanced debugging. (#7876)

  • cnp plugin:

    • Updated the Flexible I/O Tester (FIO) image to wallnerryan/fiotools-aio:v2, as provided by Ryan Wallner. (#8847)

    • Enhanced the cnp status backup command to provide more detailed status information when using a barman-cloud-based backup plugin. (#8780, #8690)

Fixes

  • Fixed backup restoration failures when using custom WAL segment sizes with parallel WAL recovery. The operator no longer manages the end-of-WAL file marker during restoration, preventing errors when backups span multiple WAL segments. (#8873)

  • Fixed a bug in major upgrades where a volume snapshot from a previous minor version could be incorrectly used to optimize replica creation. (#8475)

  • Fixed initdb to wait for the application user secret before bootstrapping a new cluster, preventing potential race conditions. (#8663)

  • Fixed quorum-based failover to work correctly in clusters with only two instances using synchronous replication. (#8680)
  • Fixed configuration hash calculation to ignore internal configuration fields, preventing unnecessary reconciliations. (#8868)

  • Fixed the connection retry logic in the cnpgi plugin. The reconciliation loop now detects connection pool changes correctly and uses exponential backoff to reduce "closed pool" errors. (#8554)

  • Fixed volume snapshot usage during replica scaling to work with backup plugins. Previously, this optimization was only available with the in-tree backup implementation, but now clusters using backup plugins can also leverage volume snapshots when creating new replicas. (#8506)

  • Fixed the Pooler templating to correctly inherit settings for the bootstrap controller init container. (#8394)

  • Fixed webhook errors to use the correct API group (postgresql.k8s.enterprisedb.io) in Pooler and backup webhooks, ensuring consistent API error reporting. (#8485)

  • Fixed a potential nil pointer dereference in the hibernation reconciler when handling errors. Contributed by @PascalBourdier. (#8756)

  • Fixed an issue in the environment cache where callers could inadvertently modify shared data. The LoadEnv function now returns a copy of cached environment slices to prevent mutations from affecting the cache. (#8880)

v1.27.0

19 Aug 11:52
988bdd3

Choose a tag to compare

Release date: Aug 19, 2025

Important changes:

Features:

  • Dynamic loading of PostgreSQL extensions: Introduced the .spec.postgresql.extensions stanza for mounting PostgreSQL extensions, packaged as OCI-compliant container images, as read-only and immutable volumes inside instance pods. This allows dynamic extension management without rebuilding base images. (#7991).

  • Logical decoding slot synchronization in HA clusters: Added the synchronizeLogicalDecoding field under spec.replicationSlots.highAvailability to enable automatic synchronization of logical decoding slots across high-availability clusters, ensuring logical replication subscribers continue seamlessly after a publisher failover (#7931).

  • Primary Isolation Check: Promoted to stable the liveness pinger experimental feature introduced in 1.26, adding the .spec.probes.liveness.isolationCheck section to enable primary isolation checks in the liveness probe by default. This improves the detection and handling of primary connectivity issues in Kubernetes environments (#7845).

Enhancements:

  • Introduced an opt-in experimental feature that enables quorum-based failover to improve safety and data durability during failover events. This feature, also called failover quorum, can be activated via the alpha.k8s.enterprisedb.io/failoverQuorum annotation. (#7572).

  • Added support for user maps for predefined users such as streaming_replica, allowing the use of self-managed client certificates with different Common Names in environments with strict policies or shared CAs, while still enabling replicas to join clusters using the streaming_replica role (#7725).

  • Added a new PhaseFailurePlugin phase in the Cluster status to improve observability of plugin-related failures (#7988).

  • Made the Backup.spec field immutable after creation, ensuring consistency and predictability in backup operations (#7904).

  • Added fqdn-uri and fqdn-jdbc-uri fields in the user secret to simplify the retrieval of fully qualified domain name-based connection strings (#7852).

  • CNP-I:

    • Added Postgres interface support to the CNP-I operator, continuing the transition toward a plugin-based architecture (#7179).

    • Added metrics capabilities to the CNP-I instance webserver, enabling metrics exposure directly from the instance for better observability (#8033).

Fixes

  • Unblocked rollouts when migrating to the barman-cloud plugin using the switchover strategy. Former primary Pods now restart correctly after WAL archiving fails due to missing plugin support. (#8236)

Supported versions

  • Kubernetes 1.33, 1.32, and 1.31
  • PostgreSQL 17, 16, 15, 14, and 13
    • PostgreSQL 17.5 is the default image
    • PostgreSQL 13 support ends on November 12, 2025

v1.27.0-rc1

30 Jul 09:19
988bdd3

Choose a tag to compare

v1.27.0-rc1 Pre-release
Pre-release

Release date: Jul 29, 2025

Important changes:

Features:

  • Dynamic loading of PostgreSQL extensions: Introduced the .spec.postgresql.extensions stanza for mounting PostgreSQL extensions, packaged as OCI-compliant container images, as read-only and immutable volumes inside instance pods. This allows dynamic extension management without rebuilding base images. (#7991).

  • Logical decoding slot synchronization in HA clusters: Added the synchronizeLogicalDecoding field under spec.replicationSlots.highAvailability to enable automatic synchronization of logical decoding slots across high-availability clusters, ensuring logical replication subscribers continue seamlessly after a publisher failover (#7931).

  • Primary Isolation Check: Promoted to stable the liveness pinger experimental feature introduced in 1.26, adding the .spec.probes.liveness.isolationCheck section to enable primary isolation checks in the liveness probe by default. This improves the detection and handling of primary connectivity issues in Kubernetes environments (#7845).

Enhancements:

  • Introduced an opt-in experimental feature that enables quorum-based failover to improve safety and data durability during failover events. This feature, also called failover quorum, can be activated via the alpha.k8s.enterprisedb.io/failoverQuorum annotation. (#7572).

  • Added support for user maps for predefined users such as streaming_replica, allowing the use of self-managed client certificates with different Common Names in environments with strict policies or shared CAs, while still enabling replicas to join clusters using the streaming_replica role (#7725).

  • Added a new PhaseFailurePlugin phase in the Cluster status to improve observability of plugin-related failures (#7988).

  • Made the Backup.spec field immutable after creation, ensuring consistency and predictability in backup operations (#7904).

  • Added fqdn-uri and fqdn-jdbc-uri fields in the user secret to simplify the retrieval of fully qualified domain name-based connection strings (#7852).

  • CNP-I:

    • Added Postgres interface support to the CNP-I operator, continuing the transition toward a plugin-based architecture (#7179).

    • Added metrics capabilities to the CNP-I instance webserver, enabling metrics exposure directly from the instance for better observability (#8033).

Supported versions

  • Kubernetes 1.33, 1.32, and 1.31
  • PostgreSQL 17, 16, 15, 14, and 13
    • PostgreSQL 17.5 is the default image
    • PostgreSQL 13 support ends on November 12, 2025

v1.26.3

16 Dec 08:59
988bdd3

Choose a tag to compare

Release date: Dec 9, 2025

!!! Warning This is the final release in the 1.26.x series. Users are strongly encouraged to upgrade to a newer minor version, as 1.26 is no longer supported.

Changes

  • Updated the default PostgreSQL version to 18.1-standard-ubi9. (#9178)

  • Updated the default PgBouncer version to 1.25.1 for new Pooler deployments. (#9367)

Enhancements

  • Added the PostgreSQL majorVersion to the Backup object's status for easier identification and management. (#8464)

  • Added the PGBOUNCER_IMAGE_NAME operator configuration parameter to allow overriding the default PgBouncer image. This is useful for air-gapped environments or when using internal registries. (#9232)

  • cnp plugin:

    • Improved cnp report to generate more shell-friendly file names. (#8984)

Fixes

  • Fixed the CheckEmptyWalArchive safeguard to run correctly when restoring from a volume snapshot using CNP-I backup/WAL plugins (e.g., plugin-barman-cloud). Previously, this check was skipped for plugin-based implementations. (#9306)

  • Fixed TLS certificate verification issues when connecting to CNP-I plugins by adding the k8s.enterprisedb.io/pluginServerName annotation. This allows customizing the DNS name used for certificate verification in environments where the plugin's certificate uses a different DNS name than the Service name. (#9222)

  • Fixed an issue where the instance manager controller could fail to restart after an error, reporting a "controller already exists" message. The controller now uses SkipNameValidation for subsequent initialization attempts. Contributed by @mateusoliveira43. (#9123)

  • Fixed incorrect WAL restore path handling in plugins when the destination path is absolute, preventing path duplication issues. Contributed by @Endevir. (#9093)

  • Fixed the CREATE PUBLICATION SQL generation for multi-table publications to be backward-compatible with PostgreSQL 13+. The previously generated syntax was only valid for PostgreSQL 15+ and caused syntax errors on older versions. (#8888)

  • Fixed backup failures in complex pod definitions by reliably selecting the postgres container by name instead of by index. Contributed by @Joda89. (#8964)

  • cnp plugin:

    • Fixed bugs in cnp report log collection, especially when fetching previous logs. The collector now correctly fetches previous and current logs in separate requests and gracefully handles missing previous logs (e.g., on containers with no restart history), ensuring current logs are always collected. (#8992)