Skip to content

Architecture

AetherLake is a decoupled, microservices-oriented data lakehouse running entirely on Kubernetes. It is split into two Helm charts:

  • security-stack — Keycloak (OIDC/SSO) + its PostgreSQL.
  • core-data-stack — MinIO, Trino, Apache Polaris, Apache Spark, Apache Airflow, Apache Superset, Apache Kafka (Strimzi), Apache Flink (operator), the oauth2-proxy SSO gate, Milvus, and the shared PostgreSQL/Redis.

System overview

Layers

LayerComponent(s)Responsibility
IdentityKeycloak + oauth2-proxySingle sign-on, OIDC clients, realm roles; SSO gate for UIs without native OIDC
StorageMinIOS3-compatible object storage (Iceberg data, vectors, raw files)
CatalogApache PolarisIceberg REST catalog + S3 credential vending
QueryTrinoFederated SQL over the Iceberg catalog, Kafka topics, and other sources
StreamingApache Kafka (Strimzi)Durable event streaming, in-cluster + authenticated external access
Stream processingApache FlinkSQL jobs that read/write Kafka topics (per-job mini-clusters)
ProcessingApache SparkDistributed batch processing
OrchestrationApache AirflowDAG-based pipeline scheduling
Analytics / BIApache SupersetDashboards and SQL exploration over Trino
Vector searchMilvusSimilarity search for AI/ML workloads
ControlControl Panel, MCP ServerManagement UI + agent tooling

SSO / OIDC flow

Every service authenticates against the single aetherlake Keycloak realm. The token issuer is http://keycloak.aetherlake.local/realms/aetherlake.

In-cluster DNS

keycloak.aetherlake.local is an ingress host and does not resolve via cluster DNS by default, so server-side OIDC discovery (MinIO, Superset, Airflow, Polaris, oauth2-proxy) would fail. install.sh adds a CoreDNS rewrite mapping that hostname to the Keycloak Service, keeping in-cluster discovery and browser redirects consistent. See Keycloak / SSO.

UIs without native OIDC: the oauth2-proxy gate

Some UIs have no Keycloak integration of their own — the Trino web UI and Milvus Attu. They are protected by an oauth2-proxy deployment sitting behind nginx external-auth annotations:

One login covers every gated host: the session cookie is scoped to .aetherlake.local. Trino runs the web UI with a fixed service user (web-ui.authentication.type=fixed), since humans already passed the Keycloak gate. The in-cluster Trino service (used by the Control Panel and MCP server) is unaffected by the gate. See Keycloak — SSO gate.

External producers/consumers connect through the external listener (nodeport, TLS + SCRAM-SHA-512, KafkaUser credentials) — see Kafka — Producing from outside the cluster.

See Data Pipelines — Kafka-to-Iceberg Bridge.

Lakehouse write path (Trino → Polaris → MinIO)

This credential vending (subscoping) path gives each query short-lived, table-scoped S3 credentials instead of long-lived root keys. See Apache Polaris.

Next

Released under the Business Source License 1.1.