ScheduledTrigger 未按计划触发

问题描述

创建 ScheduledTrigger 后,预期时间点没有出现任何 PipelineRun(或 TriggerTemplate 内的其他资源)。

根本原因分析

常见原因包括:

  1. cron 表达式或可选的 timeZone 无效,或者预期地域的下一个触发时间尚未到达。
  2. 引用的 TriggerTemplate(或内联模板内容)无法解析,通常是因为名称/命名空间错误或缺少权限。
  3. 渲染成功,但由于 RBAC 问题或模板中的校验错误导致 Tekton 资源创建失败。

有关 ScheduledTrigger 规范的字段逐项说明,请参见 ScheduledTrigger API重要参数说明

问题排查

排查时请始终从以下命令开始:

# 替换为你的 ScheduledTrigger 名称和命名空间
kubectl describe scheduledtrigger <name> -n <namespace>
# 事件:
#   Type     Reason                  Age               From               Message
#   ----     ------                  ----              ----               -------
#   Warning  UnknownTriggerTemplate  2s (x11 over 7s)  scheduled-trigger  failed to resolve TriggerTemplate: error getting TriggerTemplate missing-trigger-template: TriggerTemplate.triggers.tekton.dev "missing-trigger-template" not found

Events 部分会显示诸如 UnknownTimeZoneUnparseableScheduleInvalidScheduleUnknownTriggerTemplateFailedCreate 等警告。根据这些事件类型选择下面相应的解决方案。

请按照以下检查步骤逐步缩小问题范围:

验证调度和时区

  1. 使用 kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.spec.schedule}' 查看调度表达式,确认它是预期的 cron 表达式(分钟 小时 日 月 星期)。
  2. 如果设置了 spec.timeZone,确认它是有效的 时区(例如 Asia/Shanghai)。拼写错误会导致控制器发出 UnknownTimeZone 警告并跳过执行。cron 语法错误时,控制器会创建 UnparseableScheduleInvalidSchedule 事件;请修正表达式后重新应用。
  3. 比较 kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.status.lastScheduleTime}' 与当前时间,确认最近一次运行是否确实已过期。请记住,cron 表达式是在所选时区内计算的,而非查看者本地时间。

确认 TriggerTemplate 引用

  1. 使用 spec.triggerTemplate.ref 时,确保引用的 TriggerTemplate 存在于相同命名空间:kubectl get triggertemplate <ref> -n <namespace>
  2. 对于内联模板,运行 kubectl describe scheduledtrigger <name>,查看是否有关于 triggerTemplate 内缺失字段的校验错误。
  3. 确保诸如 $(context.datetime) 之类的占位符仅用于 spec.params。渲染后的模板必须通过 $(tt.params.<name>) 引用它们;在其他位置使用 context 占位符会导致渲染失败,并表现为 UnknownTriggerTemplate 警告。

检查应用或权限失败的事件

  1. 运行 kubectl describe scheduledtrigger <name> -n <namespace>,查看 Events 部分。出现 FailedCreateResourceApplyFailed 或 RBAC forbidden 错误,说明控制器尝试触发但被阻止。
  2. FailedCreate 警告通常意味着 Tekton 拒绝了渲染后的资源。检查消息,调整模板,然后重新应用 ScheduledTrigger。
  3. 为排查模板问题,尝试直接从 TriggerTemplate 内容实例化一个 PipelineRunTaskRun。手动将所有 $(tt.params.<name>) 占位符替换为具体值,应用资源,确认是否能成功创建。

其他建议

  • 调试时,可临时将 spec.schedule 改为每分钟执行(例如 */1 * * * *),确认调整后是否开始执行。

  • 保持 ScheduledTriggerTriggerTemplate 在同一命名空间,避免跨命名空间引用带来的混淆。

  • 使用标签 tekton.alaudadevops.io/scheduled-trigger-name 列出所有由 ScheduledTrigger 创建的资源。例如:

    # 替换为你的 ScheduledTrigger 名称和命名空间
    kubectl get pipelinerun -n <namespace> -l tekton.alaudadevops.io/scheduled-trigger-name=<scheduled-trigger-name>
    # NAME          SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
    # demo-pr-225j6    True        Succeeded   19h         19h
    # demo-pr-22j8w    True        Succeeded   151m        151m
    # demo-pr-22jxp    True        Succeeded   4h39m       4h39m
    
    # 替换为你的 ScheduledTrigger 名称和命名空间
    kubectl get taskrun -n <namespace> -l tekton.alaudadevops.io/scheduled-trigger-name=<scheduled-trigger-name>
    # NAME          SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
    # demo-tr-hbbk8    True        Succeeded   40d         40d
    # demo-tr-jddi2    True        Succeeded   14d         14d
    # demo-tr-kdq5w    True        Succeeded   14d         14d

    <scheduled-trigger-name> 替换为你的资源名称,即可查看该 ScheduledTrigger 触发的所有 PipelineRun 或 TaskRun。