如何通过部署 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 build
和 docker 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。
这里发生的是
- 你的气流是使用你的图像部署的 custom-airflow:1.0.0
这意味着调度程序网络服务器工作人员是使用映像 1.0.0
部署的
- 现在您已经将映像更改为 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)"
我在 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 build
和 docker 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。 这里发生的是
- 你的气流是使用你的图像部署的 custom-airflow:1.0.0 这意味着调度程序网络服务器工作人员是使用映像 1.0.0 部署的
- 现在您已经将映像更改为 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)"