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 时:
- Tekton 验证 TaskRun 规范
- Kubernetes 为 TaskRun 创建 Pod
- Task 中的每个 Step 变为 Pod 中的一个容器
- Tekton 向每个 Step 容器注入入口二进制文件
- Steps 按 Task 中定义的顺序依次执行
- 每个 Step 完成后更新 TaskRun 状态
- 收集结果并存储在 TaskRun 状态中
- 所有 Steps 完成或失败时终止 Pod
TaskRun 状态
TaskRun 状态提供详细的执行信息:
- 总体状态(运行中、成功、失败等)
- 开始和完成时间
- 各个 Step 的状态
- Task 结果
- 失败原因(如适用)
- 用于访问日志的 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。
使用场景
- 安全配置:设置安全上下文以非 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"
参考资料