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 & 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, PostgreSQL10.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.