TaskRuns

TaskRun 是一种 Kubernetes Custom Resource,用于实例化 Task 以执行任务。TaskRun 负责执行 Task 中定义的步骤并管理其生命周期,从而可以独立运行 Task,也可以将其作为 Pipeline 的一部分运行。

为什么需要 TaskRun

CI/CD 执行挑战

在 CI/CD 系统中,任务执行面临以下挑战:

  • 执行跟踪:需要跟踪每次任务执行的进度和状态
  • 资源分配:需要为每个任务分配适当的资源
  • 输入/输出管理:需要管理任务执行的输入和输出
  • 错误处理:需要处理故障并提供调试信息
  • 可审计性:需要维护所有任务执行的记录,以便进行审计

Tekton 的解决方案

Tekton TaskRun 通过以下方式应对这些挑战:

  • 执行实例:每个 TaskRun 代表一次使用特定输入执行 Task 的过程
  • 状态跟踪:TaskRun 跟踪每个 Step 的执行状态
  • 资源绑定:TaskRun 将实际资源(卷、凭据)绑定到 Task 的要求
  • 结果收集:TaskRun 收集并存储 Task 生成的结果
  • Kubernetes 集成:TaskRun 利用 Kubernetes 进行资源管理和调度

优势

  • 隔离性:每个 TaskRun 独立执行,因此可以并行执行同一个 Task
  • 可追溯性:TaskRun 提供详细的执行历史记录和日志
  • 灵活性:TaskRun 可以覆盖 Task 参数和工作区绑定
  • 可复用性:通过不同的 TaskRun,可以使用不同的输入执行同一个 Task
  • 集成性:通过 Kubernetes API,各种系统都可以触发 TaskRun
  • 可观测性:可以通过 Kubernetes 工具监控 TaskRun 状态和日志

场景

TaskRun 适用于各种场景,包括:

  • 手动执行任务:按需运行 Task 以进行测试或调试
  • 定时操作:按计划运行 Task 以执行维护操作
  • 事件驱动执行:响应外部事件触发 Task
  • Pipeline 组件:将 Task 作为更大 Pipeline 的一部分执行
  • CI/CD 操作:构建、测试和部署应用程序

约束和限制

  • TaskRun 在单个 Kubernetes 节点上执行,无法跨多个节点
  • TaskRun 启动后,无法修改其参数
  • TaskRun 对失败的 Step 仅提供有限的重试能力
  • TaskRun 的执行时间受 Kubernetes Pod 超时限制
  • TaskRun 开始执行后无法暂停

原则

TaskRun 执行模型

创建 TaskRun 时:

  1. Tekton 验证 TaskRun 规范
  2. Kubernetes 为 TaskRun 创建 Pod
  3. Task 中的每个 Step 都会成为 Pod 中的一个容器
  4. Tekton 将 entrypoint 二进制文件注入每个 Step 容器
  5. Step 按照 Task 中定义的顺序依次运行
  6. 每个 Step 完成后都会更新 TaskRun 状态
  7. 收集结果并将其存储在 TaskRun 状态中
  8. 所有 Step 完成或执行失败后,终止 Pod

TaskRun 状态

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

  1. 总体状态(Running、Succeeded、Failed 等)
  2. 开始时间和完成时间
  3. 各个 Step 的状态
  4. Task 结果
  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

包含嵌入式 Task 定义的 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 执行设置最大持续时间。

使用场景

  • 防止长时间运行的 Task 无限期消耗资源
  • 确保 CI/CD Pipeline 在合理的时间范围内完成
  • 处理挂起或死锁的 Task

原则

超时:

  • 在 TaskRun 规范中指定
  • 应用于整个 TaskRun 执行过程
  • 从第一个 Step 开始到最后一个 Step 完成进行计时
  • 超时后会导致 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

资源限制

资源限制允许指定 TaskRun 执行所需的计算资源和资源上限。TaskRun 规范中的 computeResources 字段提供了一种控制执行 TaskRun Step 的 Pod 的 CPU 和内存分配的方式。

使用场景

  • 资源管理:在各个 TaskRun 之间公平分配资源
  • 成本控制:防止过度消耗资源
  • 性能:针对计算密集型操作优化资源分配
  • 稳定性:避免资源耗尽影响其他工作负载

原则

资源限制:

  • 在 TaskRun 规范中使用 computeResources 字段
  • 包含 requests(最小值)和 limits(最大值)
  • 应用于 TaskRun Pod 中的所有容器
  • 可以由单个 Step 规范覆盖
  • 遵循 Kubernetes 资源规范格式

配置示例

基本资源限制

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-resources
spec:
  taskRef:
    name: build-app
  computeResources:
    requests:
      memory: "512Mi"
      cpu: "250m"
    limits:
      memory: "1Gi"
      cpu: "500m"

Pod 模板

Pod 模板允许自定义 TaskRun 的 Kubernetes Pod 配置。 TaskRun 规范中的 podTemplate 字段提供了一种配置执行 TaskRun Step 的底层 Pod 的方式。

TIP

有关 Pod 模板的更多信息,请参阅 Pod 模板。

使用场景

  • 安全配置:设置安全上下文,以非 root 用户身份运行容器
  • 节点选择:使用节点选择器将 Pod 调度到特定节点
  • 容忍度:为带有污点的节点添加容忍度
  • Service Account:为 Pod 执行配置自定义 Service Account
  • 卷配置:添加其他卷或配置卷挂载
  • 环境变量:在 Pod 级别设置环境变量
  • 亲和性规则:配置 Pod 亲和性和反亲和性规则

原则

Pod 模板:

  • 应用于为 TaskRun 创建的 Pod
  • 可以覆盖 Tekton 设置的默认 Pod 配置
  • 支持对 Pod 执行环境进行精细控制
  • 可用于满足特定的安全性、合规性或资源要求
  • 支持所有标准 Kubernetes Pod 规范字段
  • 与 Tekton 的默认 Pod 配置合并

配置示例

包含安全上下文的基本 Pod 模板

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-pod-template
spec:
  taskRef:
    name: build-app
  podTemplate:
    securityContext:
      runAsNonRoot: true
      runAsUser: 1001
      fsGroup: 1001

包含节点选择器和资源限制的 Pod 模板

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-resources
spec:
  taskRef:
    name: build-app
  computeResources:
    requests:
      memory: "512Mi"
      cpu: "250m"
    limits:
      memory: "1Gi"
      cpu: "500m"
  podTemplate:
    nodeSelector:
      disktype: ssd
      environment: production

包含容忍度和亲和性的 Pod 模板

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-affinity
spec:
  taskRef:
    name: build-app
  podTemplate:
    tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "build"
        effect: "NoSchedule"
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: "kubernetes.io/e2e-az-name"
                  operator: "In"
                  values:
                    - "e2e-az1"
                    - "e2e-az2"

包含 Service Account 和环境变量的 Pod 模板

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-env
spec:
  taskRef:
    name: build-app
  podTemplate:
    serviceAccountName: build-service-account
    env:
      - name: BUILD_ENVIRONMENT
        value: "production"
      - name: LOG_LEVEL
        value: "debug"

参考资料