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 时:

  1. Tekton 验证 TaskRun 规范
  2. Kubernetes 为 TaskRun 创建一个 Pod
  3. 任务中的每个步骤都变成 Pod 中的一个容器
  4. Tekton 向每个步骤容器注入一个入口二进制文件
  5. 步骤按任务中定义的顺序顺序运行
  6. 随着每个步骤的完成,TaskRun 状态被更新
  7. 结果被收集并存储在 TaskRun 状态中
  8. 当所有步骤完成或发生失败时,Pod 被终止

TaskRun 状态

TaskRun 状态提供有关执行的详细信息:

  1. 总体状态(运行中、成功、失败等)
  2. 开始和完成时间
  3. 各个步骤的状态
  4. 任务结果
  5. 失败原因(如果适用)
  6. 访问日志的 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

参考资料