deploying-airflow

Déployez des DAGs et des projets Airflow. À utiliser quand l'utilisateur souhaite déployer du code, pousser des DAGs, mettre en place un CI/CD, déployer en production, ou s'interroge sur les stratégies de déploiement pour Airflow.

npx skills add https://github.com/astronomer/agents --skill deploying-airflow

Déployer Airflow

Cette compétence couvre le déploiement de DAGs et de projets Airflow en production, soit en utilisant Astro (la plateforme gérée d'Astronomer), soit Airflow open-source sur Docker Compose ou Kubernetes.

Choisir un chemin : Astro convient bien aux opérations gérées et au CI/CD plus rapide. Pour l'open-source, utilisez Docker Compose pour le dev et le graphique Helm pour la production.


Astro (Astronomer)

Astro fournit des commandes CLI et une intégration GitHub pour déployer des projets Airflow.

Commandes de déploiement

Commande Ce qu'elle fait
astro deploy Déploiement complet du projet — construit l'image Docker et déploie les DAGs
astro deploy --dags Déploiement DAG uniquement — pousse seulement les fichiers DAG (rapide, sans construction d'image)
astro deploy --image Déploiement image uniquement — pousse seulement l'image Docker (pour CI/CD multi-repo)
astro deploy --dbt Déploiement du projet dbt — déploie un projet dbt pour s'exécuter aux côtés d'Airflow

Déploiement complet du projet

Construit une image Docker à partir de votre projet Astro et déploie tout (DAGs, plugins, requirements, packages) :

astro deploy

Utilisez ceci quand vous avez modifié requirements.txt, Dockerfile, packages.txt, les plugins ou tout fichier hors DAG.

Déploiement DAG uniquement

Pousse seulement les fichiers du répertoire dags/ sans reconstruire l'image Docker :

astro deploy --dags

C'est beaucoup plus rapide qu'un déploiement complet puisque cela saute la construction d'image. Utilisez ceci quand vous avez seulement modifié des fichiers DAG et n'avez pas modifié les dépendances ou la configuration.

Déploiement image uniquement

Pousse seulement l'image Docker sans mettre à jour les DAGs :

astro deploy --image

C'est utile dans les configurations multi-repo où les DAGs sont déployés séparément de l'image, ou dans les pipelines CI/CD qui gèrent les déploiements d'image et de DAG indépendamment.

Déploiement du projet dbt

Déploie un projet dbt pour s'exécuter avec Cosmos sur un déploiement Astro :

astro deploy --dbt

Intégration GitHub

Astro prend en charge le mappage branche-vers-déploiement pour les déploiements automatisés :

  • Mappez les branches à des déploiements spécifiques (p. ex., main -> production, develop -> staging)
  • Les poussées vers les branches mappées déclenchent des déploiements automatiques
  • Prend en charge les déploiements DAG uniquement à la fusion pour une itération plus rapide

Configurez ceci dans l'interface Astro sous Deployment Settings > CI/CD.

Modèles CI/CD

Stratégies CI/CD courantes sur Astro :

  1. DAG uniquement sur les branches de feature : Utilisez astro deploy --dags pour une itération rapide pendant le développement
  2. Déploiement complet sur main : Utilisez astro deploy lors de la fusion vers main pour les versions de production
  3. Pipelines d'image et de DAG séparés : Utilisez --image et --dags dans des jobs CI séparés pour des cycles de release indépendants

File d'attente de déploiement

Quand plusieurs déploiements sont déclenchés en rapide succession, Astro les traite séquentiellement dans une file d'attente de déploiement. Chaque déploiement se termine avant que le suivant ne commence.

Référence


Open-Source : Docker Compose

Déployez Airflow en utilisant la configuration Docker Compose officielle. Ceci est recommandé pour l'apprentissage et l'exploration — pour la production, utilisez Kubernetes avec le graphique Helm (voir ci-dessous).

Prérequis

  • Docker et Docker Compose v2.14.0+
  • L'image Docker officielle apache/airflow

Démarrage rapide

Téléchargez le fichier Docker Compose officiel Airflow 3 :

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

Ceci configure l'architecture complète d'Airflow 3 :

Service Objectif
airflow-apiserver API REST et interface utilisateur (port 8080)
airflow-scheduler Planifie les exécutions de DAG
airflow-dag-processor Parse et traite les fichiers DAG
airflow-worker Exécute les tâches (CeleryExecutor)
airflow-triggerer Gère les tâches deferrable/async
postgres Base de données de métadonnées
redis Courtier de messages Celery

Configuration minimale

Pour une configuration plus simple avec LocalExecutor (pas de Celery/Redis), créez un docker-compose.yaml :

x-airflow-common: &airflow-common
  image: apache/airflow:3  # Utilisez la version Airflow 3.x la plus récente
  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 admin@example.com \
          --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:

Note sur l'architecture Airflow 3 : Le webserver a été remplacé par le serveur API (airflow api-server), et le processeur DAG s'exécute maintenant en tant que processus autonome séparé du scheduler.

Opérations courantes

# Démarrer tous les services
docker compose up -d

# Arrêter tous les services
docker compose down

# Afficher les logs
docker compose logs -f airflow-scheduler

# Redémarrer après une modification des requirements
docker compose down && docker compose up -d --build

# Exécuter une commande CLI Airflow unique
docker compose exec airflow-apiserver airflow dags list

Installation de packages Python

Ajoutez les packages à requirements.txt et reconstruisez :

# Ajouter à requirements.txt, puis :
docker compose down
docker compose up -d --build

Ou utilisez un Dockerfile personnalisé :

FROM apache/airflow:3  # Épinglez à une version spécifique (p. ex., 3.1.7) pour la reproductibilité
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

Mettez à jour docker-compose.yaml pour construire à partir du Dockerfile :

x-airflow-common: &airflow-common
  build:
    context: .
    dockerfile: Dockerfile
  # ... reste de la config

Variables d'environnement

Configurez les paramètres Airflow via les variables d'environnement dans docker-compose.yaml :

environment:
  # Paramètres principaux
  AIRFLOW__CORE__EXECUTOR: LocalExecutor
  AIRFLOW__CORE__PARALLELISM: 32
  AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 16

  # E-mail
  AIRFLOW__EMAIL__EMAIL_BACKEND: airflow.utils.email.send_email_smtp
  AIRFLOW__SMTP__SMTP_HOST: smtp.example.com

  # Connexions (en tant qu'URI)
  AIRFLOW_CONN_MY_DB: postgresql://user:pass@host:5432/db

Open-Source : Kubernetes (Graphique Helm)

Déployez Airflow sur Kubernetes en utilisant le graphique Helm Apache Airflow officiel.

Prérequis

  • Un cluster Kubernetes
  • kubectl configuré
  • helm installé

Installation

# Ajouter le repo Helm Airflow
helm repo add apache-airflow https://airflow.apache.org
helm repo update

# Installer avec les valeurs par défaut
helm install airflow apache-airflow/airflow \
  --namespace airflow \
  --create-namespace

# Installer avec des valeurs personnalisées
helm install airflow apache-airflow/airflow \
  --namespace airflow \
  --create-namespace \
  -f values.yaml

Configuration clé de values.yaml

# Type d'executor
executor: KubernetesExecutor  # ou CeleryExecutor, LocalExecutor

# Image Airflow (épinglez à votre version souhaitée)
defaultAirflowRepository: apache/airflow
defaultAirflowTag: "3"  # Ou épinglez : "3.1.7"

# Git-sync pour les DAGs (recommandé pour la production)
dags:
  gitSync:
    enabled: true
    repo: https://github.com/your-org/your-dags.git
    branch: main
    subPath: dags
    wait: 60  # secondes entre les syncs

# Serveur API (remplace le webserver dans 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"

# Processeur DAG autonome
dagProcessor:
  enabled: true
  resources:
    requests:
      cpu: "250m"
      memory: "512Mi"
    limits:
      cpu: "500m"
      memory: "1Gi"

# Triggerer (pour les tâches deferrable)
triggerer:
  resources:
    requests:
      cpu: "250m"
      memory: "512Mi"
    limits:
      cpu: "500m"
      memory: "1Gi"

# Ressources des workers (CeleryExecutor uniquement)
workers:
  resources:
    requests:
      cpu: "500m"
      memory: "1Gi"
    limits:
      cpu: "2000m"
      memory: "4Gi"
  replicas: 2

# Persistance des logs
logs:
  persistence:
    enabled: true
    size: 10Gi

# PostgreSQL (intégré)
postgresql:
  enabled: true

# Ou utilisez une base de données externe
# postgresql:
#   enabled: false
# data:
#   metadataConnection:
#     user: airflow
#     pass: airflow
#     host: your-rds-host.amazonaws.com
#     port: 5432
#     db: airflow

Mise à niveau

# Mettre à niveau avec les nouvelles valeurs
helm upgrade airflow apache-airflow/airflow \
  --namespace airflow \
  -f values.yaml

# Mettre à niveau vers une nouvelle version d'Airflow
helm upgrade airflow apache-airflow/airflow \
  --namespace airflow \
  --set defaultAirflowTag="<version>"

Stratégies de déploiement de DAG sur Kubernetes

  1. Git-sync (recommandé) : Les DAGs sont synchronisés à partir d'un référentiel Git automatiquement
  2. Volume persistant : Montez un PV partagé contenant les DAGs
  3. Intégré à l'image : Incluez les DAGs dans une image Docker personnalisée

Commandes utiles

# Vérifier l'état des pods
kubectl get pods -n airflow

# Afficher les logs du scheduler
kubectl logs -f deployment/airflow-scheduler -n airflow

# Port-forward du serveur API
kubectl port-forward svc/airflow-apiserver 8080:8080 -n airflow

# Exécuter une commande CLI unique
kubectl exec -it deployment/airflow-scheduler -n airflow -- airflow dags list

Compétences associées

  • setting-up-astro-project : Pour initialiser un nouveau projet Astro
  • managing-astro-local-env : Pour le développement local avec astro dev
  • authoring-dags : Pour écrire des DAGs avant le déploiement
  • testing-dags : Pour tester les DAGs avant le déploiement

Skills similaires