Skip to content

Airflow on EKS Deep Dive

Overview

Apache Airflow is the de facto standard orchestrator for data pipelines — ETL/ELT jobs, ML training pipelines, and cross-system batch workflows — defined as directed acyclic graphs (DAGs) of tasks. On EKS, Airflow is commonly deployed through the official apache/airflow Helm chart, which lets individual tasks scale out as Kubernetes pods rather than compete for capacity on a fixed worker fleet. Airflow 2 reached end-of-life in April 2026, so any new deployment should target Airflow 3.x, which restructured the platform into independently scalable services and replaced several 2.x patterns (hybrid executors, git-sync-based DAG delivery) with Kubernetes-native equivalents.

Supported Versions: Apache Airflow 3.2+, Kubernetes 1.30+ Last Updated: July 15, 2026

Core Architecture Concepts

Airflow 2 ran a single webserver process for the UI/API and a scheduler process that both scheduled tasks and parsed DAG files — under load, expensive DAG parsing could starve the scheduler's actual scheduling loop. Airflow 3 fixes this by splitting the control plane into four independently scalable services, each with one job: the api-server (a FastAPI-based service serving the UI, REST API v2, and auth), the scheduler (evaluates dependencies and queues task instances — nothing else), the dag-processor (a now-mandatory service whose sole job is parsing DAG files and writing the result to the metadata database's serialized_dag table), and the triggerer (runs deferrable operators that wait on external events). PostgreSQL is always required as the metadata database; Redis is only required if a CeleryExecutor worker pool is in use.

Diagram showing the Airflow dag-processor, scheduler, api-server, and triggerer all reading and writing a shared PostgreSQL metadata database, with the scheduler additionally queuing tasks to an optional Redis broker for Celery workers or creating pods directly for the Kubernetes executor.

Deep Dive Table of Contents

1. Airflow Architecture on Kubernetes

  • Airflow 3's four-service split: api-server, scheduler, dag-processor, triggerer
  • Why DAG parsing moved out of the scheduler into the mandatory dag-processor
  • Backing services: PostgreSQL (always) and Redis (CeleryExecutor only)
  • Executor landscape overview and the removal of hybrid executors in 3.0

2. Helm Deployment and Executor Choice

  • The official apache/airflow Helm chart vs. the unrelated community airflow-helm/charts
  • Installing the chart and the top-level executor setting
  • KubernetesExecutor vs. CeleryExecutor trade-offs in depth
  • KEDA-based autoscaling (including scale-to-zero) for Celery workers

3. DAG Patterns and KubernetesPodOperator

  • KubernetesPodOperator and its pod spec precedence (pod_template_file, full_pod_spec, constructor args)
  • Pinning task pods to dedicated node pools and assigning IRSA per task
  • DAG bundles (GitDagBundle, S3DagBundle) replacing git-sync
  • Launching Spark and dbt jobs from a DAG via KubernetesPodOperator

4. Amazon MWAA Integration

  • What "managed" means for MWAA vs. a self-managed control plane on EKS
  • Amazon MWAA vs. self-managed Airflow on EKS: version currency, cost, customization trade-offs
  • Driving an EKS cluster from MWAA via KubernetesPodOperator with in_cluster=False
  • A decision guide for choosing between MWAA and self-managed Airflow

5. Operations and Security

  • Scheduler HA, now safe at scale thanks to the decoupled dag-processor
  • Database migration/upgrade practices and secrets backend configuration
  • Remote logging and monitoring with Prometheus/Grafana
  • A security checklist and a full go-live checklist for the series

References

Quiz

To test what you've learned in this section, try the Airflow Architecture Quiz.