我正在尝试将在kubernetes中运行的气流部署从CeleryExecutor
迁移到KubernetesExecutor
。在本地开发环境中运行一切正常(在minikube上运行),但是我需要在生产环境中加载sidecar容器以运行允许我连接到sql数据库的代理。经过一番谷歌搜索之后,看来应该在airflow_local_settings.py
上某个地方的$PYTHONPATH
文件中定义pod_mutation_hook函数。
首先,我尝试按照每个this示例在配置映射中定义它。例如
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)
我在airflow.cfg
文件中指定了此配置映射,并对其进行了拾取和安装,所有其他env变量均正常运行,但是pod_mutation_hook
似乎未运行,因为未添加任何标签由kubernetes执行器启动的结果pod(请注意,这里也指定了日志卷声明,并且可以正常工作)。
接下来,我尝试根据注释here中的建议,在airflow_local_settings.py
下为作业启动气流的图像中定义$AIRFLOW_HOME/configs/airflow_local_settings.py
文件。我还从上面的airflow-config
配置图中删除了相关部分。由于它也缺少指定的标签,因此似乎对为该作业创建的结果窗格没有影响。
因此,我不确定如何进行此操作,因为我不知道如何指定airflow_local_settings.py
文件和pod_mutation_hook
函数,以便它们实际上在之前更改了pod的位置运行。任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
我遇到了同样的问题,请确保可以从调度程序中导入airflow_local_settings
。您必须将这些更改烘焙到图像中。
WORKDIR ${AIRFLOW_USER_HOME}
ENV PYTHONPATH $PYTHONPATH:$AIRFLOW_HOME/config/
COPY airflow_local_settings.py $AIRFLOW_HOME/config/airflow_local_settings.py
使用上面突出显示的configmap会将它们带入执行程序,但此时不需要,因此也是一种无用的设置。随时阅读源代码:
https://github.com/apache/airflow/blob/8465d66f05baeb73dd4479b019515c069444616e/airflow/settings.py
答案 1 :(得分:0)
您是否在airflow.cfg字段中设置了“ airflow_local_settings_configmap = airflow-configmap”?
答案 2 :(得分:0)
摘要:
如果要让KubernetesExecutor或KubernetesPodOperator(具有不同的Executor)启动的所有Pod上的边车作为两者的POD,则至少应将airflow_local_settings.py
文件放置在Scheduler的PYTHONPATH
上它们是由调度程序启动的。
但是,如果您还想在使用KubernetesPodOperator
时在KubernetesExecutor
发射的POD上使用小车,则需要在airflow_local_settings_configmap
中设置airflow.cfg
(就像在{{3 }}),当您将KubernetePodOperator与KubernetesExecutor一起使用时,任务窗格(与KubernetesPodOperator一起)将由工作人员POD启动。
请注意,我们如何也将相同的配置映射传递给Scheduler部署(https://github.com/astronomer/airflow-chart/blob/f3dddeffe43c92d594cfcfe9c5b001680f45a986/templates/configmap.yaml#L72)以及自身传递给airflow.cfg
,因为我们希望所有POD都通过pod_mutation_hook进行变异。
详细信息:
计划程序中必须存在“ airflow.cfg”和“ airflow_local_settings.py”文件(此处的计划程序是否在VM上或POD与之无关)。我们还添加了有关将该文件存放到何处的文档:https://github.com/astronomer/airflow-chart/blob/f3dddeffe43c92d594cfcfe9c5b001680f45a986/templates/scheduler/scheduler-deployment.yaml#L125-L135
无论何时使用pod_mutation_hook
或KubernetesExecutor
,都将使用KubernetePodOperator
。 KubernetesExecutor或KubernetePodOperator启动的POD将使用此突变挂钩。
现在,返回到configmap。当您使用KubernetesExecutor
并有一个使用KuberneretPodOperator的任务时,您需要airflow.cfg
和airflow_local_settings.py
文件都必须存在于KubernetesExecutor启动的工作容器上。
KubernetesExecutor为此任务启动了一个工作区。
Scheduler Pod ---> Worker Pod(Pod_1-由KubernetesExecuetor推出)->(Pod_2-由 使用KubernetePodOperator Pod_1任务)
现在airflow.cfg(https://airflow.apache.org/docs/stable/concepts.html#where-to-put-airflow-local-settings-py)中的整个 [kubernetes] 部分仅用于KubernetesExecutor,并且会影响启动的 Worker Pods 上安装的内容通过KubernetesExecutor。
如果您未指定airflow_local_settings
configmap,则airflow_local_settings文件将不会安装到工作容器(在上例中为Pod_1),而只会安装airflow.cfg文件。因此,现在对于Pod_2(由Pod_1启动)-(在将KubernetesPodOperator与KubernetesExecutor结合使用时的特殊情况),由于Pod_1(工作台POD)没有airflow_local_settings.py
文件,即使调度程序具有它,Pod_2也不会由于该文件不存在而被更改。
请考虑将其与airflow.cfg相同-为什么将airflow.cfg
文件同时挂载到Scheduler POD和辅助POD。同样,在这种情况下,两个地方都需要airflow_local_settings.py
文件。
https://github.com/apache/airflow/blob/master/airflow/config_templates/default_airflow.cfg#L870-L1028->此代码用于确定安装在Worker Pod( REF_1 )上的内容
https://github.com/apache/airflow/blob/ba2d6408e64f219e8f53a20a5a149e3d8109db31/airflow/kubernetes/worker_configuration.py#L279-L305->为KubernetesExecutor( REF_2 )运行的每个任务创建的Pod-当调度程序启动该POD且该变量具有{{ 1}}文件
https://github.com/apache/airflow/blob/ba2d6408e64f219e8f53a20a5a149e3d8109db31/airflow/executors/kubernetes_executor.py#L462-L481->使用KubernetesPod运算符(REF_3)时,此代码用于创建新的POD-由于未将airflow_local_settings.py
装载在 REF_2 突变未应用于此POD。