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