Templates 气流-动态更改KubernetesPodOperator中的命名空间
我正在kubernetes上运行airflow 1.10.13,并试图找到一种方法来动态更改运行任务的命名空间。 我尝试使用模板并从dag_run.conf json插入参数,但该模板仅在“cmds”中呈现,而不在其他任务字段(如命名空间)中呈现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
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',)
,所以它将是一个元组而不是字符串。我将很快用工作示例更新我的答案。