关于 deploying-airflow
面向 Airflow 开发和运维人员,介绍如何将 DAG 与项目部署到 Astro 或开源 Airflow 环境。内容涵盖 Astro CLI 部署方式,以及使用 Docker Compose 和 Kubernetes Helm Chart 的部署流程。
主要功能
- 01使用 Astro CLI 部署项目、DAG、镜像或 dbt
- 02配置分支到部署环境的映射
- 03通过 Docker Compose 搭建 Airflow
- 04使用 Helm Chart 在 Kubernetes 部署
- 05介绍 DAG 同步与镜像部署方式
适用场景
- 01将 Astro 项目发布到生产环境
- 02为不同分支设置自动部署流程
- 03搭建本地 Airflow 学习环境
- 04在 Kubernetes 上部署开源 Airflow
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ astronomer/ agents --skill deploying-airflow安装后在 Claude Code 中输入/deploying-airflow确认已加载。
详细介绍
部署 Airflow
本技能介绍如何将 Airflow DAG 和项目部署到生产环境,包括使用 Astro(Astronomer 的托管平台)或在 Docker Compose 或 Kubernetes 上运行开源 Airflow。
选择路径: Astro 适合托管运维和更快的 CI/CD。对于开源 Airflow,开发环境使用 Docker Compose,生产环境使用 Helm chart。
Astro(Astronomer)
Astro 提供 CLI 命令和 GitHub 集成,用于部署 Airflow 项目。
部署命令
| 命令 | 功能 |
|---|---|
astro deploy | 完整项目部署 — 构建 Docker 镜像并部署 DAG |
astro deploy --dags | 仅部署 DAG — 只推送 DAG 文件(速度快,无需构建镜像) |
astro deploy --image | 仅部署镜像 — 只推送 Docker 镜像(适用于多仓库 CI/CD) |
astro deploy --dbt | 部署 dbt 项目 — 部署 dbt 项目,使其与 Airflow 一起运行 |
完整项目部署
从 Astro 项目构建 Docker 镜像,并部署所有内容(DAG、插件、依赖项、软件包):
astro deploy
如果你修改了 requirements.txt、Dockerfile、packages.txt、插件或任何非 DAG 文件,请使用此命令。
仅部署 DAG
只推送 dags/ 目录中的文件,不重新构建 Docker 镜像:
astro deploy --dags
由于跳过了镜像构建,这比完整部署快得多。如果你只修改了 DAG 文件,且未更改依赖项或配置,请使用此命令。
仅部署镜像
只推送 Docker 镜像,不更新 DAG:
astro deploy --image
这适用于 DAG 与镜像分开部署的多仓库设置,或分别管理镜像和 DAG 部署的 CI/CD 流水线。
部署 dbt 项目
部署 dbt 项目,使其在 Astro 部署环境中通过 Cosmos 运行:
astro deploy --dbt
GitHub 集成
Astro 支持将分支映射到部署环境,以实现自动部署:
- 将分支映射到特定部署环境(例如,
main-> 生产环境,develop-> 预发布环境) - 向已映射的分支推送代码会触发自动部署
- 支持在合并时仅部署 DAG,以加快迭代
在 Astro 界面的 Deployment Settings > CI/CD 中进行配置。
CI/CD 模式
Astro 上常用的 CI/CD 策略:
- 功能分支仅部署 DAG:开发期间使用
astro deploy --dags快速迭代 - 主分支完整部署:合并到 main 时使用
astro deploy发布到生产环境 - 镜像和 DAG 流水线分开:在不同的 CI 作业中使用
--image和--dags,实现独立的发布周期
部署队列
短时间内触发多个部署时,Astro 会将它们放入部署队列并依次处理。每次部署完成后才会开始下一次部署。
参考
开源:Docker Compose
使用官方 Docker Compose 配置部署 Airflow。此方式适合学习和探索;生产环境请使用搭配 Helm chart 的 Kubernetes(见下文)。
先决条件
- Docker 和 Docker Compose v2.14.0+
- 官方
apache/airflowDocker 镜像
快速入门
下载官方 Airflow 3 Docker Compose 文件:
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml'
这会搭建完整的 Airflow 3 架构:
| 服务 | 用途 |
|---|---|
airflow-apiserver | REST API 和界面(端口 8080) |
airflow-scheduler | 调度 DAG 运行 |
airflow-dag-processor | 解析和处理 DAG 文件 |
airflow-worker | 执行任务(CeleryExecutor) |
airflow-triggerer | 处理可延迟/异步任务 |
postgres | 元数据库 |
redis | Celery 消息代理 |
最简配置
如需使用 LocalExecutor(无需 Celery/Redis)的简单配置,请创建 docker-compose.yaml:
x-airflow-common: &airflow-common
image: apache/airflow:3 # Use the latest Airflow 3.x release
environment: &airflow-common-env
AIRFLOW__CORE__EXECUTOR: LocalExecutor
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
AIRFLOW__CORE__DAGS_FOLDER: /opt/airflow/dags
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
depends_on:
postgres:
condition: service_healthy
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
volumes:
- postgres-db-volume:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "airflow"]
interval: 10s
retries: 5
start_period: 5s
airflow-init:
<<: *airflow-common
entrypoint: /bin/bash
command:
- -c
- |
airflow db migrate
airflow users create \
--username admin \
--firstname Admin \
--lastname User \
--role Admin \
--email [email protected] \
--password admin
depends_on:
postgres:
condition: service_healthy
airflow-apiserver:
<<: *airflow-common
command: airflow api-server
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
airflow-scheduler:
<<: *airflow-common
command: airflow scheduler
airflow-dag-processor:
<<: *airflow-common
command: airflow dag-processor
airflow-triggerer:
<<: *airflow-common
command: airflow triggerer
volumes:
postgres-db-volume:
Airflow 3 架构说明:Web 服务器已由 API 服务器(
airflow api-server)取代,DAG 处理器现在作为独立进程运行,与调度器分离。
常见操作
# Start all services
docker compose up -d
# Stop all services
docker compose down
# View logs
docker compose logs -f airflow-scheduler
# Restart after requirements change
docker compose down && docker compose up -d --build
# Run a one-off Airflow CLI command
docker compose exec airflow-apiserver airflow dags list
安装 Python 包
将软件包添加到 requirements.txt 并重新构建:
# Add to requirements.txt, then:
docker compose down
docker compose up -d --build
或者使用自定义 Dockerfile:
FROM apache/airflow:3 # Pin to a specific version (e.g., 3.1.7) for reproducibility
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
更新 docker-compose.yaml,以便从 Dockerfile 构建:
x-airflow-common: &airflow-common
build:
context: .
dockerfile: Dockerfile
# ... rest of config
环境变量
通过 docker-compose.yaml 中的环境变量配置 Airflow 设置:
environment:
# Core settings
AIRFLOW__CORE__EXECUTOR: LocalExecutor
AIRFLOW__CORE__PARALLELISM: 32
AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 16
# Email
AIRFLOW__EMAIL__EMAIL_BACKEND: airflow.utils.email.send_email_smtp
AIRFLOW__SMTP__SMTP_HOST: smtp.example.com
# Connections (as URI)
AIRFLOW_CONN_MY_DB: postgresql://user:pass@host:5432/db
开源:Kubernetes(Helm Chart)
使用官方 Apache Airflow Helm chart 在 Kubernetes 上部署 Airflow。
前提条件
- Kubernetes 集群
- 已配置
kubectl - 已安装
helm
安装
# Add the Airflow Helm repo
helm repo add apache-airflow https://airflow.apache.org
helm repo update
# Install with default values
helm install airflow apache-airflow/airflow \
--namespace airflow \
--create-namespace
# Install with custom values
helm install airflow apache-airflow/airflow \
--namespace airflow \
--create-namespace \
-f values.yaml
values.yaml 关键配置
# Executor type
executor: KubernetesExecutor # or CeleryExecutor, LocalExecutor
# Airflow image (pin to your desired version)
defaultAirflowRepository: apache/airflow
defaultAirflowTag: "3" # Or pin: "3.1.7"
# Git-sync for DAGs (recommended for production)
dags:
gitSync:
enabled: true
repo: https://github.com/your-org/your-dags.git
branch: main
subPath: dags
wait: 60 # seconds between syncs
# API server (replaces webserver in Airflow 3)
apiServer:
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
replicas: 1
# Scheduler
scheduler:
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "1000m"
memory: "2Gi"
# Standalone DAG processor
dagProcessor:
enabled: true
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
# Triggerer (for deferrable tasks)
triggerer:
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
# Worker resources (CeleryExecutor only)
workers:
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
replicas: 2
# Log persistence
logs:
persistence:
enabled: true
size: 10Gi
# PostgreSQL (built-in)
postgresql:
enabled: true
# Or use an external database
# postgresql:
# enabled: false
# data:
# metadataConnection:
# user: airflow
# pass: airflow
# host: your-rds-host.amazonaws.com
# port: 5432
# db: airflow
升级
# Upgrade with new values
helm upgrade airflow apache-airflow/airflow \
--namespace airflow \
-f values.yaml
# Upgrade to a new Airflow version
helm upgrade airflow apache-airflow/airflow \
--namespace airflow \
--set defaultAirflowTag="<version>"
Kubernetes 上的 DAG 部署策略
- Git-sync(推荐):自动从 Git 仓库同步 DAG
- Persistent Volume:挂载包含 DAG 的共享 PV
- 内置于镜像:将 DAG 包含在自定义 Docker 镜像中
实用命令
# Check pod status
kubectl get pods -n airflow
# View scheduler logs
kubectl logs -f deployment/airflow-scheduler -n airflow
# Port-forward the API server
kubectl port-forward svc/airflow-apiserver 8080:8080 -n airflow
# Run a one-off CLI command
kubectl exec -it deployment/airflow-scheduler -n airflow -- airflow dags list
相关技能
- setting-up-astro-project:用于初始化新的 Astro 项目
- managing-astro-local-env:用于使用
astro dev进行本地开发 - authoring-dags:用于在部署前编写 DAG
- testing-dags:用于在部署前测试 DAG