Aller au contenu

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