任务

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

为什么需要任务

传统 CI/CD 挑战

在传统的 CI/CD 系统中,工作流步骤通常与 CI/CD 平台本身紧密耦合。这导致了几个挑战:

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

Tekton 的解决方案

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

  • 基于容器的执行:每个步骤在自己的容器中运行,提供隔离和灵活性
  • Kubernetes 原生:任务作为 Kubernetes Pods 运行,利用 Kubernetes 的调度和扩展能力
  • 声明式定义:任务定义为 Kubernetes 自定义资源,使其可移植且可版本控制
  • 重用性:任务可以在项目和团队之间共享和重用

优势

  • 隔离性:每个步骤在自己的容器中运行,防止依赖项之间的冲突
  • 可移植性:任务可以在任何 Kubernetes 集群上运行,不需要修改
  • 重用性:任务可以在团队和项目之间共享
  • 可扩展性:任务利用 Kubernetes 的调度和资源管理
  • 灵活性:任务可以通过参数和工作空间进行定制
  • 可观察性:任务执行可以通过 Kubernetes 进行监控和日志记录

场景

任务在多种场景中十分有用,包括:

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

约束和限制

  • 任务在单个 Kubernetes 节点上运行,无法跨多个节点
  • 任务中的所有步骤共享相同的 Pod 生命周期
  • 任务中的步骤必须顺序执行,而不能并行执行
  • 任务对条件执行的处理能力有限(对于复杂条件,请使用管道)
  • 任务的执行时间受 Kubernetes Pod 超时限制

原则

任务执行模型

当通过 TaskRun 执行任务时:

  1. Kubernetes 为该任务创建一个 Pod
  2. 任务中的每个步骤成为 Pod 中的一个容器
  3. 步骤按定义的顺序顺序执行
  4. Tekton 向每个步骤容器注入入口二进制文件
  5. 该入口点确保步骤按正确顺序执行
  6. 工作空间作为卷挂载到 Pod 中
  7. 参数作为环境变量或文件传递给任务
  8. 结果被存储并提供给后续任务

步骤执行

任务中的步骤按顺序执行。每个步骤:

  1. 在自己的容器中运行
  2. 可以访问共享工作空间
  3. 可以访问先前步骤的输出
  4. 可以为后续步骤或任务生成结果

配置示例

基本任务示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build
spec:
  workspaces:
    - name: source
      description: 包含源代码的工作空间
  steps:
    - name: build
      image: golang
      workingDir: $(workspaces.source.path)
      script: |
        go build -o app .

结果

结果允许任务生成可以被其他任务使用的输出值。

用例

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

原则

结果是:

  • 在任务规范中声明
  • 由任务写入特定文件路径
  • 在任务完成后被 Tekton 读取
  • 在管道中的后续任务中使用

配置示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: generate-version
spec:
  results:
    - name: version
      description: 生成的版本号
  steps:
    - name: generate
      image: ubuntu
      script: |
        echo "1.0.$(date +%s)" | tee $(results.version.path)

重要参数

工作空间

工作空间允许任务之间共享数据,并提供访问持久卷的方式。

用例

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

原则

工作空间是:

  • 在任务规范中声明
  • 在创建 TaskRun 时绑定到实际存储
  • 挂载到每个步骤容器中指定的路径
  • 可以在管道中的多个任务之间共享

配置示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build
spec:
  workspaces:
    - name: source
      description: 包含源代码的工作空间
      optional: true
  steps:
    - name: build
      image: golang
      workingDir: $(workspaces.source.path)
      script: |
        go build -o app .

参考