Risoluzione dei problemi — PostgreSQL
Pod PostgreSQL in stato Pending
Causa: il PersistentVolumeClaim (PVC) non riesce a legarsi a un volume. Questo può essere dovuto a una storageClass inesistente, una quota di archiviazione superata o una mancanza di risorse sui nodi.
Soluzione:
- Verificate lo stato del pod e gli eventi associati:
kubectl describe pod pg-<name>-1 - Verificate lo stato del PVC:
kubectl get pvc
kubectl describe pvc pg-<name>-1 - Verificate che la
storageClassutilizzata sia una delle classi disponibili:local,replicatedoreplicated-async. - Verificate che la vostra quota di archiviazione non sia stata raggiunta.
- Se necessario, correggete la
storageClassnel vostro manifesto e riapplicate:kubectl apply -f postgresql.yaml
Replica desincronizzata tra primary e standby
Causa: un ritardo (lag) di replica può verificarsi a causa di un carico di rete elevato, risorse insufficienti sugli standby, o un volume di transazioni importante sul primary.
Soluzione:
- Connettetevi al primary e verificate lo stato della replica:
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn
FROM pg_stat_replication; - Confrontate le posizioni LSN tra
sent_lsnereplay_lsn. Un divario importante indica un lag. - Verificate le risorse allocate agli standby (CPU, memoria). Se necessario, aumentate il
resourcesPreseto leresourcesesplicite. - Verificate la connettività di rete tra i pod:
kubectl logs pg-<name>-2 - Se il lag persiste, considerate la riduzione del carico di scrittura sul primary o l'aumento delle risorse.
Connessione rifiutata a PostgreSQL
Causa: i pod non sono in esecuzione, il nome del Secret e errato, o il servizio non è accessibile.
Soluzione:
- Verificate che i pod PostgreSQL siano nello stato
Running:kubectl get pods -l app=pg-<name> - Verificate che il servizio esista e punti agli endpoint corretti:
kubectl get svc pg-<name>-rw
kubectl get endpoints pg-<name>-rw - Assicuratevi di usare il nome corretto del Secret per le credenziali. Il pattern e
pg-<name>-app:kubectl get tenantsecret pg-<name>-app - Testate la connessione da un pod nello stesso namespace:
kubectl run test-pg --rm -it --image=postgres:16 -- psql -h pg-<name>-rw -p 5432 -U <user>
Ripristino PITR fallito
Causa: i parametri di bootstrap sono mal configurati. Il campo bootstrap.oldName deve corrispondere esattamente al nome dell'istanza originale, e il nome della nuova istanza deve essere diverso.
Soluzione:
- Verificate che
bootstrap.oldNamecorrisponda esattamente al nome dell'istanza PostgreSQL originale:postgresql-restore.yamlapiVersion: apps.cozystack.io/v1alpha1
kind: Postgres
metadata:
name: restored-db # Deve essere un nuovo nome
spec:
bootstrap:
enabled: true
oldName: "original-db" # Nome esatto della vecchia istanza
recoveryTime: "2025-06-15T14:30:00Z" # Formato RFC 3339 - Il
recoveryTimedeve essere nel formato RFC 3339 (es:2025-06-15T14:30:00Z). Se lasciato vuoto, il ripristino avviene all'ultimo stato disponibile. - Il nome in
metadata.namedeve essere diverso dabootstrap.oldName. - Assicuratevi che i backup dell'istanza originale siano ancora accessibili nello storage S3.
Prestazioni lente
Causa: i parametri PostgreSQL non sono adatti al carico di lavoro, o le risorse allocate sono insufficienti.
Soluzione:
- Regolate i parametri PostgreSQL nel vostro manifesto:
postgresql.yaml
spec:
postgresql:
parameters:
shared_buffers: 512MB # ~25% della RAM allocata
work_mem: 64MB # Memoria per operazione di ordinamento
max_connections: 200 # Adattare in base al carico
effective_cache_size: 1536MB # ~75% della RAM - Verificate che il
resourcesPresetsia adatto al vostro carico:- Sviluppo:
nanoomicro - Produzione:
medium,largeo superiore
- Sviluppo:
- Monitorate l'utilizzo delle risorse:
kubectl top pod pg-<name>-1 - Se le query sono lente, identificatele con
pg_stat_statementse ottimizzate gli indici. - Aumentate le risorse se necessario passando a un preset superiore o definendo
resourcesesplicite.