任务
任务是 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 执行任务时:
- Kubernetes 为该任务创建一个 Pod
- 任务中的每个步骤成为 Pod 中的一个容器
- 步骤按定义的顺序顺序执行
- Tekton 向每个步骤容器注入入口二进制文件
- 该入口点确保步骤按正确顺序执行
- 工作空间作为卷挂载到 Pod 中
- 参数作为环境变量或文件传递给任务
- 结果被存储并提供给后续任务
步骤执行
任务中的步骤按顺序执行。每个步骤:
- 在自己的容器中运行
- 可以访问共享工作空间
- 可以访问先前步骤的输出
- 可以为后续步骤或任务生成结果
配置示例
基本任务示例
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 .
参考