4. Tekton PipelineRun超时与重试

任务目标

为 Tekton PipelineRun 设置整体超时时间,并为其中某个 Task 配置失败重试次数,通过故意制造超时和失败场景,验证两种机制均按预期生效。

环境准备

需要可用的 Tekton 集群(v0.40+),并已安装 Tekton Pipelines 组件。以下示例使用 kubectl 操作,所有 YAML 保存为独立文件后依次应用。

实现步骤

1. 创建带超时与重试的 Pipeline

定义 PipelineRun,设置 timeout 为 30 秒(整体超时),同时为 retry-task 配置 retries: 2(失败后最多重试 2 次)。

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: timeout-retry-demo
spec:
  timeout: 30s
  pipelineSpec:
    tasks:
      - name: retry-task
        retries: 2
        taskSpec:
          steps:
            - name: fail-first-attempts
              image: alpine:3.19
              script: |
                #!/bin/sh
                echo "Attempt $(cat /tekton/home/attempt 2>/dev/null || echo 0)"
                # 第一次执行必然失败,第二次成功
                if [ ! -f /tmp/success ]; then
                  echo "Simulating failure..."
                  exit 1
                fi
                echo "Task succeeded"
              volumeMounts:
                - name: retry-state
                  mountPath: /tmp
          volumes:
            - name: retry-state
              emptyDir: {}
      - name: timeout-task
        taskSpec:
          steps:
            - name: sleep-forever
              image: alpine:3.19
              script: |
                #!/bin/sh
                echo "Starting long sleep..."
                sleep 120
  

说明:retry-task 利用 emptyDir 卷在重试间保留状态——首次执行写入失败标记并退出 1,触发重试;第二次执行检测到标记后成功退出。该设计用于验证重试确实发生且状态可跨重试保留。

2. 应用并观察状态

kubectl apply -f pipeline-run.yaml
kubectl get pipelinerun timeout-retry-demo -w

3. 验证重试机制

等待约 1 分钟后,检查 TaskRun 状态:

kubectl get taskrun -l tekton.dev/pipelineRun=timeout-retry-demo -o custom-columns=NAME:.metadata.name,STATUS:.status.conditions[0].reason,RETRIES:.status.retriesStatus

预期看到 retry-task 的 TaskRun 先出现 Failed,随后自动创建新的 TaskRun 并最终 Succeeded。可通过 kubectl describe taskrun 查看 Retries 字段确认重试次数。

4. 验证整体超时

由于 timeout-task 睡眠 120 秒而 PipelineRun 整体超时仅 30 秒,整个 PipelineRun 应在约 30 秒后进入 TimedOut 状态:

kubectl get pipelinerun timeout-retry-demo

观察 STATUS 列变为 TimedOut,且 timeout-task 对应的 TaskRun 被终止。

判定标准

  • 重试生效:retry-task 的 TaskRun 经历至少 1 次失败后最终成功,且 status.retriesStatus 中记录失败尝试。
  • 超时生效:PipelineRun 在约 30 秒时状态变为 TimedOut,而非等待 120 秒完成。
  • 两个机制独立验证,互不干扰。

常见问题

  • 重试未触发:确认 Task 的 retries 字段位于 tasks 条目下(而非 taskSpec 内),且失败退出码非 0。
  • 超时未生效:检查 timeout 字段格式(如 30s),并确认 Tekton 版本支持 v1 API。
  • 清理资源:kubectl delete pipelinerun timeout-retry-demo