使用Airflow KubernetesPodOperator部署DBT Pod至GKE时遇配置错误
问题排查:Airflow 1.10.10中KubernetesPodOperator部署DBT Pod报错"Service host/port is not set."
运行KubernetesPodOperator任务时出现以下错误:
File "/home/airflow/.local/lib/python3.6/site-packages/kubernetes/config/incluster_config.py", line 51, in _load_config
raise ConfigException("Service host/port is not set.")
任务代码
uk_dbt_transform_task = KubernetesPodOperator( name="dbt-test-processor", namespace='prod', project_id=PROJECT_ID, cluster_name=CLUSTER_NAME, location='europe-west2', startup_timeout_seconds=120, image=IMAGE_URL, cmds=["run"], arguments=["-s", "TABLE_NAME"], get_logs=True, image_pull_policy="Always", ports=9090, # 此处为配置的端口 hostnetwork=False, # 按Airflow文档设置为默认值false is_delete_operator_pod=False, config_file=KUBE_CONFIG, service_account_name=SERVICE_ACCOUNT, dag=dag, task_id='uk_dbt_transform_task' )
自定义DBT容器Dockerfile
# Top level build args ARG build_for=linux/amd64 # FROM python:3.9.16-bullseye FROM --platform=$build_for python:3.9.16-bullseye as base ARG dbt_core_ref=dbt-core@v1.4.0b1 ARG dbt_bigquery_ref=dbt-bigquery@v1.4.0b1 # System setup RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y --no-install-recommends \ git \ ssh-client \ software-properties-common \ make \ build-essential \ ca-certificates \ libpq-dev \ && apt-get clean \ && rm -rf \ /var/lib/apt/lists/* \ /tmp/* \ /var/tmp/* # Env vars ENV PYTHONIOENCODING=utf-8 ENV LANG=C.UTF-8 # Update python RUN python -m pip install --upgrade pip setuptools wheel --no-cache-dir # Set docker basics WORKDIR /usr/app/dbt/ VOLUME /usr/app COPY . /usr/app/dbt/ ENTRYPOINT ["dbt"] ## # dbt-core ## FROM base as dbt-core RUN python -m pip install --no-cache-dir "git+https://github.com/dbt-labs/${dbt_core_ref}#egg=dbt-core&subdirectory=core" ## # dbt-bigquery ## FROM base as dbt-bigquery RUN python -m pip install --no-cache-dir "git+https://github.com/dbt-labs/${dbt_bigquery_ref}#egg=dbt-bigquery" # Expose port for dbt docs EXPOSE 9090
排查与解决方案
1. 错误根源:Kubernetes客户端配置加载问题
这个错误并非Pod端口配置导致,而是Airflow的Kubernetes客户端无法正确加载集群配置,尝试从集群内配置路径读取但失败,和你设置的ports参数无关。
2. 关键修复点
- 检查
config_file路径有效性:确保KUBE_CONFIG变量指向的kubeconfig文件路径在Airflow worker容器内存在且可读。如果Airflow运行在Kubernetes集群内,通常不需要手动指定config_file,客户端会自动读取集群内的默认配置(/var/run/secrets/kubernetes.io/serviceaccount/路径下的文件)。若你指定了外部kubeconfig,确认文件已挂载到worker容器中,且权限正确。 - 修正
ports参数格式:Airflow 1.10.x的KubernetesPodOperator中,ports参数需要传入列表类型,而非单个整数。正确写法应为:
单个整数会导致参数解析错误,虽然这不是当前报错的直接原因,但会引发后续Pod配置问题。ports=[{'containerPort': 9090}] - 验证服务账号权限:确认
SERVICE_ACCOUNT对应的Kubernetes服务账号拥有足够权限(如创建Pod、读取日志等),且已正确关联到Airflow worker或Pod执行角色。 - 检查集群内环境变量:若Airflow运行在Kubernetes集群内,确保worker容器内存在
KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT环境变量,这两个变量是集群内配置加载的关键。如果缺失,可能是集群配置或Airflow部署方式的问题。
3. 额外建议
- Airflow 1.10.10版本较旧,建议升级到同系列稳定版(如1.10.15)以获取更多Kubernetes相关的bug修复。
- 若使用GKE集群,确认Airflow worker所在节点已正确配置集群访问权限,无需手动指定kubeconfig,利用集群原生的身份认证更可靠。
内容的提问来源于stack exchange,提问作者mj8701
相关产品推荐
相关产品推荐

