Aller au contenu

Architecture & exposition

Cette page cartographie tous les composants de la plateforme, leurs flux, et surtout comment ils sont exposés : accès web filtré par IP (whitelist Traefik), instance privée en-cluster, ou service managé Scaleway accessible par identifiants.

Légende

  • 🔒 Whitelisté — accessible sur le web via une ingress Traefik protégée par l'IP-whitelist (VPN / IP ADEME autorisées).
  • 🏠 Privé — pas d'ingress, joignable uniquement depuis l'intérieur du cluster.
  • ☁️ Managé Scaleway — service managé, accès par identifiants (Vault).

Exposition réseau

Ce qui est joignable depuis l'extérieur passe obligatoirement par le middleware ip-whitelist de Traefik. OpenSearch reste totalement privé.

flowchart LR
  users(["Utilisateurs / Devs<br/>(VPN &amp; IP ADEME)"]):::ext

  subgraph edge["Traefik"]
    wl{{"Middleware ip-whitelist"}}:::wl
  end

  users --> wl

  subgraph nsp["Namespace int-fdld"]
    af["Airflow<br/>UI / API"]:::wl
    lk["Lakekeeper<br/>UI / API"]:::wl
    om["OpenMetadata<br/>UI"]:::wl
    os[("OpenSearch")]:::priv
  end

  wl --> af
  wl --> lk
  wl --> om
  om -. "in-cluster<br/>:9200" .-> os

  subgraph scw["Scaleway managé"]
    ch[("ClickHouse")]:::mgd
    s3[("S3<br/>int-fdld · int-fdld-airflow-logs")]:::mgd
  end

  users -- "ingress dédiée<br/>whitelistée" --> ch
  af -. "logs · données" .-> s3
  lk -. "warehouse Iceberg" .-> s3

  classDef wl stroke:#f59e0b,stroke-width:2px;
  classDef priv stroke:#64748b,stroke-width:2px,stroke-dasharray:5 3;
  classDef mgd stroke:#0ea5e9,stroke-width:2px;
  classDef ext stroke:#22c55e,stroke-width:1px;
Composant Hôte / accès Exposition
Airflow int-fdld-airflow.direct.horsprod.ademe-scw.fr 🔒 whitelisté
Lakekeeper int-fdld-lakekeeper.direct.horsprod.ademe-scw.fr 🔒 whitelisté
OpenMetadata int-fdld-openmetadata.direct.horsprod.ademe-scw.fr 🔒 whitelisté
ClickHouse clickhouse-fdld.horsprod.ademe-scw.fr (ingress dédiée) 🔒 whitelisté
OpenSearch <id>.<private-network>.internal:9200 🏠 privé (in-cluster)
RDB PostgreSQL *.rdb.ademe-cloud.internal:5432 🏠 privé (in-cluster)
S3 s3.fr-par.scw.cloud ☁️ managé (clés Vault)
Registry rg.fr-par.scw.cloud/namespace-scw-fdld ☁️ managé (pull secret)

Accès Terraform ClickHouse

Le run 043 (création de bases) utilise le provider clickhousedbops qui vise l'ingress ClickHouse whitelistée → le VPN doit être actif pour appliquer. Voir Créer une BDD ClickHouse.


Flux de données & exécution

De la livraison du code à l'exécution d'un produit, puis à l'alimentation du lakehouse et de l'entrepôt.

flowchart TB
  gitlab[["Repo GitLab fdld"]]:::src

  subgraph af["Airflow (int-fdld)"]
    sched["scheduler / api-server"]
    worker["Worker pod<br/>(KubernetesExecutor)"]
    prod["Pod produit<br/>(KubernetesPodOperator)"]
  end

  gitlab -- "git-sync (DAGs)" --> sched
  sched --> worker
  worker -- "lance" --> prod
  reg[["Registry Scaleway"]]:::mgd -- "pull image produit" --> prod

  subgraph ademe["Réseau interne ADEME"]
    sql[("SQL Server<br/>10.1.12.61")]:::src
    pg[("PostgreSQL<br/>10.1.12.124")]:::src
  end

  sql --> vpn{{"VPN S2S<br/>Scaleway ↔ ADEME"}}:::vpn
  pg --> vpn
  vpn -- "sources" --> prod

  prod -- "Parquet brut" --> s3d[("S3 · int-fdld")]:::mgd
  prod -- "tables Iceberg" --> lk["Lakekeeper"]:::wl
  lk -- "données + métadonnées" --> s3d
  prod -- "chargement analytique" --> ch[("ClickHouse")]:::mgd

  rdb[("RDB managé Scaleway<br/>(métadonnées)")]:::mgd -. "métadonnées" .-> sched
  rdb -. "métadonnées" .-> lk
  sched -. "logs distants" .-> s3l[("S3 · int-fdld-airflow-logs")]:::mgd

  om["OpenMetadata"]:::wl -. "crawle / lignage" .-> ch
  om -. "crawle / lignage" .-> lk
  om -. "index" .-> os[("OpenSearch")]:::priv

  classDef wl stroke:#f59e0b,stroke-width:2px;
  classDef priv stroke:#64748b,stroke-width:2px,stroke-dasharray:5 3;
  classDef mgd stroke:#0ea5e9,stroke-width:2px;
  classDef src stroke:#a855f7,stroke-width:2px;
  classDef vpn stroke:#14b8a6,stroke-width:2px;

Points clés

  • Chaque tâche Airflow tourne dans un pod worker éphémère (KubernetesExecutor), qui délègue le traitement à un pod produit (image buildée par la CI, tirée du registry Scaleway).
  • Les pods produit atteignent les bases sources dans le réseau interne ADEME (ex. SQL Server 10.1.12.61, PostgreSQL 10.1.12.124) via le VPN site-à-site Scaleway ↔ ADEME — à ne pas confondre avec le RDB managé Scaleway qui héberge les métadonnées.
  • Le pod produit lit les sources (SQL Server…), écrit du Parquet brut sur S3, puis enregistre des tables Iceberg (métadonnées Lakekeeper, données sur S3) et/ou charge ClickHouse.
  • Les métadonnées d'Airflow, Lakekeeper et OpenMetadata vivent sur le RDB managé. Les logs Airflow sont distants sur S3.
  • OpenMetadata crawle les composants pour le lignage et indexe dans OpenSearch (privé).

Secrets (transverse)

Tous les composants tirent leurs secrets de Vault via External-Secrets (pas de secret en clair dans Git).

flowchart LR
  vault[("Vault<br/>apps/fdld/*")]:::mgd -- "ClusterSecretStore" --> eso["External-Secrets"]
  eso -- "ExternalSecret" --> k8s[["Secrets Kubernetes<br/>(int-fdld)"]]
  k8s --> comp["Airflow / Lakekeeper /<br/>OpenMetadata / pull secret"]

  classDef mgd stroke:#0ea5e9,stroke-width:2px;

Voir le récapitulatif des secrets sur la vue d'ensemble.