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.