TaskRuns
TaskRun 是一种 Kubernetes 自定义资源,用于实例化一个任务以供执行。TaskRuns 负责执行任务中定义的步骤,并管理其生命周期,提供以独立方式或作为管道一部分运行任务的途径。
为什么需要 TaskRuns
CI/CD 执行挑战
在 CI/CD 系统中,任务执行相关的挑战有:
- 执行跟踪:需要跟踪每个任务执行的进展和状态
- 资源分配:需要为每个任务分配适当的资源
- 输入/输出管理:需要管理任务执行的输入和输出
- 错误处理:需要处理失败并提供调试信息
- 可审计性:需要维护所有任务执行记录,以便审计
Tekton 的解决方案
Tekton TaskRuns 通过以下方式解决这些挑战:
- 执行实例:每个 TaskRun 表示一个特定输入的任务执行
- 状态跟踪:TaskRuns 跟踪每个步骤的执行状态
- 资源绑定:TaskRuns 将实际资源(卷、凭证)绑定到任务需求
- 结果收集:TaskRuns 收集并存储任务生成的结果
- Kubernetes 集成:TaskRuns 利用 Kubernetes 进行资源管理和调度
优势
- 隔离性:每个 TaskRun 独立执行,允许同一任务的并行执行
- 可追溯性:TaskRuns 提供详细的执行历史和日志
- 灵活性:TaskRuns 可以覆盖任务参数和工作区绑定
- 可重用性:相同的任务可以通过不同的 TaskRuns 使用不同的输入执行
- 集成性:TaskRuns 可以通过 Kubernetes API 被各种系统触发
- 可观察性:可以通过 Kubernetes 工具监控 TaskRun 状态和日志
场景
TaskRuns 在多种场景下非常有用,包括:
- 手动任务执行:按需运行任务进行测试或调试
- 定期操作:按计划运行任务以进行维护
- 事件驱动执行:响应外部事件触发任务
- 管道组件:作为更大管道的一部分执行任务
- CI/CD 操作:构建、测试和部署应用
限制与限制条件
- TaskRuns 在单个 Kubernetes 节点上执行,无法跨多个节点
- 一旦启动,TaskRun 参数无法修改
- TaskRuns 对失败步骤的重试能力有限
- TaskRun 的执行时间受到 Kubernetes pod 超时的限制
- 一旦开始执行,TaskRuns 无法暂停
原则
TaskRun 执行模型
当创建 TaskRun 时:
- Tekton 验证 TaskRun 规范
- Kubernetes 为 TaskRun 创建一个 Pod
- 任务中的每个步骤都变成 Pod 中的一个容器
- Tekton 向每个步骤容器注入一个入口二进制文件
- 步骤按任务中定义的顺序顺序运行
- 随着每个步骤的完成,TaskRun 状态被更新
- 结果被收集并存储在 TaskRun 状态中
- 当所有步骤完成或发生失败时,Pod 被终止
TaskRun 状态
TaskRun 状态提供有关执行的详细信息:
- 总体状态(运行中、成功、失败等)
- 开始和完成时间
- 各个步骤的状态
- 任务结果
- 失败原因(如果适用)
- 访问日志的 Pod 名称
配置示例
基本 TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: build-app-run
spec:
taskRef:
name: build-app
params:
- name: image
value: my-registry/my-app:latest
workspaces:
- name: source
persistentVolumeClaim:
claimName: app-source-pvc
带有嵌入式任务定义的 TaskRun
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: print-message-run
spec:
taskSpec:
params:
- name: message
type: string
steps:
- name: print
image: ubuntu
script: |
echo "$(params.message)"
params:
- name: message
value: "Hello, Tekton!"
重要参数
超时
超时允许设置 TaskRun 执行的最大持续时间。
用例
- 防止长时间运行的任务无限消耗资源
- 确保 CI/CD 管道在合理的时间内完成
- 处理挂起或死锁的任务
原则
超时:
- 在 TaskRun 规范中指定
- 应用于整个 TaskRun 执行
- 从第一个步骤开始到最后一个步骤完成进行测量
- 如果超时,将导致 TaskRun 失败
配置示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: build-with-timeout
spec:
taskRef:
name: build-app
timeout: "10m"
params:
- name: image
value: my-registry/my-app:latest
Pod 模板
Pod 模板允许自定义 TaskRun 的 Kubernetes Pod 配置。
用例
- 设置资源限制和请求
- 配置节点选择器和容忍
- 添加安全上下文
- 配置服务账户
原则
Pod 模板:
- 应用于为 TaskRun 创建的 Pod
- 可以覆盖默认的 Pod 配置
- 允许对 Pod 执行环境进行细粒度控制
- 可用于满足特定的安全或资源需求
配置示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: build-with-pod-template
spec:
taskRef:
name: build-app
podTemplate:
securityContext:
runAsNonRoot: true
nodeSelector:
disktype: ssd
参考资料