ILUM Airflow: workflow orchestration for Spark on Kubernetes (Livy, dbt)
9.2K
Production-ready Apache Airflow images integrated with the Ilum Spark on Kubernetes ecosystem.
The ilum/airflow image series extends the official Apache Airflow image with:
linux/amd64 and linux/arm64-plain) through full Spark (-spark) to dbt/Cosmos (-dbt)All images are pushed to a single repository
ilum/airflow. Variants are distinguished by tags (e.g.,1.0.0,1.0.0-plain,1.0.0-spark,1.0.0-dbt).
# Run standalone (default variant)
docker run -d \
--name ilum-airflow \
-p 8080:8080 \
ilum/airflow:<version> standalone
# Access UI: http://localhost:8080
# Login: admin / password generated in logs
For Kubernetes environments, use the official Airflow Helm Chart with image.repository: ilum/airflow and the appropriate tag.
<version>: Full provider set (Livy, K8s, S3) + example DAG<version>-plain: Slim — Livy provider only, minimal size<version>-spark: Spark 3.5.7 + PySpark + Java 17, example DAGs<version>-dbt: Like -spark + dbt-core 1.9, dbt-spark, astronomer-cosmosTIP:
Choosing a variant:
plain — microservices, minimal resource footprintspark — native PySpark jobs, Spark Connectdbt — extends spark variant; adds dbt orchestration via Cosmos and Spark Thrift Server support| Variable | Description |
|---|---|
| AIRFLOW__DATABASE__SQL_ALCHEMY_CONN | Database URI |
| AIRFLOW__CORE__FERNET_KEY | Encryption key |
The ilum_default_connections plugin auto-provisions connections at startup if they don't exist. You can override them:
| Variable | Default Value | Description |
|---|---|---|
| AIRFLOW_CONN_ILUM_LIVY_PROXY | livy://ilum-core:9888 | Livy gateway URI |
| AIRFLOW_CONN_ILUM_SPARK_THRIFT | spark://ilum-sql-thrift-binary:10009/default | Spark Thrift Server |
| AIRFLOW_CONN_ILUM_MINIO | JSON object | MinIO S3-compatible |
Variables can also be defined with hyphens, e.g. AIRFLOW_CONN_ILUM-LIVY-PROXY.
| Container Path | Purpose |
|---|---|
/opt/airflow/dags | DAGs — mount your own definitions |
/opt/airflow/logs | Task logs — required for production |
/opt/airflow/plugins | Additional Airflow plugins |
# docker-compose example
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
| Port | Service |
|---|---|
8080 | Airflow Webserver UI |
# Override example for helm_aio / helm_airflow
extraEnv:
- name: AIRFLOW_CONN_ILUM_LIVY_PROXY
value: "livy://ilum-core.ilum.svc.cluster.local:9888"
The image runs as user airflow (UID 50000). When mounting host volumes, ensure directories have appropriate permissions:
# On host
sudo chown -R 50000:0 ./dags ./logs ./plugins
CAUTION: Never pass passwords directly in environment variables!
Recommended methods:
_FILE pattern — e.g., AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_FILE=/run/secrets/db_connBefore production deployment, scan the image:
# Trivy
trivy image ilum/airflow:<version>-spark
# Grype
grype ilum/airflow:<version>-dbt
The IlumDefaultConnectionsPlugin creates at startup:
| Connection ID | Type | Default Host |
|---|---|---|
ilum-livy-proxy | Livy | ilum-core:9888 |
spark_thrift_default | Spark SQL | ilum-sql-thrift-binary:10009 |
ilum-minio | AWS (S3) | ilum-minio:9000 |
spark_connect_template | Spark SQL | Template — requires configuration |
TIP:
Connections are auto-configured for the ilum namespace. For other namespaces, edit the host in the UI or override via environment variable.
Run all commands from the docker/ilum-airflow directory:
# Default
docker buildx build --platform linux/amd64,linux/arm64 \
-t ilum/airflow:<version> . --push
# Plain (slim)
docker buildx build --platform linux/amd64,linux/arm64 \
-t ilum/airflow:<version>-plain -f Dockerfile-plain . --push
# Spark
docker buildx build --platform linux/amd64,linux/arm64 \
-t ilum/airflow:<version>-spark -f Dockerfile-spark . --push
# dbt (Cosmos)
docker buildx build --platform linux/amd64,linux/arm64 \
-t ilum/airflow:<version>-dbt -f Dockerfile-dbt . --push
dive ilum/airflow:<version>-spark
Check for:
# Syft
syft ilum/airflow:<version>-dbt -o spdx-json > sbom.json
amazon, apache-livy, cncf-kubernetes, fabflask-oidc, flask-openid (for SSO)ilum-example.pyapache-livy, fabEverything from default + :
/opt/spark)sql, connect modulesilum_default_connections.pycreate_random_data.py, read_random_data.pyEverything from -spark + :
ilum_dbt_projectilum_dbt_thrift.pyContent type
Image
Digest
sha256:9e60821b7…
Size
1.7 GB
Last updated
23 days ago
docker pull ilum/airflow:3.2.2-spark4