通过 Airflow 创建的 Kubernetes pod 保持运行状态

Posted

技术标签:

【中文标题】通过 Airflow 创建的 Kubernetes pod 保持运行状态【英文标题】:Kubernetes pod created through Airflow remains in running state 【发布时间】:2019-06-20 15:44:17 【问题描述】:

我在 Kubernetes 集群中设置了 Airflow。为了运行任务,我使用KubernetesPodOperator

当我运行一个任务并查看kubectl get pods 时,我看到一个 pod 已正确创建并且它也完成了。但是,当我查看 Airflow 时,我看到状态没有更新,它说它仍处于运行状态。

[2019-01-27 12:43:56,580] models.py:1595 INFO - Executing <Task(KubernetesPodOperator): xxx> on 2019-01-20T00:00:00+00:00
[2019-01-27 12:43:56,581] base_task_runner.py:118 INFO - Running: ['bash', '-c', 'airflow run xxx xxx 2019-01-20T00:00:00+00:00 --job_id 15 --raw -sd DAGS_FOLDER/xxx.py --cfg_path /tmp/tmpxx39wldz']
[2019-01-27 12:45:21,603] models.py:1355 INFO - Dependencies not met for <TaskInstance: xxx.xxx 2019-01-20T00:00:00+00:00 [running]>, dependency 'Task Instance Not Already Running' FAILED: Task is already running, it started on 2019-01-27 12:43:56.565328+00:00.
[2019-01-27 12:45:21,639] models.py:1355 INFO - Dependencies not met for <TaskInstance: xxx.xxx 2019-01-20T00:00:00+00:00 [running]>, dependency 'Task Instance State' FAILED: Task is in the 'running' state which is not a valid state for execution. The task must be cleared in order to be run.
[2019-01-27 12:45:21,641] logging_mixin.py:95 INFO - [2019-01-27 12:45:21,641] jobs.py:2614 INFO - Task is not able to be run

我应该做些什么来将 pod 的状态返回给 Airflow? KubernetesPodOperator 定义如下:

do_something = KubernetesPodOperator(
    task_id='xxx',
    image='gcr.io/project/image',
    namespace='default',
    name='xxx',
    arguments=['dummy'],
    xcom_push=True,
    in_cluster=True,
    image_pull_policy='Always',
    trigger_rule='dummy',
    dag=dag,
)

编辑:基础容器似乎已完成,但airflow-xcom-sidecar 仍在运行。我应该做些什么来阻止那个?

【问题讨论】:

您发现问题所在了吗?我遇到了同样的问题,我找不到边车为什么继续运行的根本原因。 /airflow/xcom/return.json 已正确创建,基础容器已完成。 我想我最终改变了部分设置。那么,就您而言,一切都成功了吗,但它没有出现在 Airflow XCom 中? 我的问题似乎与您的问题完全相同。基础容器成功终止(pod 标记为completed),但边车容器继续运行。如果我 ssh 进入 sidecar 容器,我可以看到 return.json 文件已由基本容器创建,这意味着问题不在于 sidecar 一直在寻找它或其他什么。我在 Airflow (...dependency 'Task Instance State' FAILED...) 上有同样的错误消息。 完全相同的设置有时会起作用,似乎它可能是由非常长的任务引起的。事实是,在 k8s 上运行的 Airflow 不稳定,我一直遇到问题。 【参考方案1】:

如果不查看您的设置,很难准确判断,但看起来 pod 已完成,它正在尝试将 xcom 推送到您的主 Airflow 并且无法连接。我会检查airflow-xcom-sidecar 的日志。比如:

$ kubectl logs <airflow-job-pod> -c airflow-xcom-sidecar

您也可以尝试使用xcom_push=False 运行您的KubernetesOperator

do_something = KubernetesPodOperator(
    task_id='xxx',
    image='gcr.io/project/image',
    namespace='default',
    name='xxx',
    arguments=['dummy'],
    xcom_push=False,
    in_cluster=True,
    image_pull_policy='Always',
    trigger_rule='dummy',
    dag=dag,
)

【讨论】:

奇怪的是,这些日志没有显示任何内容。我目前正在研究一种解决方案,我正在禁用xcom_push,但还不能更新你。不管怎样,我认为xcom_push 不应该阻止解决方案发挥作用。

以上是关于通过 Airflow 创建的 Kubernetes pod 保持运行状态的主要内容,如果未能解决你的问题,请参考以下文章

对于 Apache Airflow,如何通过 CLI 手动触发 DAG 时传递参数?

Airflow BigQuery Hook - 通过 run_query 运行更新查询

春云数据流和气流

原创大数据基础之Ambari通过Ambari部署Airflow

1.airflow的安装

错误:(bq)无法创建私有文件 [/home/airflow/.config/gcloud/credentials.db]