Saltar a contenido

CloudNativePG

Operador de PostgreSQL en Kubernetes (Postgres auto-gestionado).

Resumen

CloudNativePG gestiona clusters PostgreSQL en el cluster k3s. Sustituye a la MariaDB legacy compartida (lebron). Decisión: un cluster por servicio, para desacoplar (ver docs/legacy/mariadb.md). Primer cluster: vaultwarden-db para Vaultwarden.

Estado

Campo Valor
Estado Operativo
Argo CD Application cloudnative-pg
Namespace cnpg-system (operador)

Despliegue

Campo Valor
Método Helm cloudnative-pg (multi-source)
Versión (chart/app) 0.29.0 / 1.30.0
App clusters/luka/apps/cloudnative-pg/application.yaml
Config clusters/luka/config/cloudnative-pg/

Clusters

Cluster Namespace Instancias BD / owner Consumidor
vaultwarden-db vaultwarden 2 (primario + standby) vaultwarden / vaultwarden Vaultwarden

Red

Campo Valor
Service vaultwarden-db-rw (ClusterIP; -r, -ro para solo lectura)
URL — (no expuesto; solo interno)

Acceso y usuarios

  • Superuser postgres (secret vaultwarden-db-superuser, SealedSecret kubernetes.io/basic-auth).
  • App vaultwarden (secret vaultwarden-db-app, SealedSecret kubernetes.io/basic-auth).
  • Credenciales también en el .env local (para importarlas a Vaultwarden).

Configuración

  • crds.create: true (el chart instala los CRDs).
  • ServerSideApply=true en la Application: los CRDs de CNPG (clusters, poolers) superan 256 KB y con client-side apply Argo CD añade last-applied-configuration, excediendo el límite de annotations (262144 bytes) y rompiendo el sync.
  • instances: 2 (1 primario + 1 standby, replicación streaming).
  • affinity.podAntiAffinityType: required → una instancia por nodo (tolerancia real a la caída de una VM).
  • enableSuperuserAccess: true → el superuser postgres es usable (sin esto, el operador ignora el superuserSecret y deja la password en NULL).
  • storage.size: 1Gi sobre Longhorn (SC por defecto).
  • Recursos contenidos: request 256Mi/100m, limit 1Gi/500m por instancia.
  • monitoring.podMonitorEnabled desactivado (hasta kube-prometheus-stack).
  • Cluster protegido con argocd.argoproj.io/sync-options: Prune=false,Delete=false (Argo CD no puede borrar el Cluster ni sus PVCs).

Almacenamiento

  • PVCs del cluster sobre longhorn (replica=2). ~4×1Gi efectivos repartidos entre nodos.

Dependencias

  • Depende de: k3s, Longhorn, Sealed Secrets.
  • Usado por: Vaultwarden; previstos n8n y Shlink.

Backup y recuperación

  • Backup operativo: Barman Cloud → R2 s3://homelab-cnpg-backups/vaultwarden-db (base diario 02:00 vía ScheduledBackup vaultwarden-db-daily, WAL continuo para PITR, retención 30 días). Token R2 dedicado en SealedSecret cnpg-backup.
  • Restauración PITR: ver docs/runbooks/cnpg-backup-restore.md.

Monitorización

  • Scrapeado vía PodMonitor cloudnative-pg (pods del cluster vaultwarden-db, puerto metrics :9187) en clusters/luka/config/servicemonitors/cnpg.yaml.

Referencias

  • https://cloudnative-pg.io/
  • Chart: https://cloudnative-pg.github.io/charts

Notas / TODO

  • Habilitar PodMonitor con kube-prometheus-stack.
  • Crear los clusters de n8n y Shlink cuando se desplieguen.