DEV Community

daniel jeong
daniel jeong

Posted on • Originally published at manoit.co.kr

Complete Guide to CloudNativePG 1.29 + PostgreSQL 18 — Production Kubernetes Database Operator Setup

Complete Guide to CloudNativePG 1.29 + PostgreSQL 18 — Production Kubernetes Database Operator Setup

At KubeCon Europe 2026 in Amsterdam, EDB announced the general availability of CloudNativePG 1.29, setting a new milestone for Kubernetes database operators. This release introduces modular extension management and supply chain security as core features, combining with PostgreSQL 18's asynchronous I/O performance revolution to fundamentally transform cloud-native database operations.

Since joining the CNCF Sandbox in January 2025, CloudNativePG has surpassed 5,000 GitHub stars and 58 million downloads, becoming the de facto standard PostgreSQL operator for Kubernetes. Simultaneously, Percona Operator 2.9.0 (released April 1, 2026) has adopted PostgreSQL 18 as its default version, intensifying the competition. This guide compares both operators and covers production deployment strategies.

PostgreSQL 18 Key Features — Async I/O and Protocol Innovation

Released in September 2025, PostgreSQL 18 includes the first wire protocol update since 2003 (v3.2) and fundamentally redesigns the I/O subsystem. With the 18.3 point release in February 2026, it has reached production-grade maturity.

Asynchronous I/O (AIO) Subsystem

The most revolutionary change in PostgreSQL 18 is the asynchronous I/O subsystem. Previously, each I/O request waited sequentially until completion. The new AIO issues multiple I/O requests concurrently. The io_method setting offers two modes: worker (default) and io_uring (direct kernel submission on Linux).

Benchmark PostgreSQL 17 PostgreSQL 18 (AIO) Improvement
Read workload throughput Baseline Up to 3x 200% gain
Cloud SSD (TPS) Baseline 35-40% increase i4i.4xlarge
Hyperdisk Extreme Baseline 40-45% throughput IOPS-matched
K8s vs Docker (TPS) Docker baseline K8s 15-47% advantage Pod isolation

Developer Productivity Features

PostgreSQL 18 includes immediately applicable features: uuidv7() generates timestamp-ordered UUIDs for optimized index performance. Virtual Generated Columns compute values at read time, saving storage. Skip Scan extends multicolumn B-tree index utilization. OAuth authentication, OLD/NEW references in RETURNING clauses, and Temporal Primary Key/Foreign Key support are also added.

Critically, planner statistics are now preserved through major version upgrades — previously, statistics reset after upgrades could cause severe query performance degradation.

CloudNativePG 1.29 — Modular Extensions and Supply Chain Security

CloudNativePG 1.29 revolutionizes PostgreSQL extension management with the Image Catalog system and artifacts ecosystem.

Image Catalog and Modular Extensions

Previously, using extensions like PostGIS, pgvector, or TimescaleDB required building custom images with all extensions bundled. CloudNativePG 1.29's Image Catalog decouples extensions from the core database. Declare needed extensions in the cluster manifest, and the operator dynamically loads them:

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: app-db
spec:
  instances: 3
  imageCatalogRef:
    apiGroup: postgresql.cnpg.io
    kind: ImageCatalog
    name: postgresql-catalog
    major: 18
  # Modular extension declaration
  plugins:
    - name: pgvector
      version: "0.8.0"
    - name: postgis
      version: "3.5"
  storage:
    size: 100Gi
    storageClass: gp3-encrypted
Enter fullscreen mode Exit fullscreen mode

Dynamic Network Access Control

CloudNativePG 1.29 introduces podSelectorRefs for dynamic pg_hba.conf management. Label selectors identify client pods, and the operator automatically resolves their ephemeral IP addresses to update HBA rules — no manual management needed when pods restart:

spec:
  postgresql:
    pg_hba:
      - access: host
        database: app_db
        user: app_user
        method: scram-sha-256
        # Label-based dynamic IP resolution
        podSelectorRefs:
          - matchLabels:
              app: backend-api
              tier: application
Enter fullscreen mode Exit fullscreen mode

Declarative Major Version Upgrades

Simply updating the container image to a new major version triggers an offline in-place upgrade. The cluster shuts down safely, pg_upgrade runs automatically, and combined with PostgreSQL 18's planner statistics preservation, the cluster reaches optimal performance immediately after upgrade.

Percona Operator 2.9.0 — PostgreSQL 18 as Default

Released April 1, 2026, Percona Operator 2.9.0 takes a different approach to Kubernetes database operations.

Feature CloudNativePG 1.29 Percona 2.9.0
Default PG version 18.0 (Trixie-based) 18 (default)
HA architecture Native streaming replication Patroni-based
Extension management Image Catalog (modular) Official PostGIS image
Major upgrades Declarative in-place In-place (production-ready)
Backup Barman + volume snapshots pgBackRest + PVC snapshots (TP)
Authentication Dynamic HBA + IAM LDAP (Simple Bind + Search)
Monitoring Built-in Prometheus metrics PMM (Percona Monitoring)
Operator upgrades Manual Automated
CNCF status Sandbox project N/A
License Apache 2.0 Apache 2.0 (all features open)

Percona 2.9.0's key differentiator is PVC snapshot-based backup. For large databases, pgBackRest streaming creates high CPU and network load, while PVC snapshots create instant backups at the storage level.

Production Deployment — CloudNativePG Cluster Setup

Step 1: Operator Installation

# Install CloudNativePG via Helm
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm repo update

helm install cnpg-operator cnpg/cloudnative-pg \
  --namespace cnpg-system \
  --create-namespace \
  --set monitoring.podMonitorEnabled=true \
  --set monitoring.grafanaDashboard.create=true \
  --version 0.23.0

# Verify installation
kubectl get deployment -n cnpg-system
kubectl wait --for=condition=Available deployment/cnpg-operator \
  -n cnpg-system --timeout=120s
Enter fullscreen mode Exit fullscreen mode

Step 2: HA Cluster Manifest

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: production-db
  namespace: database
spec:
  instances: 3                    # Primary 1 + Standby 2
  primaryUpdateStrategy: unsupervised # Auto failover

  imageCatalogRef:
    apiGroup: postgresql.cnpg.io
    kind: ImageCatalog
    name: pg-catalog
    major: 18

  # PostgreSQL 18 AIO optimization
  postgresql:
    parameters:
      io_method: "worker"            # io_uring requires kernel 6.1+
      effective_io_concurrency: "200" # SSD storage baseline
      maintenance_io_concurrency: "20"
      shared_buffers: "4GB"
      work_mem: "64MB"
      max_connections: "200"
      max_wal_size: "4GB"
      wal_compression: "zstd"

  storage:
    size: 200Gi
    storageClass: gp3-encrypted

  resources:
    requests:
      cpu: "2"
      memory: 8Gi
    limits:
      cpu: "4"
      memory: 16Gi

  # Backup: S3 + WAL archiving
  backup:
    barmanObjectStore:
      destinationPath: s3://db-backups/production-db/
      s3Credentials:
        accessKeyId:
          name: backup-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: backup-creds
          key: SECRET_ACCESS_KEY
      wal:
        compression: gzip
    retentionPolicy: "30d"

  monitoring:
    enablePodMonitor: true
Enter fullscreen mode Exit fullscreen mode

PostgreSQL 18 AIO Tuning Guide

Storage Type io_method effective_io_concurrency Notes
AWS EBS gp3 worker 200 Base 3,000 IOPS
AWS io2 Block Express io_uring 500 Kernel 6.1+ required
GCP Hyperdisk Extreme io_uring IOPS/4 match 40-45% throughput gain
Local NVMe io_uring 1000 Maximum performance
-- PostgreSQL 18 AIO configuration check
SHOW io_method;              -- worker | io_uring
SHOW effective_io_concurrency; -- Default 1, SSD recommended 200

-- uuidv7() — timestamp-ordered UUID
CREATE TABLE orders (
  id UUID DEFAULT uuidv7() PRIMARY KEY,
  user_id UUID NOT NULL,
  total DECIMAL(10,2),
  created_at TIMESTAMPTZ DEFAULT now()
);
-- uuidv7 is time-sorted, optimizing B-tree index insertions

-- Virtual Generated Column
CREATE TABLE products (
  id UUID DEFAULT uuidv7() PRIMARY KEY,
  price DECIMAL(10,2),
  tax_rate DECIMAL(5,4),
  -- Computed at read time, no storage used
  total_price DECIMAL(10,2) GENERATED ALWAYS AS (price * (1 + tax_rate)) VIRTUAL
);
Enter fullscreen mode Exit fullscreen mode

Operator Selection Guide — Decision Matrix

Scenario Recommended Reason
CNCF ecosystem alignment CloudNativePG CNCF Sandbox, active community
Extension diversity (pgvector) CloudNativePG Image Catalog modular management
Enterprise LDAP integration Percona Native LDAP authentication
Large DB backup optimization Percona PVC snapshot-based fast backup
Multi-DB engine (PG + MySQL + MongoDB) Percona Unified operator ecosystem
AI/RAG workloads (pgvector) CloudNativePG pgvector module + AIO optimization

Operations Checklist — Pre-Production Verification

# 1. Cluster status
kubectl get cluster -n database
kubectl cnpg status production-db -n database

# 2. Replication status (Standby lag)
kubectl cnpg status production-db -n database --verbose | grep -i lag

# 3. Backup status
kubectl get backup -n database
kubectl get scheduledbackup -n database

# 4. Failover test
kubectl cnpg promote production-db-2 -n database

# 5. Install cnpg kubectl plugin
kubectl krew install cnpg
Enter fullscreen mode Exit fullscreen mode

Conclusion — The Maturity of Kubernetes Databases

The combination of CloudNativePG 1.29 and PostgreSQL 18 sets a new standard for running stateful workloads on Kubernetes. Modular extensions eliminate image management complexity, asynchronous I/O overcomes cloud storage performance limitations, and declarative major upgrades automate PostgreSQL lifecycle management.

With the surge in AI/RAG workloads driving pgvector demand, CloudNativePG's Image Catalog enables managing pgvector as an independent module while leveraging PostgreSQL 18's AIO performance for vector search. Percona Operator 2.9.0 provides enterprise-focused options with LDAP authentication and PVC snapshots. Choose the operator that fits your project requirements, but upgrading to PostgreSQL 18 delivers immediate value on both platforms.


This article was written with AI assistance (Claude Opus 4.6). Technical facts are verified against official documentation and release notes. For the latest information, refer to CloudNativePG Releases, PostgreSQL 18 Release Notes, and Percona Operator Docs. Published: April 3, 2026 | ManoIT Tech Blog


Originally published at ManoIT Tech Blog.

Top comments (0)