Dépannage — PostgreSQL
Pod PostgreSQL en état Pending
Cause : le PersistentVolumeClaim (PVC) ne parvient pas à se lier à un volume. Cela peut être dû à une storageClass inexistante, un quota de stockage dépassé ou un manque de ressources sur les nœuds.
Solution :
- Vérifiez l'état du pod et les événements associés :
kubectl describe pod pg-<name>-1 - Vérifiez l'état du PVC :
kubectl get pvc
kubectl describe pvc pg-<name>-1 - Vérifiez que la
storageClassutilisée est bien l'une des classes disponibles :local,replicatedoureplicated-async. - Vérifiez que votre quota de stockage n'est pas atteint.
- Si nécessaire, corrigez la
storageClassdans votre manifeste et réappliquez :kubectl apply -f postgresql.yaml
Réplication désynchronisée entre primary et standby
Cause : un décalage (lag) de réplication peut survenir en raison d'une charge réseau élevée, de ressources insuffisantes sur les standby, ou d'un volume de transactions important sur le primary.
Solution :
- Connectez-vous au primary et vérifiez l'état de la réplication :
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn
FROM pg_stat_replication; - Comparez les positions LSN entre
sent_lsnetreplay_lsn. Un écart important indique un lag. - Vérifiez les ressources allouées aux standby (CPU, mémoire). Si nécessaire, augmentez le
resourcesPresetou lesresourcesexplicites. - Vérifiez la connectivité réseau entre les pods :
kubectl logs pg-<name>-2 - Si le lag persiste, envisagez de réduire la charge d'écriture sur le primary ou d'augmenter les ressources.
Connexion refusée à PostgreSQL
Cause : les pods ne sont pas en cours d'exécution, le nom du Secret est incorrect, ou le service n'est pas accessible.
Solution :
- Vérifiez que les pods PostgreSQL sont en état
Running:kubectl get pods -l app=pg-<name> - Vérifiez que le service existe et pointe vers les bons endpoints :
kubectl get svc pg-<name>-rw
kubectl get endpoints pg-<name>-rw - Assurez-vous d'utiliser le bon nom de Secret pour les identifiants. Le pattern est
pg-<name>-app:kubectl get tenantsecret pg-<name>-app - Testez la connexion depuis un pod dans le même namespace :
kubectl run test-pg --rm -it --image=postgres:16 -- psql -h pg-<name>-rw -p 5432 -U <user>
Restauration PITR échouée
Cause : les paramètres de bootstrap sont mal configurés. Le champ bootstrap.oldName doit correspondre exactement au nom de l'instance d'origine, et le nom de la nouvelle instance doit être différent.
Solution :
- Vérifiez que
bootstrap.oldNamecorrespond exactement au nom de l'instance PostgreSQL d'origine :postgresql-restore.yamlapiVersion: apps.cozystack.io/v1alpha1
kind: Postgres
metadata:
name: restored-db # Doit être un nouveau nom
spec:
bootstrap:
enabled: true
oldName: "original-db" # Nom exact de l'ancienne instance
recoveryTime: "2025-06-15T14:30:00Z" # Format RFC 3339 - Le
recoveryTimedoit être au format RFC 3339 (ex:2025-06-15T14:30:00Z). Si laissé vide, la restauration se fait au dernier état disponible. - Le nom dans
metadata.namedoit être différent debootstrap.oldName. - Assurez-vous que les sauvegardes de l'instance d'origine sont toujours accessibles dans le stockage S3.
Performances lentes
Cause : les paramètres PostgreSQL ne sont pas adaptés à la charge de travail, ou les ressources allouées sont insuffisantes.
Solution :
- Ajustez les paramètres PostgreSQL dans votre manifeste :
postgresql.yaml
spec:
postgresql:
parameters:
shared_buffers: 512MB # ~25% de la RAM allouée
work_mem: 64MB # Mémoire par opération de tri
max_connections: 200 # Adapter selon la charge
effective_cache_size: 1536MB # ~75% de la RAM - Vérifiez que le
resourcesPresetest adapté à votre charge :- Développement :
nanooumicro - Production :
medium,largeou supérieur
- Développement :
- Surveillez l'utilisation des ressources :
kubectl top pod pg-<name>-1 - Si les requêtes sont lentes, identifiez-les avec
pg_stat_statementset optimisez les index. - Augmentez les ressources si nécessaire en passant à un preset supérieur ou en définissant des
resourcesexplicites.