如何在 Kubernetes 集群上最好地 运行 Apache Airflow 任务?

How to best run Apache Airflow tasks on a Kubernetes cluster?

我们要实现的目标:

我们想使用 Airflow 来管理我们的机器学习和数据管道,同时使用 Kubernetes 来管理资源和安排作业。我们想要实现的是让 Airflow 编排工作流(例如各种任务依赖关系。在失败时重新 运行 作业)和 Kubernetes 编排基础设施(例如集群自动缩放和将单个作业分配给节点)。换句话说,Airflow 将告诉 Kubernetes 集群做什么,而 Kubernetes 决定如何分配工作。同时我们也希望 Airflow 能够监控各个任务的状态。例如,如果我们有 10 个任务分布在一个由 5 个节点组成的集群中,Airflow 应该能够与集群通信并且报告显示如下内容:3 个“小任务”已完成,1 个“小任务”失败并将被安排到重运行,其余6个“大任务”还在运行宁

问题:

我们的理解是 Airflow 没有 Kubernetes-Operator,请参阅 https://issues.apache.org/jira/browse/AIRFLOW-1314 处的未决问题。也就是说,我们不希望 Airflow 管理服务帐户、环境变量、创建集群等资源,而是简单地将任务发送到现有的 Kubernetes 集群,并让 Airflow 知道工作何时完成。另一种方法是使用 Apache Mesos,但与 Kubernetes 相比,它看起来不够灵活且不够直接。

我想我们可以使用 Airflow 的 bash_operator 到 运行 kubectl 但这似乎不是最优雅的解决方案。

有什么想法吗?你是怎么处理的?

Airflow 有两个 Kubernetes Executor as well as a Kubernetes Operator

您可以使用 Kubernetes Operator 通过您喜欢的任何 AirflowExecutor 将任务(以 Docker 图像的形式)从 Airflow 发送到 Kubernetes。

虽然根据您的描述,我相信您正在寻找 KubernetesExecutor 来针对您的 Kubernetes 集群安排您的所有任务。从源代码中可以看出,它与 Kubernetes 的集成更加紧密。

这也让您不必担心根据 Kubernetes Operator 的要求提前创建 docker 图像。