Запускалась ли каждая задача (task) в Airflow в отдельном pod?

Ответ

Да, в одном из проектов мы использовали KubernetesPodOperator для запуска каждой задачи в изолированном pod Kubernetes. Это обеспечивало:

  • Изоляцию зависимостей: Каждая задача могла иметь свой Docker-образ с уникальным набором библиотек и версий Python.
  • Гибкость ресурсов: Возможность задания запросов и лимитов CPU/RAM (resources) индивидуально для тяжеловесных задач.
  • Чистое окружение: Задача выполнялась в свежем pod, что исключало побочные эффекты от предыдущих выполнений.

Пример оператора:

from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator

data_processing_task = KubernetesPodOperator(
    task_id="process_data",
    namespace="airflow",
    image="my-registry/data-pipeline:latest",
    cmds=["python", "/scripts/process.py"],
    arguments=["{{ ds }}"],
    name="process-data-pod",
    get_logs=True,
    is_delete_operator_pod=True,  # Pod удаляется после выполнения
    resources={
        'request_memory': '512Mi',
        'request_cpu': '250m'
    }
)

Для менее требовательных задач мы использовали стандартный PythonOperator, где задачи выполнялись в общих воркерах.