Tekton

2024-03-14T03:03:52+08:00 | 7分钟阅读 | 更新于 2024-03-14T03:03:52+08:00

@

学习目标

学完本章你应该能够:

  1. 用自己的话讲清 Tekton “一切皆资源” 的设计哲学,以及它为什么"生在 K8s、长在 K8s"。
  2. 理清 Step / Task / Pipeline / Workspace / Trigger 五类核心概念的职责与关系。
  3. 画出一次流水线从 PipelinePipelineRunTaskRun → Pod(Step 容器)的运行时映射。
  4. 照着文档在集群里把 Tekton Pipelines / Triggers / Dashboard 装起来,并用 port-forward 打开界面。
  5. 在面试或方案评审中,把 Tekton 与 Jenkins / GitLab CI 的差异讲清楚(K8s 原生、CRD 编排、事件驱动)。

前置知识:

  • Kubernetes 基础:kubectl、Pod、CRD(自定义资源)、Namespace
  • CI/CD 基本概念:构建、测试、部署、流水线
  • 一点点 YAML 阅读能力

本章你会动手做的事:

  1. 按本文命令在 K8s 集群装好 Tekton Pipelines + Dashboard,用 port-forward 打开界面。
  2. 写一个最小 Task(用 busybox 打印 hello),创建 TaskRun 真正跑一次。
  3. 配置一个 GitHub Webhook Trigger,push 代码自动触发 PipelineRun

Tekton 基本概念

1、核心概念:K8s 原生的 CI/CD 引擎

Tekton 是 CNCF 孵化项目,以 K8s 为运行底座,将 CI/CD 流程抽象为可扩展的 API 资源。其设计哲学是 “一切皆资源”。

类比:把 Tekton 想成一家"云原生工厂"。工厂建在 Kubernetes 这片园区里,所有设备(Step/Task/Pipeline)都是园区里的标准集装箱(容器 / Pod),园区管理员(K8s 调度器)负责把集装箱摆到合适的机器上运行。所谓"一切皆资源",就是这些设备、流水线、触发器在 K8s 里全都是用 YAML 描述的 CRD,可以用 kubectl 像操作 Pod 一样操作它们。

概念描述云原生价值
Step每个 Step直接对应一个容器容器化原子操作(独立隔离)
TaskTaskPipeline的最小执行单元,其核心是 “完成一个具体的离散操作”, 每个Task对应一个Pod可复用的原子任务(K8s CRD)
PipelinePipeline通过定义 “拉取 → 构建 → 测试 → 部署” 等阶段,让软件交付像工厂流水线一样高效可控任务编排(支持并行 / 依赖)
WorkspaceWorkspace是连接 TaskPipeline的核心组件,用于跨容器、跨任务共享数据。跨任务文件共享(PVC 或 Volume)
TriggerTriggers是实现 事件驱动流水线 的核心组件,用于自动响应外部事件(如代码提交、API 调用)触发 Pipeline执行。事件驱动(Webhook/Git 推送)

下面这张图把五类核心概念的关系串起来——注意 Trigger 是"点火器",Workspace 是"共享传送带":

flowchart LR
    TRG[Trigger 事件触发] --> PL[Pipeline 流水线定义]
    PL --> TK1[Task 构建]
    PL --> TK2[Task 测试]
    PL --> TK3[Task 部署]
    TK1 --> WS[(Workspace 共享代码/产物)]
    TK2 --> WS
    TK3 --> WS
    TK1 --> S1[Step 容器]
    TK2 --> S2[Step 容器]
    TK3 --> S3[Step 容器]

2、流水线架构

image-20250314045121252

  • 多个 Step (Container) 组成一个 Task (Pod) ,多个 Task 组成 Pipeline,Pipelinerun 来运行 Pipeline
  • Task 是引用 Taskrun 来执行的,当 Pipelinerun 来运行 Pipeline 时会自动创建 Taskrun 来运行 Task
  • Task 是依次执行的,Task1 完成再去执行下面的 Task2,Task3,Task4,这里 Task 是同时执行的,最后再执行 Task5,全程只要有一个容器执行失败,流水线就会从该处终止
  • Step 也是依次执行,Step1 完成了才回去执行 Step2,如果 Step1 执行失败,则从 Step1 开始终止后续运行

白话补充:上面这段里"Task 依次执行"和"Task 同时执行"看似矛盾,本质是 Pipeline 里的 Task 默认可以并行,除非你用 runAfter 显式声明依赖顺序。所以图里 Task2/3/4 能并排跑,Task5 等它们都过了再跑。Step 则是 Task 内部严格串行的容器。

下面这张运行时映射图,把"定义(资源)“和"运行(实例)“区分开,这是理解 Tekton 最关键的一张图:

flowchart TD
    P[Pipeline 定义] -->|被运行| PR[PipelineRun 实例]
    PR -->|自动创建| TR1[TaskRun 1]
    PR -->|自动创建| TR2[TaskRun 2]
    PR -->|自动创建| TR3[TaskRun 3]
    TR1 --> POD1[Pod = Task1]
    TR2 --> POD2[Pod = Task2]
    TR3 --> POD3[Pod = Task3]
    POD1 --> C1[Step 容器 A]
    POD1 --> C2[Step 容器 B]

Tekton 部署

⚠️ 新手必踩的坑:镜像拉不下来。Tekton 的 release YAML 托管在 storage.googleapis.com,国内网络可能超时。遇到 ImagePullBackOff 时,先 kubectl describe pod 看事件,必要时把镜像转存到可访问的仓库再改 YAML。

1、安装 Tekton Pipelines

# 步骤 1:安装 Pipeline 核心组件(CRD + Controller + Webhook)
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

# 步骤 2:盯着 Pod 状态,直到全部 Running 才算装好
kubectl get pods --namespace tekton-pipelines --watch

2、安装 Tekton Triggers

# 步骤 1:安装 Triggers 控制器
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml

# 步骤 2:安装拦截器(interceptors,用于校验 Webhook 来源等)
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/latest/interceptors.yaml

3、安装 Tekton Dashboard

资源清单安装 Tekton Dashboard

要在 Kubernetes 集群上安装 Tekton Dashboard:

a)、运行以下命令安装 Tekton Dashboard:
# 只读模式
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml

这将默认以只读模式安装仪表板。

# 读写模式
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/release-full.yaml

以前的版本可以在以下网址获取previous/$VERSION_NUMBER/*.yaml,例如

kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/previous/v0.32.0/release.yaml

要以读/写模式安装,请使用 release-full.yaml。

v0.31.0 及更早版本对发布清单使用了不同的命名方案:

模式当前的v0.31.0 及更早版本
只读发布.yamltekton-dashboard-release-readonly.yaml
读/写发布-full.yamltekton-仪表板-发布.yaml
b)、使用以下命令监视安装,直到所有组件都显示Running状态:
kubectl get pods --namespace tekton-pipelines --watch

3、使用安装程序脚本安装 Tekton Dashboard

a)、以读/写模式安装最新版本
curl -sL https://raw.githubusercontent.com/tektoncd/dashboard/main/scripts/release-installer | \
  bash -s -- install latest --read-write
b)、安装时可以访问命名空间的子集,而不是完整的集群访问权限:
curl -sL https://raw.githubusercontent.com/tektoncd/dashboard/main/scripts/release-installer | \
  bash -s -- install latest --read-write --tenant-namespaces tenant-namespace1,tenant-namespace2

这会将--namespacesarg 添加到仪表板部署中,并在每个指定的命名空间中创建 RoleBindings,并将适当的角色授予仪表板服务帐户。

c)、安装并支持从外部源加载日志:
curl -sL https://raw.githubusercontent.com/tektoncd/dashboard/main/scripts/release-installer | \
  bash -s -- install latest --read-write --external-logs <logs-provider-url>

访问 Tekton Dashboard

可以使用以下命令通过端口转发来访问 Tekton Dashboard:

# 只绑定了回环网卡,只能在127.0.0.1:9097访问
kubectl port-forward -n tekton-pipelines service/tekton-dashboard 9097:9097

# 显式指定绑定到所有接口(0.0.0.0)
kubectl port-forward -n tekton-pipelines --address 0.0.0.0 service/tekton-dashboard 9097:9097

⚠️ 新手必踩的坑:别把 Dashboard 绑到 0.0.0.0 就直接暴露公网。9097 没有鉴权,绑全网卡等于把你的 CI/CD 控制台敞开给全网。生产环境务必走 Ingress + 认证,或只用本机 port-forward。

然后在浏览器中打开 http://localhost:9097 即可访问 Tekton Dashboard。

4、安装 Tekton cli

下载地址:https://github.com/tektoncd/cli/releases

自测题与动手练习

自测题(合上书能答出来,才算懂):

  1. Tekton 为什么说"一切皆资源”?它的运行底座是什么?

    答:Step/Task/Pipeline/Trigger 在 K8s 里全都是 CRD,用 YAML 描述、用 kubectl 操作;运行底座是 Kubernetes(每个 Task 跑成一个 Pod)。

  2. Step / Task / Pipeline 三者是什么关系?一个 Task 对应几个 Pod?

    答:多个 Step(容器)组成一个 Task,多个 Task 组成 Pipeline;一个 Task 对应一个 Pod,Pod 里每个 Step 是一个容器。

  3. Task 和 Pipeline 是怎么被真正"运行"起来的?

    答:用 TaskRun 运行单个 Task,用 PipelineRun 运行 Pipeline;PipelineRun 会自动为每个 Task 创建对应的 TaskRun。

  4. Workspace 解决什么问题?Trigger 解决什么问题?

    答:Workspace 跨容器 / 跨 Task 共享代码与产物(PVC/Volume);Trigger 实现事件驱动,让 Git 推送等外部事件自动点火流水线。

  5. 流水线失败时如何终止?Step 和 Task 的失败传播有什么不同?

    答:某容器失败,所在 Task 失败;Pipeline 从该处终止(后续 Task 不再跑);Task 内 Step 严格串行,Step1 失败则 Step2 起不再执行。

动手练习(建议真做一遍):

  1. 按本文命令在集群装好 Tekton Pipelines + Dashboard,用 kubectl port-forward 打开 http://localhost:9097,确认界面能看到。
  2. 写一个最小 Task(比如用 busybox 打印 hello tekton),然后创建 TaskRun 真正跑一次,在 Dashboard 或 kubectl logs 里看输出。
  3. 配置一个 GitHub Webhook Trigger,push 代码自动触发一次 PipelineRun,验证事件驱动链路打通。

本章小结

  • Tekton 是 K8s 原生的 CI/CD 框架,核心哲学是"一切皆资源”——所有概念都是 CRD。
  • 五类核心概念:Step(容器)→ Task(Pod)→ Pipeline(编排),Workspace 做跨任务数据共享,Trigger 做事件驱动点火。
  • 运行时映射是重点:PipelinePipelineRun → 自动创建 TaskRun → 每个 Task 一个 Pod → Pod 内 Step 串行容器。
  • 部署就是几条 kubectl apply,但注意国内镜像拉取与 Dashboard 公网暴露两个坑。
  • 下一篇可深入写真正的 Task / Pipeline YAML,并接上 Trigger 完成"push 即构建部署"的闭环。
About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!