pod_突变_挂钩功能不适用于使用KuberneteSecutor在kubernetes中运行的气流

pod_突变_挂钩功能不适用于使用KuberneteSecutor在kubernetes中运行的气流,kubernetes,airflow,minikube,kubernetesexecutor,Kubernetes,Airflow,Minikube,Kubernetesexecutor,我正在尝试将kubernetes中运行的气流部署从CeleryExecutor迁移到KuberneteSecutor。在我的本地开发环境中(在minikube上运行),一切都进行得很顺利,但是我需要在生产环境中加载一个sidecar容器来运行一个代理,该代理允许我连接到我的sql数据库。通过谷歌搜索,在$PYTHONPATH上的aiffort\u local\u settings.py文件中定义该函数似乎就是实现这一点的方法 首先,我尝试在每个示例的配置映射中定义它。e、 g apiVersio

我正在尝试将kubernetes中运行的气流部署从
CeleryExecutor
迁移到
KuberneteSecutor
。在我的本地开发环境中(在minikube上运行),一切都进行得很顺利,但是我需要在生产环境中加载一个sidecar容器来运行一个代理,该代理允许我连接到我的sql数据库。通过谷歌搜索,在
$PYTHONPATH
上的
aiffort\u local\u settings.py
文件中定义该函数似乎就是实现这一点的方法

首先,我尝试在每个示例的配置映射中定义它。e、 g

apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-config
  namespace: dev
data:
  ...

  AIRFLOW__KUBERNETES__LOGS_VOLUME_CLAIM: "airflow-logs"

  AIRFLOW__KUBERNETES__AIRFLOW_LOCAL_SETTINGS_CONFIGMAP: "airflow-config"
  ...

  airflow_local_settings.py: |
    from airflow.contrib.kubernetes.pod import Pod

    def pod_mutation_hook(pod: Pod):
        extra_labels = {
            "test-label": "True",
        }
        pod.labels.update(extra_labels)
我在
afflow.cfg
文件中指定了这个configmap,它被很好地拾取和装载,所有其他环境变量工作正常,但是
pod\u mutation\u hook
似乎没有运行,因为kubernetes执行器启动的结果pod中没有添加任何标签(请注意,此处还指定了logs volume声明,并且该声明正常工作)

接下来,我尝试在图像中定义
airflow\u local\u settings.py
文件,airflow将在
$airflow\u HOME/configs/airflow\u local\u settings.py
下为作业启动。我还从上面的
airflow config
配置映射中删除了相关部分。这似乎对n为作业创建的结果pod,因为它也缺少指定的标签


因此,我现在不确定如何继续,因为我不知道如何指定
气流\u local\u settings.py
文件和
pod\u mutation\u hook
函数,以便它们在运行前实际对pod进行变异。如果您能提供任何帮助,我将不胜感激。谢谢。

我也遇到同样的问题,请确保不要hat
气流\u本地\u设置可以从计划程序导入。您必须将这些更改烘焙到图像中

WORKDIR ${AIRFLOW_USER_HOME}
ENV PYTHONPATH  $PYTHONPATH:$AIRFLOW_HOME/config/
COPY airflow_local_settings.py $AIRFLOW_HOME/config/airflow_local_settings.py
使用上面突出显示的configmap将使它们进入executors,但此时不需要,所以这是一种无用的设置。请随意阅读源代码:


您是否在afflow.cfg字段中设置“气流\u本地\u设置\u配置图=气流配置图”?

摘要

如果您希望KuberneteSecutor或KubernetesPodOperator(具有不同的执行器)启动的所有吊舱上的侧车都是由调度器启动的,那么至少应该将您的
aiffort\u local\u settings.py
文件放在调度器的
PYTHONPATH

但是,如果您在使用
KuberneteSecutor
时还希望在
KubernetesPodOperator
启动的吊舱上安装侧车,则需要在
airflow.cfg
中设置
airflow\u local\u settings\u configmap
(如在使用KubernetesPodOperator和KuberneteSecutor时一样),任务吊舱(使用KubernetesPodOperator)将由工作吊舱发射

请注意,我们还将相同的configmap传递给Scheduler deployment()和
airflow.cfg
本身,因为我们希望所有的pod都通过pod\u mutation\u钩子进行变异

详细信息

“airflow.cfg”和“airflow_local_settings.py”文件需要存在于计划程序中(您的计划程序是否在VM或POD上与此无关)。我们还添加了有关在何处输出此文件的文档:

无论何时使用
kubernetesecutor
KubernetePodOperator
,现在都会使用
pod\u变异挂钩。由kubernetesecutor或KubernetePodOperator启动的吊舱将使用此变异挂钩

现在,回到configmap。当您使用
KuberneteSecutor
并且有一个使用KubernetOperator的任务时,您需要
airflow.cfg
airflow\u local\u settings.py
文件存在于KuberneteSecutor启动的worker Pod上

KuberneteSecutor为此任务启动一个工作区

调度器吊舱-->工作吊舱(吊舱1--由Kubernetesexecutor启动)-->(吊舱2--由 Pod_1使用KubernetePOD运算符的任务)

现在,airflow.cfg()中的整个[kubernetes]部分仅用于KuberneteSecutor,并影响安装在KuberneteSecutor启动的工作吊舱上的内容

如果不指定
aiffort\u local\u settings
configmap,aiffort\u local\u settings文件将不会装载到worker pod(上例中的pod\u 1),并且只装载aiffort.cfg文件。因此,现在对于pod\u 2(由pod\u 1启动)--(将Kubernetespoderator与Kubernetesecutor一起使用时的特殊情况),因为pod\u 1(worker POD)没有
airflow\u local\u settings.py
文件,即使调度程序有该文件,POD\u 2也不会发生变化,因为该文件在那里不存在

考虑它与airflow.cfg相同——为什么要将
airflow.cfg
文件同时装载到调度程序盒和工作程序盒。类似地,对于这种边缘情况,您需要在两个位置都安装
airflow\u local\u settings.py
文件

-->此代码用于确定安装在工作机机架上的内容(REF\u 1

-->为KuberneteSecutor运行的每个任务创建的Pod(REF\u 2)--此Pod由调度程序启动,并且具有
aiffort\u local\u settings.py
文件,因此将对其应用变异


-->此代码用于在使用KubernetesPod运算符(参考3)时创建新POD--由于
气流\u本地\u设置.py
未安装在REF\u 2中生成的POD上,因此突变未应用于此POD。

链接状态
可以使用此功能,例如,向KuberneteSecutor或KubernetesPodOperator启动的每个工作POD添加侧车或初始容器。
尽管我只是能够让它与Kubernete创建的豆荚一起工作