Skip to main content

Command Palette

Search for a command to run...

可能是最适合自定义的 Pipeline:Tekton

Updated
2 min read

持续集成是云原生应用的支柱技术之一,因此在交付基于云原生的一些支撑产品的时候,CICD 是一个无法拒绝的需求。为了满足这种需要,自然而然会想到对 Jenkins(X) 或者 Gitlab 进行集成,然而这两个东西虽说功能强大,却也不是为了做螺丝钉而设计的,其中包含了大量的周边功能,并非我们产品的需要,并且其接口和 Pipeline 设计也不太容易复用和提供给用户进行定制,而 Tekton 这个东西就有趣多了:

  1. Kubernetes 原生 Tekton 的所有配置都是使用 CRD 方式进行编写存储的,非常易于检索和使用。
  2. 配置和流程分离 Tekton 的 Pipeline 和配置可以分开编写,使用名称进行引用。
  3. 轻量级 核心的 Pipeline 非常轻便,适合作为组件进行集成,另外也有周边的 Dashboard、Trigger、CLI 等工具,能够进一步挖掘其潜力。
  4. 可复用、组合的 Pipeline 构建方式 非常适合在集成过程中对 Pipeline 进行定制。

安装

安装过程非常轻松:

$ kubectl apply -f \
    https://storage.googleapis.com/tekton-releases/latest/release.yaml
namespace/tekton-pipelines created
podsecuritypolicy.policy/tekton-pipelines created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-admin created
...
$ kubectl get pods -n tekton-pipelines
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-5888756f5c-t5kgx   1/1     Running   0          2m10s
tekton-pipelines-webhook-7494f6f84b-gm92g      1/1     Running   0          2m10s

概念

今天的内容主要涉及几个 CRD:

  • Task:任务环节。

  • TaskRun:Task 对象的运行参数。

  • Pipeline:Task 的组合。

  • PipelineRun:Pipeline 的运行参数。

Hello world

这里有个比 Hello world 稍稍复杂一点的小例子:

  1. 下载一个文件。

  2. 传递给下一个环节。

为什么不用官方例子呢?我想糊弄过 CI/CD/DevOps 的同学们应该都清楚,能使用容器、能执行 Shell、能获得输出、能传递文件,这几个能力加起来,足够冒充工具链小能手了。循序渐进并不适合心急的朋友们。

下载文件并显示内容

首先引入的是 Task 对象:

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: get-http-file
spec:
  steps:
    - name: show
      image: dustise/sleep
      command:
        - curl
      args:
        - "-s"
        - "https://httpbin.org/ip"

这里定义了一个 Task CRD,使用 kubectl apply -f 提交到集群,会看到 task.tekton.dev/get-http-file created 的反馈信息。

要运行这个环节,可以创建一个 TaskRun 对象:

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: get-http-file-run
spec:
  taskRef:
    name: get-http-file

提交之后,可以使用 kubectl get taskrun get-http-file-run -o yaml 来查看任务执行状况:

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
...
status:
...
  conditions:
  - message: All Steps have completed executing
    reason: Succeeded
    status: "True"
    type: Succeeded
  podName: get-http-file-run-pod-51fddd
...

这里能看到很多任务执行信息,还能看到执行这个步骤的 Pod 名称,看看它的日志:

$ kubectl logs -f get-http-file-run-pod-51fddd
{
  "origin": "165.22.223.124, 165.22.223.124"
}

看来 CICD 过程中的日志输出和命令执行基本是有保障的,那么如何完成工件的传递呢?

文件传递

通常我们都会想到使用 PVC 来进行文件存储和共享,例如:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: trans
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

首先把上面的步骤命令行改为:

command:
- curl
args:
- "-s"
- "-o"
- "/share/share.json"
- "https://httpbin.org/ip"
volumeMounts:
- name: trans
  mountPath: /share

第二个步骤就更加简单,只要显示文件内容即可:

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: display
spec:
  steps:
    - name: showcontent
      image: alpine
      command: ["cat"]
      args: ["/share/share.json"]
      volumeMounts:
        - name: trans
          mountPath: /share

这里需要使用 Pipeline 对象把步骤连接起来。

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: pipeline1
spec:
  tasks:
  - name: step1
    taskRef:
      name: download
  - name: step2
    runAfter: [step1]
    taskRef:
      name: display

这里的定义,使用 Pipeline 对象把两个步骤串联起来,其中使用 taskRef 对我们定义的 downloaddisplay 两个 Task 对象进行引用,并且使用 runAfter 数组定义先后顺序。

TaskRun 类似,Pipeline 定义之后,还需要用 PipelineRun 对象来执行一次,上面的 Task 中只定义了 volumeMounts,具体的 Volume 就要在 PipelineRun 中定义:

apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:
  name: pprun1
spec:
  pipelineRef:
    name: pipeline1
  podTemplate:
    volumes:
      - name: trans
        persistentVolumeClaim:
          claimName: trans

把 PipelineRun 提交到集群之后,就可以看到,Pipeline 开始运行,可以使用 kubectl getkubectl logs 来查看运行情况。

结果

这个项目还是很符合它的名字的描述的,真的只有 Pipeline 而已,它的最重要职责就是用 CRD 进行解耦,用 Step->Task->Pipeline 的三级形式对 CICD 中的动作进行抽象和分离;用 Task/TaskRun 以及 Pipeline/PipelineRun/Resource 的组合,把运行环节和输入输出内容进行分离。这样一来,就提供了一个稳定、可重构和组合的过程引擎,以及可定制的执行能力。

Tekton 还提供了一些其它周边项目,例如 Dashboard、Trigger 等,能给 Pipeline 项目提供一定的帮助。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts