Aller au contenu

Stockage objet

AKKO embarque une couche de stockage objet S3-compatible comme socle pour le lac de données Iceberg, les event logs Spark, les artefacts MLflow, les uploads de PDF d'akko-rag, et tout autre besoin de stockage de blobs.

La surface publique est uniquement l'API S3, donc l'engine sous-jacent peut être remplacé (ou pointé vers AWS S3, Wasabi, OVH cloud-object- storage, etc.) sans changement de code dans la plateforme. Le déploiement vit dans le sub-chart akko-storage et tourne dans le même namespace akko que le reste de la plateforme.


Architecture

  Polaris ──────┐
                │ API S3 (signature v4)
  Trino ────────┼──→ akko-storage:<port-s3> ──→ /data PVC
  Spark ────────┤
  MLflow ───────┘

  akko-rag ─────→ /uploads/* via boto3
  Dashboards ADEN ─→ /reports/*

Tous les moteurs de calcul (Trino, Spark, akko-rag, MLflow) accèdent à la couche de stockage via l'API S3 standard ; ils ne savent pas quel est l'engine derrière. Pour swap vers un autre fournisseur S3-compatible, changer l'URL endpoint + les credentials dans values.yaml — aucun changement côté consommateur.


Ports

Port Rôle Exposé
8333 API S3 (REST, signature v4) ClusterIP
8888 UI admin ClusterIP uniquement — port-forward pour ops
9091 /metrics Prometheus scrapé par ServiceMonitor

Accès externe via Traefik : https://storage.akko-ai.com (ou la valeur de global.functionalAliases.storage dans vos overrides) — gardé par oauth2-proxy + SSO Keycloak.


Buckets seedés à l'installation

Le Job post-install akko-storage-bucket-init crée les buckets dont la plateforme a besoin :

Bucket Service propriétaire Rôle
akko-iceberg Polaris / Trino / Spark Données + métadonnées tables Iceberg
akko-spark-logs Spark master + workers Event logs Spark
akko-mlflow MLflow Artefacts du model registry
akko-rag akko-rag PDFs / DOCX / chunks uploadés
akko-aden ADEN Fichiers de dashboards persistés
akko-airflow-logs Airflow Logs de tâches

Pour ajouter un bucket, ajouter une entrée à helm/akko/charts/akko-storage/values.yaml :

storage:
  buckets:
    - name: mon-equipe
      versioning: false

Puis helm upgrade — le Job d'init est idempotent et ne crée que les buckets manquants.


Credentials

L'access key + secret S3 sont stockés dans le Secret akko-storage-creds et projetés dans chaque pod consommateur via les env vars :

AKKO_S3_ENDPOINT=http://akko-storage:8333
AKKO_S3_ACCESS_KEY=<via secret>
AKKO_S3_SECRET_KEY=<via secret>
AKKO_S3_REGION=akko-local

Référence rapide — boto3 depuis un notebook

import os, boto3
s3 = boto3.client(
    "s3",
    endpoint_url=os.environ["AKKO_S3_ENDPOINT"],
    aws_access_key_id=os.environ["AKKO_S3_ACCESS_KEY"],
    aws_secret_access_key=os.environ["AKKO_S3_SECRET_KEY"],
    region_name=os.environ.get("AKKO_S3_REGION", "akko-local"),
)
# Lister les buckets
print([b["Name"] for b in s3.list_buckets()["Buckets"]])
# Uploader un CSV
s3.upload_file("./customers.csv", "akko-iceberg", "raw/customers.csv")
# Le relire via Spark
df = spark.read.csv(
    "s3a://akko-iceberg/raw/customers.csv", header=True, inferSchema=True
)
df.show()

Référence rapide — CLI aws

export AWS_ACCESS_KEY_ID=$AKKO_S3_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=$AKKO_S3_SECRET_KEY
export AWS_DEFAULT_REGION=akko-local

aws --endpoint-url $AKKO_S3_ENDPOINT s3 ls
aws --endpoint-url $AKKO_S3_ENDPOINT s3 cp ./report.pdf \
    s3://akko-rag/uploads/report.pdf

Smoke test

Pour vérifier l'installation de bout en bout :

kubectl -n akko exec deploy/akko-akko-cockpit -- \
  curl -s http://akko-storage:8333/ | head
# Attendu : XML ListAllMyBucketsResult

kubectl -n akko logs job/akko-storage-bucket-init --tail=20
# Attendu : "[+] bucket <nom> ready" pour chaque bucket seedé

Notes opérationnelles

  • Réplication — déploiement single-node par défaut. Pour répliquer, poser storage.replication: "001" (une copie supplémentaire sur un rack différent — adapter à la topologie de votre cluster) et ajouter au moins 2 workers dans storage.workerCount.
  • Chiffrement au repos — chiffrement chart-level supporté mais désactivé par défaut. Activer storage.encryptionAtRest.enabled: true et provisionner la clé KMS selon le runbook de chiffrement.
  • Backup — l'approche recommandée est un CronJob aws s3 sync vers un endpoint S3-compatible off-site. Le log de DR drill capture la procédure de bout en bout.

Liens

  • Apache Polaris — catalogue Iceberg lisant akko-iceberg
  • Trino — moteur de fédération utilisant le catalogue Iceberg
  • Spark Connect — écrit les tables Iceberg via Polaris
  • akko-rag — uploade les PDFs vers le bucket akko-rag