ScheduledTrigger 未按计划触发
问题描述
创建 ScheduledTrigger 后,预期时间点没有出现任何 PipelineRun(或 TriggerTemplate 内的其他资源)。
根本原因分析
常见原因包括:
- cron 表达式或可选的
timeZone无效,或者预期地域的下一个触发时间尚未到达。 - 引用的
TriggerTemplate(或内联模板内容)无法解析,通常是因为名称/命名空间错误或缺少权限。 - 渲染成功,但由于 RBAC 问题或模板中的校验错误导致 Tekton 资源创建失败。
有关 ScheduledTrigger 规范的字段逐项说明,请参见 ScheduledTrigger API 和 重要参数说明。
问题排查
排查时请始终从以下命令开始:
Events 部分会显示诸如 UnknownTimeZone、UnparseableSchedule、InvalidSchedule、UnknownTriggerTemplate 或 FailedCreate 等警告。根据这些事件类型选择下面相应的解决方案。
请按照以下检查步骤逐步缩小问题范围:
验证调度和时区
- 使用
kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.spec.schedule}'查看调度表达式,确认它是预期的 cron 表达式(分钟 小时 日 月 星期)。 - 如果设置了
spec.timeZone,确认它是有效的 时区(例如Asia/Shanghai)。拼写错误会导致控制器发出UnknownTimeZone警告并跳过执行。cron 语法错误时,控制器会创建UnparseableSchedule或InvalidSchedule事件;请修正表达式后重新应用。 - 比较
kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.status.lastScheduleTime}'与当前时间,确认最近一次运行是否确实已过期。请记住,cron 表达式是在所选时区内计算的,而非查看者本地时间。
确认 TriggerTemplate 引用
- 使用
spec.triggerTemplate.ref时,确保引用的TriggerTemplate存在于相同命名空间:kubectl get triggertemplate <ref> -n <namespace>。 - 对于内联模板,运行
kubectl describe scheduledtrigger <name>,查看是否有关于triggerTemplate内缺失字段的校验错误。 - 确保诸如
$(context.datetime)之类的占位符仅用于spec.params。渲染后的模板必须通过$(tt.params.<name>)引用它们;在其他位置使用 context 占位符会导致渲染失败,并表现为UnknownTriggerTemplate警告。
检查应用或权限失败的事件
- 运行
kubectl describe scheduledtrigger <name> -n <namespace>,查看 Events 部分。出现FailedCreate、ResourceApplyFailed或 RBACforbidden错误,说明控制器尝试触发但被阻止。 FailedCreate警告通常意味着 Tekton 拒绝了渲染后的资源。检查消息,调整模板,然后重新应用 ScheduledTrigger。- 为排查模板问题,尝试直接从
TriggerTemplate内容实例化一个PipelineRun或TaskRun。手动将所有$(tt.params.<name>)占位符替换为具体值,应用资源,确认是否能成功创建。
其他建议
-
调试时,可临时将
spec.schedule改为每分钟执行(例如*/1 * * * *),确认调整后是否开始执行。 -
保持
ScheduledTrigger和TriggerTemplate在同一命名空间,避免跨命名空间引用带来的混淆。 -
使用标签
tekton.alaudadevops.io/scheduled-trigger-name列出所有由 ScheduledTrigger 创建的资源。例如:将
<scheduled-trigger-name>替换为你的资源名称,即可查看该 ScheduledTrigger 触发的所有 PipelineRun 或 TaskRun。