mcpField
D
deploying-airflow

deploying-airflow

github.com/astronomer云与 DevOps457794 次安装3 周前更新
代码仓库

关于 deploying-airflow

面向 Airflow 开发和运维人员,介绍如何将 DAG 与项目部署到 Astro 或开源 Airflow 环境。内容涵盖 Astro CLI 部署方式,以及使用 Docker Compose 和 Kubernetes Helm Chart 的部署流程。

主要功能

  1. 01使用 Astro CLI 部署项目、DAG、镜像或 dbt
  2. 02配置分支到部署环境的映射
  3. 03通过 Docker Compose 搭建 Airflow
  4. 04使用 Helm Chart 在 Kubernetes 部署
  5. 05介绍 DAG 同步与镜像部署方式

适用场景

  1. 01将 Astro 项目发布到生产环境
  2. 02为不同分支设置自动部署流程
  3. 03搭建本地 Airflow 学习环境
  4. 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 策略:

  1. 功能分支仅部署 DAG:开发期间使用 astro deploy --dags 快速迭代
  2. 主分支完整部署:合并到 main 时使用 astro deploy 发布到生产环境
  3. 镜像和 DAG 流水线分开:在不同的 CI 作业中使用 --image 和 --dags,实现独立的发布周期
部署队列

短时间内触发多个部署时,Astro 会将它们放入部署队列并依次处理。每次部署完成后才会开始下一次部署。

参考

开源:Docker Compose

使用官方 Docker Compose 配置部署 Airflow。此方式适合学习和探索;生产环境请使用搭配 Helm chart 的 Kubernetes(见下文)。

先决条件
  • Docker 和 Docker Compose v2.14.0+
  • 官方 apache/airflow Docker 镜像
快速入门

下载官方 Airflow 3 Docker Compose 文件:

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml'

这会搭建完整的 Airflow 3 架构:

服务用途
airflow-apiserverREST API 和界面(端口 8080)
airflow-scheduler调度 DAG 运行
airflow-dag-processor解析和处理 DAG 文件
airflow-worker执行任务(CeleryExecutor)
airflow-triggerer处理可延迟/异步任务
postgres元数据库
redisCelery 消息代理
最简配置

如需使用 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 部署策略
  1. Git-sync(推荐):自动从 Git 仓库同步 DAG
  2. Persistent Volume:挂载包含 DAG 的共享 PV
  3. 内置于镜像:将 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

评论

支持 Markdown