Skip to content

PostgresCluster ​

Ambito: namespaced · Backend: CloudNativePG (type: cnpg)

PostgreSQL condiviso con database per consumer all'interno di un unico cluster. Il motore è intercambiabile tramite type; cnpg è implementato, zalando e cockroachdb sono predisposti (scaffolded).

Spec ​

CampoTipoDescrizione
typeenum cnpg (predefinito) | zalando | cockroachdbImplementazione del backend
modeenum managed | adopt | external (obbligatorio)Modalità di provenienza
managedobjectImpostazioni quando mode: managed
adoptobjectRiferimento a un Cluster CNPG esistente
externalobjectSecret di connessione per un database esterno
databases[]listDatabase da garantire all'interno del cluster (uno per ogni workload consumer)

managed ​

CampoPredefinitoDescrizione
instances3Numero di repliche HA di CNPG
storageSize—Dimensione del PVC per istanza
storageClassdefault del clusterStorageClass
resources—Request e limit di CPU/memoria
backupdisattivatoBackup pianificati su object storage (vedi backup)

backup ​

Disattivato per default. Quando è abilitato, l'operatore configura i backup su object store di CNPG (Barman in-tree) e l'archiviazione WAL continua — offrendo backup completi pianificati e ripristino point-in-time. Emette il blocco Cluster.spec.backup più uno ScheduledBackup. Le credenziali provengono da un Secret tramite SecretsManagement — mai inline.

CampoPredefinitoDescrizione
enabledfalseAttiva i backup pianificati + l'archiviazione WAL
providers3s3, azure o gcs
s3 / azure / gcs—Blocco del provider (quello corrispondente a provider è obbligatorio)
schedule0 0 2 * * *Cron a 6 campi con i secondi (formato CNPG, non a 5 campi) — per default ogni giorno alle 02:00
retentionPolicy30dRetention della finestra di ripristino, ad es. 30d, 4w

Blocchi del provider — ciascuno accetta un destinationPath più le credenziali (o un'alternativa basata su workload identity, così non viene memorizzata alcuna chiave statica):

ProviderdestinationPathChiavi del Secret delle credenzialiWorkload identity
s3s3://bucket/path (+ endpointURL facoltativo per MinIO/R2)access-key-id, secret-access-keyinheritFromIAMRole: true
azurehttps://<acct>.blob.core.windows.net/<container>/connection-stringinheritFromAzureAD: true
gcsgs://bucket/pathcredentials (JSON del service account)gkeEnvironment: true

Il destinationPath deve includere un segmento container/bucket — un https://<acct>.blob.core.windows.net/ nudo (Azure) o un s3:// senza bucket produce una destinazione di backup su cui non si può scrivere. I job di backup di ClickHouse e MongoDB rifiutano un percorso senza container con un evento di warning BackupMisconfigured sul datastore, invece di emettere un CronJob i cui pod falliscono.

adopt / external ​

CampoDescrizione
adopt.clusterRefUn Cluster CNPG esistente (postgresql.cnpg.io/v1); namespace è facoltativo e può indicare un altro namespace — vedi l'adozione tra namespace
external.connectionSecretRefSecret che contiene un DATABASE_URL

databases[] ​

CampoDescrizione
nameNome del database
ownerRuolo proprietario (facoltativo)
credentialsSecretNameSecret che l'operatore materializza per il consumer

I workload che fanno riferimento a questo cluster ottengono il proprio database anche quando non è dichiarato qui, con la licenza auto-wiring; status.databases[].claimedBy mostra chi usa ciascuno. Un nome di database che Kubernetes non può usare nei nomi degli oggetti (ad esempio langfuse_prod) riceve un nome sanificato per il suo Database CNPG e il Secret delle credenziali. Vedi Database per i workload che fanno riferimento a un datastore.

Comportamento per modalità ​

  • managed (type: cnpg) — garantisce l'operatore cloudnative-pg, crea un Cluster CNPG e crea un Database CNPG (più ruolo e Secret delle credenziali) per ogni voce di databases[].
  • adopt — risolve il Cluster referenziato, garantisce i database al suo interno e non tocca mai il ciclo di vita del cluster. Quando il cluster si trova in un altro namespace, le risorse Database CNPG vengono create accanto a esso (CNPG risolve Database.spec.cluster nel namespace del Database stesso), mentre il Secret delle credenziali del consumer viene comunque materializzato in questo namespace. Eliminare questa risorsa rimuove quelle CR Database — mai il cluster adottato.
  • external — espone il DATABASE_URL fornito; nessun operatore viene installato.
  • zalando / cockroachdb — predisposti; la risorsa riporta Ready=False con reason BackendNotImplemented.

Esempio — managed, due database ​

yaml
apiVersion: core.navique.com/v1alpha1
kind: PostgresCluster
metadata:
  name: forge-pg
  namespace: forge-data
spec:
  type: cnpg
  mode: managed
  managed:
    instances: 3
    storageSize: 20Gi
  databases:
    - { name: litellm,  credentialsSecretName: litellm-db-credentials }
    - { name: langfuse, credentialsSecretName: langfuse-db-credentials }

Esempio — external (porta il tuo Postgres gestito) ​

yaml
spec:
  type: cnpg
  mode: external
  external:
    connectionSecretRef: { name: azure-postgres, key: DATABASE_URL }
  databases:
    - { name: litellm, credentialsSecretName: litellm-db-credentials }

Esempio — managed con backup S3 pianificati ​

yaml
spec:
  type: cnpg
  mode: managed
  managed:
    instances: 3
    storageSize: 20Gi
    backup:
      enabled: true
      provider: s3
      schedule: "0 0 2 * * *"   # daily 02:00 (6-field cron: sec min hour dom mon dow)
      retentionPolicy: 30d
      s3:
        destinationPath: s3://forge-backups/pg
        # endpointURL: https://minio.example.com:9000   # for S3-compatible stores
        credentialsSecretRef: { name: pg-backup }        # keys: access-key-id, secret-access-key
  databases:
    - { name: litellm, credentialsSecretName: litellm-db-credentials }

Ripristino ​

Un Postgres managed viene salvato in modo continuo da CNPG (backup di base + archiviazione WAL), quindi il ripristino è un point-in-time recovery (PITR) verso un nuovo cluster che si inizializza dallo stesso object store — CNPG non ripristina mai sul posto. Crea un secondo Cluster con una sorgente bootstrap.recovery che punta al barmanObjectStore del backup; l'operatore navique non modella il ripristino come CRD, quindi applica direttamente il Cluster CNPG:

yaml
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata: { name: forge-pg-restored, namespace: forge }
spec:
  instances: 1
  bootstrap:
    recovery:
      source: forge-pg
      # recoveryTarget: { targetTime: "2026-06-27 14:00:00+00" }   # omit = latest
  externalClusters:
    - name: forge-pg
      barmanObjectStore:
        destinationPath: s3://my-bucket/postgres
        s3Credentials:
          accessKeyId:     { name: pg-backup, key: access-key-id }
          secretAccessKey: { name: pg-backup, key: secret-access-key }

Quando forge-pg-restored è healthy, ricollega i workload (oppure passa il PostgresCluster a mode: adopt facendo riferimento a esso). Riferimento completo: CNPG recovery. Il Lock creato automaticamente protegge l'originale da un'eliminazione accidentale durante il ripristino — mantienilo finché non hai verificato i dati ripristinati.

Condivisione tra workload ​

Un singolo PostgresCluster supporta tipicamente sia il Gateway (DB litellm) sia Langfuse (DB langfuse). Ogni consumer fa riferimento al cluster e indica il nome del proprio database; l'operatore predispone un database isolato e un Secret delle credenziali per ciascun consumer.

Status ​

Espone le coordinate di connessione e, per ogni database, lo stato di prontezza e il nome del Secret delle credenziali, oltre alle conditions e all'observedGeneration standard.

Nucleo open source sotto AGPL-3.0. I componenti Enterprise sono proprietari e soggetti a licenza.