Airflow2.1.4搭配KubernetesExecutor报SIGTERM及PID不匹配错误
问题根因
这是Airflow 2.1.x版本结合KubernetesExecutor使用时的已知逻辑bug:
当worker容器默认运行用户为非root用户时,即使你没有手动配置任务的run_as_user参数,task_runner.run_as_user也会被赋值为当前运行的用户(你的场景里为airflow),触发local_task_job.py中取父PID的逻辑。但你实际没有做用户切换操作,任务进程PID就是当前进程ID,校验时父PID和当前PID不匹配,心跳检测认为任务已僵死,直接发送SIGTERM信号终止任务。
排查步骤
- 校验pod模板配置:打开你配置的
/usr/local/airflow/pod_templates/pod_template_file.yaml,检查securityContext下的runAsUser、runAsGroup取值,是否和你Dockerfile中创建的airflow用户UID/GID完全一致,UID不匹配会导致系统误判发生了用户切换。 - 校验全局默认配置:检查airflow.cfg的
core段是否配置了default_impersonation参数,该参数会全局给所有任务添加run_as_user属性,即使DAG中没有显式配置。 - 校验家目录权限配置:你的Dockerfile中将
/root目录权限赋值给airflow用户,部分组件会识别/root为root用户默认家目录,触发用户切换的误判,建议将AIRFLOW_HOME调整为/home/airflow等普通用户目录。
解决方案
临时修复(无需升级Airflow版本)
你可以任选以下一种方案:
- 全局配置覆盖:在airflow.cfg的
core段添加配置run_as_user =(值留空),覆盖task_runner.run_as_user的默认取值。 - DAG配置覆盖:在所有DAG的默认参数中显式指定
run_as_user = None,同时在airflow_local_settings.py中添加DEFAULT_OPERATOR_ARGS = {'run_as_user': None}做全局覆盖。 - 源码修改:直接修改镜像中
airflow/jobs/local_task_job.py的对应逻辑,PID校验前添加判断:如果当前运行用户和task_runner.run_as_user一致,就直接使用当前PID校验,无需取父PID。
永久修复
直接将Airflow版本升级到2.2.3及以上,该PID校验的逻辑bug已经在2.2.3版本被官方修复,不需要额外调整配置。
内容的提问来源于stack exchange,提问作者Rajeev Reddy
相关产品推荐
相关产品推荐

