第49章|Tekton 入门:Task、Pipeline、PipelineRun 与参数化

如果说 Jenkins 是“装在 K8s 旁边的 CI 引擎”,那 Tekton 就是长进集群里的流水线 CRD: 每个步骤就是一个容器,调度、重试、观测全交给 Kubernetes。本章建立对象模型——TaskPipeline、 以及一次真正执行的 PipelineRun;再搞懂 params 如何把外部输入灌进 DAG。 workspaces、results 的细活留给下一章。

CRDs

Define

  • Task / Pipeline
  • steps = containers
  • params schema
Run

Instantiate

  • TaskRun
  • PipelineRun
  • controller reconciles
CLI

tkn

  • start · logs
  • describe
  • debug runs

1. 心智模型:一切都是 Kubernetes 对象

Tekton Pipelines 以一组 Custom Resource Definition (CRD) 扩展 API:Task 描述可复用动作, Pipeline 把多个 Task 连成有向无环图;真正干活的是 TaskRun / PipelineRun——它们像 Job 一样被创建一次、产生 Pod、留下状态。 控制器持续 reconcile:根据 Run 的 spec 创建 Pod、更新 status、处理失败策略。

Tekton sits on the Kubernetes API Definitions (templates) Task Pipeline stored in etcd · versioned like any manifest Runs (instances) TaskRun PipelineRun Pods step containers init / sidecars Controller watches Run objects → creates TaskRuns / Pods → writes status (Succeeded / Failed / …) Exact apiVersion (tekton.dev/v1) follows your cluster install — always check installed CRDs
图 1:定义与执行分离——Run 才是“这次构建”的真相来源。

2. Task:步骤 = 容器

spec.steps 列表中的每一项在 Pod 里对应一个容器(外加 Tekton 注入的初始化逻辑)。可用 scriptcommand; 镜像需能在你的集群里拉取到。params 声明输入,在步骤里用 $(params.NAME) 引用(以集群上 Tekton 版本文档为准)。

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: say-message
spec:
  params:
    - name: message
      type: string
      default: "hello tekton"
  steps:
    - name: echo
      image: alpine:3.19
      script: |
        echo "$(params.message)"

3. Pipeline:DAG 与 runAfter

Pipelinespec.tasks 列出多个任务实例,可用 runAfter 声明依赖; 亦支持更复杂的 when 条件(版本功能以文档为准)。taskRef 引用已安装的 Task 名称,或用 taskSpec 内联定义(适合快速试验)。

apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: build-and-notify
spec:
  params:
    - name: git-url
      type: string
  tasks:
    - name: clone
      taskRef:
        name: git-clone-task
      params:
        - name: url
          value: $(params.git-url)
    - name: unit-test
      runAfter: ["clone"]
      taskRef:
        name: unit-test-task
DAG: runAfter forms edges clone unit-test Parallel tasks possible when no runAfter conflict — scheduler figures order
图 2:边表示“数据/顺序依赖”;并行度由图结构自然给出。

4. PipelineRun:参数从哪来?

创建 PipelineRun 时,在 spec.params 传入具体值;可由人、CI 系统、或 Tekton Triggers(另立话题)根据 Git 事件注入。 参数类型常见为 stringarray;校验失败会在 Run status 里体现。

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  generateName: demo-run-
spec:
  pipelineRef:
    name: build-and-notify
  params:
    - name: git-url
      value: "https://github.com/org/sample.git"
提示:本章 YAML 使用 apiVersion: tekton.dev/v1 作为示例;实际集群可能是 beta 或不同版本号——以 kubectl api-resources 与官方迁移指南为准。

5. tkn:把运行体验拉回终端

Tekton CLI (tkn) 可列出 Task/Pipeline、启动 Run、跟踪日志,适合与 kubectl 并列放在平台工程师工具箱。

# Examples (see tkn --help for your version)
tkn pipeline start build-and-notify --showlog
tkn pipelinerun logs -f -n tekton-pipelines
Who creates the PipelineRun? Developer kubectl apply · tkn CI orchestrator creates Run via API Triggers (later) events → params PipelineRun
图 3:Run 可由人、自动化或事件网关创建——参数注入点要审计。

6. 与 Jenkins / GitLab CI 的站位差异

维度 Tekton 传统 CI
执行单元 K8s Pod / 容器 Agent / Runner VM
配置形态 YAML CRD,gitops 友好 XML / Groovy / YAML 依产品
扩展点 控制器、自定义 Task、云原生生态 插件市场、脚本自由度
Next: workspaces · results · artifacts (chapter 50) shared volume pass sources / cache
图 4:本章只搭骨架;下一章把 Task 之间的“接力棒”铺实。

7. 本章清单

  1. 在测试集群安装 Tekton Pipelines;用 kubectl get crd | findstr tekton(或 grep)确认 CRD。
  2. 应用最小 Task,再创建 TaskRun,观察 Pod 与日志。
  3. 编写含两个 Task 的 Pipeline,用 runAfter 串起来,再创建 PipelineRun 传参。
  4. 安装 tkn,用命令行跟踪一次完整运行。
  5. 阅读官方文档中 params 类型与验证规则,为下一章 workspaces 做准备。
← 上一章:Jenkins 安全 下一章:workspaces 与制品 →