TaskRuns

TaskRun 是一个 Kubernetes 自定义资源,用于实例化 Task 以执行。TaskRun 负责执行 Task 中定义的步骤并管理其生命周期,提供了一种独立运行 Task 或作为 Pipeline 一部分运行 Task 的方式。

目录

为什么需要 TaskRuns

CI/CD 执行挑战

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

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

Tekton 的解决方案

Tekton TaskRuns 通过以下方式解决这些挑战:

  • 执行实例:每个 TaskRun 代表 Task 的一次具体执行,带有特定输入
  • 状态跟踪:TaskRuns 跟踪每个 Step 的执行状态
  • 资源绑定:TaskRuns 将实际资源(卷、凭证)绑定到 Task 的需求
  • 结果收集:TaskRuns 收集并存储 Task 产生的结果
  • Kubernetes 集成:TaskRuns 利用 Kubernetes 进行资源管理和调度

优势

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

场景

TaskRuns 适用于多种场景,包括:

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

约束与限制

  • TaskRuns 在单个 Kubernetes 节点上执行,不能跨节点
  • 启动后,TaskRun 参数不可修改
  • TaskRuns 对失败 Step 的重试能力有限
  • TaskRun 执行时间受 Kubernetes Pod 超时限制
  • TaskRuns 一旦开始执行,不能暂停

原则

TaskRun 执行模型

创建 TaskRun 时:

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

TaskRun 状态

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

  1. 总体状态(运行中、成功、失败等)
  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!"

重要参数

Timeout

Timeout 允许设置 TaskRun 执行的最长时长。

使用场景

  • 防止长时间运行的 Task 无限占用资源
  • 确保 CI/CD 流水线在合理时间内完成
  • 处理挂起或死锁的 Task

原则

Timeout:

  • 在 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 步骤的 Pod 的 CPU 和内存分配。

使用场景

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

原则

资源限制:

  • 使用 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 步骤的底层 Pod。

TIP

有关 Pod 模板的更多信息,请参见 Pod Templates

使用场景

  • 安全配置:设置安全上下文以非 root 用户运行容器
  • 节点选择:使用节点选择器调度 Pod 到特定节点
  • 容忍度:为带污点节点添加容忍度
  • 服务账户:配置 Pod 执行的自定义服务账户
  • 卷配置:添加额外卷或配置卷挂载
  • 环境变量:在 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"

带服务账户和环境变量的 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"

参考资料