如何通过部署 Airflow 的 Helm 图表中的 docker 图像自动刷新 DAG

How to automatically refresh DAGs through docker image in helm chart deployed Airflow

我在 kubernetes 集群中部署了 Airflow 运行ning。我使用官方 helm chart (described here). I manage DAGs using the recommended way, by "baking" them into a docker image (described here) 将它部署到那里。

当我创建或更改 DAG 时,我 运行 文档中列出的 docker builddocker push 命令。这一切都很好。但是,在我删除调度程序和网络服务器 pods(kubectl delete pod airflow-scheduler-xxx 等)之前,我的更改不会显示在 GUI 中,迫使 kubernetes 启动新的。这对于 CI/CD 目的来说并不理想,因为我不想一直手动执行此操作。有没有办法自动获取更改(例如通过定期拉取图像)?

我已经尝试通过 helm 值在 airflow.cfg (suggested here) 中设置 dag_dir_list_interval,但这似乎没有任何改变。 PullPolicy 设置为 Always 因为我使用了 latest 标签。在我的 override.yaml:

中看起来像这样
images:
  airflow:
    repository: -registry-name-
    tag: latest
    pullPolicy: Always

config: 
  scheduler: 
    # after how much time a new DAGs should be picked up from the filesystem
    min_file_process_interval: 0
    dag_dir_list_interval: 60

如果您经常更改 DAG,那么您应该考虑使用 gitSync。 这里发生的是

  1. 你的气流是使用你的图像部署的 custom-airflow:1.0.0 这意味着调度程序网络服务器工作人员是使用映像 1.0.0
  2. 部署的
  3. 现在您已经将映像更改为 1.0.1,您必须重新部署气流及其组件才能使用新映像。因此,如果您不重新部署气流,它仍然会在引擎盖下使用旧图像。

理想情况下,如果您将使用 gitsync,更改将在大约 2 分钟后自动反映。

我最终自己解决了这个问题。 pods 没有更新的原因(即没有使用更新的 DAG 提取新图像)是因为我使用了 latest 标签。在构建并推送新镜像后,集群不知道要拉取那个新镜像,因为标签还是一样的。解决方法是不使用latest标签,而是使用每CI/CD运行秒变化的标签。我选择在 Azure Pipelines 中使用 $(Build.SourceVersion),它对应于导致管道变为 运行 的提交的 git 哈希。然后我添加了一个 helm upgrade 命令,带有指向新图像标签的标志。此命令会导致相关 pods 自动更新。

helm upgrade --install airflow apache-airflow/airflow --set images.airflow.tag="$(Build.SourceVersion)"