Tasks

Task 是一组在 Kubernetes 的同一节点上按顺序执行的 Step。Task 是 Tekton CI/CD 工作流的基本构建块,允许你定义一系列按顺序执行的操作。

为什么需要 Task

传统 CI/CD 的挑战

在传统 CI/CD 系统中,工作流步骤通常与 CI/CD 平台本身紧密耦合。这会带来一些挑战:

  • 可移植性:在一个 CI/CD 系统中定义的工作流无法轻松迁移到另一个系统
  • 灵活性:针对不同步骤自定义执行环境的能力有限
  • 可扩展性:难以根据资源需求扩展单个步骤
  • 可复用性:为一个项目定义的步骤难以在其他项目中复用

Tekton 的解决方案

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

  • 基于容器的执行:每个 Step 都在其自身的容器中运行,从而提供隔离性和灵活性
  • Kubernetes 原生:Task 以 Kubernetes Pod 的形式运行,利用 Kubernetes 的调度和扩展能力
  • 声明式定义:Task 定义为 Kubernetes Custom Resource,具有可移植性并支持版本控制
  • 可复用性:Task 可以在不同项目和团队之间共享和复用

优势

  • 隔离性:每个 Step 都在其自身的容器中运行,避免依赖项之间发生冲突
  • 可移植性:Task 无需修改即可在任何 Kubernetes 集群上运行
  • 可复用性:Task 可以在不同团队和项目之间共享
  • 可扩展性:Task 利用 Kubernetes 的调度和资源管理能力
  • 灵活性:Task 可以通过参数和工作区进行自定义
  • 可观测性:可以通过 Kubernetes 监控和记录 Task 的执行情况

场景

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

  • 构建操作:编译源代码、运行单元测试
  • 部署操作:将应用程序部署到不同环境
  • 验证操作:运行安全扫描、代码质量检查
  • 基础设施操作:预配和配置基础设施
  • 数据处理:ETL 操作、数据验证

约束和限制

  • Task 在单个 Kubernetes 节点上运行,无法跨多个节点
  • Task 中的所有 Step 共享同一个 Pod 生命周期
  • Task 中的 Step 必须按顺序运行,不能并行运行
  • Task 处理条件执行的能力有限(复杂条件请使用 Pipeline)
  • Task 的执行时间受 Kubernetes Pod 超时限制

原则

Task 执行模型

通过 TaskRun 执行 Task 时:

  1. Kubernetes 为 Task 创建一个 Pod
  2. Task 中的每个 Step 都会成为 Pod 中的一个容器
  3. Step 按定义的顺序依次运行
  4. Tekton 会将入口点二进制文件注入每个 Step 容器
  5. 入口点确保 Step 按正确顺序运行
  6. 工作区会作为卷挂载到 Pod 中
  7. 参数会以环境变量或文件的形式传递给 Task
  8. 结果会被存储,并提供给后续 Task

Step 执行

Task 中的 Step 按顺序执行。每个 Step:

  1. 在其自身的容器中运行
  2. 可以访问共享工作区
  3. 可以访问前序 Step 的输出
  4. 可以为后续 Step 或 Task 生成结果

配置示例

基本 Task 示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build
spec:
  workspaces:
    - name: source
      description: The workspace containing the source code
  steps:
    - name: build
      image: golang
      workingDir: $(workspaces.source.path)
      script: |
        go build -o app .

结果

结果允许 Task 生成可供其他 Task 使用的输出值。

使用场景

  • 传递构建版本信息
  • 共享生成的构件路径
  • 传递测试结果
  • 传递部署 URL

原则

结果:

  • 在 Task 规范中声明
  • 由 Task 写入特定文件路径
  • 在 Task 完成后由 Tekton 读取
  • 在 Pipeline 中提供给后续 Task

配置示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: generate-version
spec:
  results:
    - name: version
      description: The generated version number
  steps:
    - name: generate
      image: ubuntu
      script: |
        echo "1.0.$(date +%s)" | tee $(results.version.path)

重要参数

工作区

工作区允许 Task 之间共享数据,并提供访问持久化卷的方式。

使用场景

  • 在 Task 之间共享源代码
  • 存储构建构件
  • 共享配置文件
  • 在多次 Task 运行之间持久化数据

原则

工作区:

  • 在 Task 规范中声明
  • 在创建 TaskRun 时绑定到实际存储
  • 挂载到每个 Step 容器中指定的路径
  • 可以在 Pipeline 中由多个 Task 共享

配置示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build
spec:
  workspaces:
    - name: source
      description: The workspace containing the source code
      optional: true
  steps:
    - name: build
      image: golang
      workingDir: $(workspaces.source.path)
      script: |
        go build -o app .

参考资料