Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 气流-动态更改KubernetesPodOperator中的命名空间_Templates_Macros_Airflow_Apache Airflow Xcom - Fatal编程技术网

Templates 气流-动态更改KubernetesPodOperator中的命名空间

Templates 气流-动态更改KubernetesPodOperator中的命名空间,templates,macros,airflow,apache-airflow-xcom,Templates,Macros,Airflow,Apache Airflow Xcom,我正在kubernetes上运行airflow 1.10.13,并试图找到一种方法来动态更改运行任务的命名空间。 我尝试使用模板并从dag_run.conf json插入参数,但该模板仅在“cmds”中呈现,而不在其他任务字段(如命名空间)中呈现 default_args = { 'owner': 'airflow', 'start_date': days_ago(1) } with DAG('test_ns', default_args=default_args, sched

我正在kubernetes上运行airflow 1.10.13,并试图找到一种方法来动态更改运行任务的命名空间。 我尝试使用模板并从dag_run.conf json插入参数,但该模板仅在“cmds”中呈现,而不在其他任务字段(如命名空间)中呈现

default_args = {
    'owner': 'airflow',
    'start_date': days_ago(1)
}

with DAG('test_ns', default_args=default_args, schedule_interval='@once') as dag:
    ns = """ {{ dag_run.conf.ns }} """
    example_task= KubernetesPodOperator(namespace=ns,
                                         image='python:3.6',
                                         cmds=["/bin/sh", "-c", "echo {{ns}}"],
                                         arguments=[],
                                         task_id='example_task',
                                         name='example_task',
                                         get_logs=True,
                                         is_delete_operator_pod=True,
                                         provide_context=True
                                         )
我希望找到一个解决方案(使用模板或任何其他方式)来改变名称空间

default_args = {
    'owner': 'airflow',
    'start_date': days_ago(1)
}

with DAG('test_ns', default_args=default_args, schedule_interval='@once') as dag:
    ns = """ {{ dag_run.conf.ns }} """
    example_task= KubernetesPodOperator(namespace=ns,
                                         image='python:3.6',
                                         cmds=["/bin/sh", "-c", "echo {{ns}}"],
                                         arguments=[],
                                         task_id='example_task',
                                         name='example_task',
                                         get_logs=True,
                                         is_delete_operator_pod=True,
                                         provide_context=True
                                         )
KubernetesPodOperator中的列表没有
命名空间

您可以创建自己的运算符,其行为与将
命名空间
添加到
模板_字段
相同:

class MyKubernetesPodOperator(KubernetesPodOperator):
         template_fields = KubernetesPodOperator.template_fields +('namespace',)
    
然后,您可以将代码用作:

with DAG('test_ns', default_args=default_args, schedule_interval='@once') as dag:
    ns = """ {{ dag_run.conf.ns }} """
    example_task= MyKubernetesPodOperator(namespace=ns,...)
编辑: 代码的完整示例:

from datetime import datetime
from airflow import DAG
from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator


class MyKubernetesPodOperator(KubernetesPodOperator):
    template_fields = KubernetesPodOperator.template_fields + ('namespace',)


default_args = {
    'owner': 'elad',
    'start_date': datetime(2019, 11, 1),

}

with DAG(dag_id='stackoverflow',
         default_args=default_args,
         schedule_interval=None
         ) as dag:
    ns = """ {{ dag_run.conf.ns }} """
    example_task = MyKubernetesPodOperator(namespace=ns,
                                           image='python:3.6',
                                           cmds=["/bin/sh", "-c", "echo {{ns}}"],
                                           arguments=[],
                                           task_id='example_task',
                                           name='example_task',
                                           get_logs=True,
                                           is_delete_operator_pod=True,
                                           )
使用
conf
触发dag:

{"ns":"mynamespace"}

谢谢Elad,我有了这个想法,但在实施上有困难。我试图找到创建自定义运算符的正确语法<代码>类MyOperator(KubernetesPodOperator):@apply_defaults def uuu init_uuu(self,*args,**kwargs):super(MyOperator,self)。uuu init_uu(*args,**kwargs)模板字段=('namespace')+KubernetesPodOperator.template_fields我在教程中看到的这个版本为init返回了一个错误:uuu init_uuu()得到了一个意外的关键字参数'limit\u memory为什么添加了
init
?你试过我答案中的密码了吗?它应该可以正常工作。如果按原样使用,会出现无效的语法错误。我使用1.10.13版。类的使用是我实现一个新操作符的尝试,就像我在这里看到的:从哪里导入KubernetesPodOperator?contrib还是providers?哦,它应该是
('namespace',)
,所以它将是一个元组而不是字符串。我将很快用工作示例更新我的答案。