PAYATHON 2026

Composer 3 中 KubernetesPodOperator 延迟模式日志报 Forbidden

数据小陈

能否确认是 Composer 3 的已知限制?

现有信息无法确认这是 Cloud Composer 3 的通用限制,也无法证明某个版本已经修复。查阅的官方 KubernetesPodOperator 文档没有明确说明这组参数必然返回 Forbidden。

提供的对照结果显示,问题集中在延迟模式下的日志读取路径。如果当前最需要的是在 Airflow UI 中查看 Pod 日志,可以先使用已在该环境中验证正常的组合:

deferrable=False,
get_logs=True,

如果必须保留 deferrable=True,目前没有足够依据给出一个能保证恢复 UI 日志的受支持配置。可以暂时关闭 get_logs,通过 Composer 的 User Workloads 页面查看日志,但日志不会直接显示在 Airflow UI 中。

为什么任务正常,读取日志却被拒绝?

Pod 状态查询和容器日志读取是不同的 Kubernetes API 请求。任务能够启动、延迟并恢复,并不能说明日志请求使用了相同的凭据和客户端配置,也不能说明日志子资源访问已获准。

延迟模式涉及 triggerer 和恢复后的任务执行阶段。不同 provider 版本处理日志的位置可能不同,不能只凭这条警告就断定 triggerer 缺少权限。例如,provider 10.1.0 会在达到日志间隔时恢复任务,由 operator 获取日志。这是该版本的实现示例,不代表当前环境安装的版本。Airflow KubernetesPodTrigger 源码

可以检查凭据选择、日志端点访问控制和 provider 的版本行为,具体原因需要结合完整异常确认。

先恢复 Airflow UI 日志

示例修正了输入代码中的 import 和缩进,并关闭了延迟模式。请将 my_images 替换成实际镜像。示例省略了原来的空字符串命令参数,假设镜像自身的 ENTRYPOINT/CMD 能执行任务并输出日志。

from datetime import datetime

from airflow import DAG
from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator

with DAG(
    dag_id="kpo_deferrable_logs_issue",
    start_date=datetime(2024, 1, 1),
    schedule=None,
    catchup=False,
) as dag:
    test_task = KubernetesPodOperator(
        task_id="test_kpo",
        name="test-kpo",
        namespace="composer-user-workloads",
        image="my_images",
        get_logs=True,
        is_delete_operator_pod=True,
        deferrable=False,
    )

这一临时绕行方案基于已报告的行为,尚未修复根因。关闭延迟模式后,任务等待 Pod 运行结束期间会持续占用 worker 执行资源。

保留延迟模式时如何排查?

1. 确认 provider 版本和完整异常

除 Composer 镜像版本外,还需要记录 apache-airflow-providers-cncf-kubernetes 的实际安装版本。仅知道 Airflow 2.10.2,无法确定 operator 的具体实现。

检查同一次任务运行的任务日志和 triggerer 日志,尽量取得完整异常,重点确认:

  • Forbidden 出现在延迟期间,还是任务恢复之后。
  • 被拒绝的请求是否访问 Pod 的 /log 端点。
  • 响应是否包含调用身份、namespace 和具体拒绝原因。
  • 是否明确出现无法读取 pods/log 的提示。

如果完整响应说明调用身份缺少 pods/log 访问权限,再按这个方向处理。当前只有一行警告,尚不足以确定是哪一层拒绝了请求。

2. 对照官方 Kubernetes 连接配置

Composer 3 官方示例显式使用以下配置,并说明 /home/airflow/composer_kube_config 包含访问 GKE 的凭据。Composer 3 KubernetesPodOperator 使用说明

config_file="/home/airflow/composer_kube_config",
kubernetes_conn_id="kubernetes_default",

可以在测试 DAG 中加入这两个参数,再使用 deferrable=True, get_logs=True 复现。同时检查 kubernetes_default 是否存在自定义配置,使实际使用的凭据或端点偏离预期。

这项检查用于排除连接配置差异,尚未证实能解决该 Forbidden。

3. 区分日志刷新间隔与访问失败

支持 logging_interval 的 provider 可以定期恢复任务以获取日志;默认值为 None 时,日志可能要等到 Pod 完成后才出现。具体以已安装版本的参数说明为准。Airflow KubernetesPodOperator 参数说明

调整这个参数可以改变日志获取时机,但不能解决已经返回 Forbidden 的请求。

4. 在托管环境的支持范围内处理

Composer 3 的环境集群位于租户项目中,用户不能自行配置该集群。因此,不能直接套用自建 Kubernetes 中修改 Role、RoleBinding 或绑定 cluster-admin 的做法。Composer 3 集群访问说明

如果使用官方连接配置后仍可稳定复现,应向 Google Cloud 支持提交 Composer 镜像版本、provider 版本、区域、任务运行时间、完整异常及三组参数对照结果。是否需要平台修复或升级到指定版本,应以对应缺陷记录或支持结论为准。

必须保留 deferrable=True 时的临时选择

可以先使用:

deferrable=True,
get_logs=False,

随后在环境详情页进入 Monitoring → User Workloads,找到对应工作负载查看日志。官方文档将该入口列为 Pod 工作负载日志的排查方式。Composer 工作负载日志查看说明

这个方案保留了延迟执行,但不会把 Pod 日志回传到 Airflow UI。若必须同时保留延迟执行和 UI 日志,需要先定位并解决日志请求被拒绝的原因。现有材料无法证明存在一个通用参数开关能同时满足这两个条件。

备注:内容仅供参考。