PostgreSQL Data — Base de données analytique¶
PostgreSQL Data est la base de données fonctionnelle dédiée d'AKKO, séparée de l'instance PostgreSQL d'infrastructure. Elle exécute l'image personnalisée akko-postgres avec PostGIS (géospatial) et pgvector (embeddings vectoriels pour le RAG), servant les charges analytiques, les requêtes géospatiales et les cas d'usage IA/ML.
Architecture¶
JupyterHub Trino Airflow DAGs
\ | /
+-------------v--------------+
| PostgreSQL Data (:5432) |
| image akko-postgres |
| PostGIS + pgvector |
+-----------------------------+
| Bases de données : |
| - akko (analytique) |
| - aden (moteur NL→SQL) |
| - données géospatiales |
| - store vectoriel RAG |
+-----------------------------+
- Séparée du PostgreSQL d'infra — ne jamais mélanger les données métier avec les métadonnées Keycloak/Airflow/Superset
- PostGIS permet les requêtes géospatiales (ST_Distance, ST_Contains, etc.)
- pgvector permet la recherche de similarité vectorielle pour les pipelines RAG (embeddings Ollama)
- pgaudit fournit la journalisation d'audit pour la conformité
URLs¶
PostgreSQL Data est un service interne uniquement (pas d'ingress). Il est accessible par les autres services du cluster sur le port 5432.
| Service | Connexion |
|---|---|
| Trino | jdbc:postgresql://akko-postgresql-data:5432/akko |
| JupyterHub | postgresql://akko-postgresql-data:5432/akko |
| ADEN | postgresql://akko-postgresql-data:5432/aden |
Configuration (valeurs Helm)¶
akko-postgresql-data:
enabled: true
image:
repository: akko-postgres
tag: "2026.03"
service:
port: 5432
persistence:
enabled: true
size: 20Gi
database: akko
username: postgres
config:
maxConnections: 200
sharedBuffers: 256MB
effectiveCacheSize: 768MB
workMem: 4MB
sharedPreloadLibraries: pgaudit
backup:
enabled: false
schedule: "0 2 * * *"
retention: 7
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
Healthcheck¶
PostgreSQL répond aux connexions TCP sur le port 5432 :
livenessProbe:
exec:
command:
- pg_isready
- -U
- postgres
initialDelaySeconds: 15
periodSeconds: 30
readinessProbe:
exec:
command:
- pg_isready
- -U
- postgres
initialDelaySeconds: 10
periodSeconds: 10
RBAC (qui peut accéder)¶
PostgreSQL Data n'est accessible que dans le cluster (pas d'ingress). L'accès est contrôlé par :
- Identifiants de base de données — stockés dans les secrets Kubernetes
- NetworkPolicy — restreint les pods autorisés à se connecter au port 5432
- pgaudit — journalise toutes les requêtes SQL pour l'audit de conformité
Fonctionnalités principales¶
| Fonctionnalité | Description |
|---|---|
| PostGIS | Types et fonctions géospatiales (geometry, geography, raster) |
| pgvector | Recherche de similarité vectorielle pour les pipelines RAG/IA |
| pgaudit | Journalisation d'audit SQL pour la conformité |
| Backup automatisé | CronJob optionnel avec pg_dumpall et rétention configurable |
| Config ajustable | Tuning postgresql.conf via ConfigMap |
Pourquoi deux instances PostgreSQL ?¶
AKKO utilise deux instances PostgreSQL par conception :
| Instance | Rôle | Données |
|---|---|---|
akko-postgresql |
Infrastructure | Keycloak, Airflow, Superset, Polaris, OpenMetadata, MLflow, JupyterHub |
akko-postgresql-data |
Fonctionnel | Analytique, géospatial, vecteurs RAG, ADEN, données client |
Cette séparation garantit :
- Des stratégies de backup/restore indépendantes
- Des profils de dimensionnement différents (l'infra est légère, les données peuvent être volumineuses)
- L'isolation de sécurité (les identifiants infra ne fuient jamais vers les utilisateurs analytiques)
- Un tuning PostgreSQL indépendant par charge de travail
Ressources requises¶
| Composant | RAM minimum | Recommandé |
|---|---|---|
| PostgreSQL Data | 512 Mi | 1 Gi |
Dépannage¶
Le pod ne démarre pas (Permission Denied)¶
Symptômes : Le pod entre en CrashLoopBackOff. Les logs affichent FATAL: data directory has wrong ownership.
Cause : Le PVC a des permissions incorrectes. L'image akko-postgres s'exécute en tant qu'UID 999.
Solution :
# Consulter les logs du pod
kubectl logs -n akko deploy/akko-postgresql-data --tail=50
# Vérifier que le PVC existe et est lié
kubectl get pvc -n akko | grep postgresql-data
Extension pgvector non disponible¶
Symptômes : CREATE EXTENSION vector échoue avec could not open extension control file.
Cause : Le pod exécute l'image PostgreSQL standard au lieu de l'image personnalisée akko-postgres.
Solution :
# Vérifier que la bonne image est utilisée
kubectl describe pod -n akko -l app.kubernetes.io/name=akko-postgresql-data | grep Image
# L'image devrait être akko-postgres:2026.03 (avec PostGIS + pgvector)
Connexion refusée depuis Trino¶
Symptômes : Les requêtes Trino sur le catalogue postgresql échouent avec Connection refused.
Cause : NetworkPolicy bloquant la connexion, ou PostgreSQL n'est pas prêt.
Solution :
# Vérifier la disponibilité de PostgreSQL
kubectl get pods -n akko -l app.kubernetes.io/name=akko-postgresql-data
# Tester la connectivité depuis le pod Trino
kubectl exec -n akko deploy/akko-trino -- pg_isready -h akko-postgresql-data -p 5432
# Vérifier la NetworkPolicy
kubectl get networkpolicy -n akko | grep postgresql-data