第五部分:Tekton K8S 原生 CI/CD 实践指南

📝 前言

在云原生时代,CI/CD 工具的核心诉求 是与 Kubernetes 的原生生态无缝衔接。

传统的 Jenkins 需要依赖外部 Agent、插件体系复杂、集群化部署困难,而 Tekton 则完全基于 Kubernetes CRD 构建,将流水线定义、执行、状态追踪都交由 K8S 控制器管理。

🧭 背景介绍

在云原生持续交付的演进中,CI/CD 系统经历了三个阶段:

阶段 特点 代表工具
传统阶段 独立部署,Agent 固定,依赖主从结构 Jenkins、TeamCity
云托管阶段 平台托管,易用但可扩展性有限 GitHub Actions、GitLab CI
云原生阶段 基于 Kubernetes,声明式、可扩展、事件驱动 Tekton、Argo Workflows

Tekton 正是这一第三阶段的代表 —— Kubernetes 原生的 CI/CD 基础设施框架

📋 前提条件

  • 已部署 Kubernetes 集群

PS:可参看之前文章一键部署:第四部分:使用 sealos 部署集群

🚀 本章小节

1️⃣ Tekton 架构与核心概念

Tekton 并不是单一组件,而是一组可组合的 CRD 控制器集合:

概念 说明
Task 可复用的任务定义,例如构建镜像、运行测试、推送镜像等
Pipeline 由多个 Task 串联或并行执行的完整流水线
PipelineRun 某次具体的流水线运行实例
Workspace 任务之间共享的持久卷或工作目录
Trigger 监听外部事件(如 Git Push、Webhook)触发流水线
Result 用于传递 Task 输出结果

Tekton 的所有执行过程都是 K8S 原生的 Pod 调度,这意味着它与容器运行时、命名空间隔离、ServiceAccount 权限模型无缝结合。

2️⃣ 安装Tekton

这里直接使用官方最新版本进行安装:

1
kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

3️⃣ 安装 Tekton Dashboard(可选)

这里还可以安装一个可视化的管理面板,当然如果不需要直接通过YAML也是可以创建流水线的:

1
kubectl apply -f https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml

安装成功后可以通过Ingress或者NodePort进行暴露访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Ingress 暴露,浏览器访问:http://tekton.192.168.10.3.nip.io
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tekton-ingress
namespace: tekton-pipelines
spec:
ingressClassName: nginx
rules:
- host: tekton.192.168.10.3.nip.io
http:
paths:
- backend:
service:
name: tekton-dashboard
port:
number: 9097
path: /
pathType: Prefix

# Service NodePort 暴露,浏览器访问:http://节点IP:9097
kubectl patch svc -n tekton-pipelines tekton-dashboard -p '{"spec":{"type":"NodePort","ports":[{"port":9097,"nodePort":9097}]}}'

4️⃣ 编写第一个 Task:构建镜像

Tekton 的 Task 是最基本的构建单元。

下面是一个使用 Kaniko 构建 Docker 镜像的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: build-image
spec:
params:
- name: IMAGE
type: string
description: "镜像地址(含Tag)"
workspaces:
- name: source
description: "源码所在的 workspace,用于构建镜像"
steps:
- name: build
image: registry.cn-heyuan.aliyuncs.com/lusyoe/kaniko-executor:latest
args:
- "--destination=$(params.IMAGE)"
- "--context=$(workspaces.source.path)"
- "--dockerfile=$(workspaces.source.path)/Dockerfile"

Kaniko 不依赖 docker.sock,适用于容器内构建环境。

正式使用建议是直接使用社区已经做好的 Kaniko Task

1
2
kubectl apply -f \
https://raw.githubusercontent.com/tektoncd/catalog/main/task/kaniko/0.7/kaniko.yaml

5️⃣ 定义 Pipeline:串联多个任务

流水线通过引用多个 Task 实现自动化构建。

先安装官方的 git-clone task:

1
2
kubectl apply -f \
https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.6/git-clone.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: simple-git-pipeline
spec:
workspaces:
- name: shared-workspace
params:
- name: repo-url
type: string
- name: branch
type: string
default: main
- name: image
type: string
tasks:
# 下载源码
- name: clone-source
taskRef:
name: git-clone
params:
- name: url
value: $(params.repo-url)
- name: revision
value: $(params.branch)
workspaces:
- name: output
workspace: shared-workspace
# 构建镜像
- name: build
runAfter:
- clone-source
taskRef:
name: build-image # 也可以直接使用 kaniko
params:
- name: IMAGE
value: $(params.image)
workspaces:
- name: source
workspace: shared-workspace

上面的示例中:

  1. 第一个 Task 拉取代码(可复用官方 git-clone 任务)
  2. 第二个 Task 构建镜像并推送到镜像仓库。

此时流水线还没有运行,只是创建出来了一个模板。

5️⃣ 执行 PipelineRun

Tekton 运行流水线的实例叫 PipelineRun

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: simple-git-pipeline-run
spec:
pipelineRef:
name: simple-git-pipeline
params:
- name: repo-url
value: https://github.com/google/docsy-example.git
- name: image
value: lusyoe/example:latest
workspaces:
- name: shared-workspace
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local-path
resources:
requests:
storage: 1Gi

执行完成后,Tekton 将:

  1. 克隆仓库到工作目录;
  2. 使用 Buildah 构建 Docker 镜像;
  3. 推送到指定镜像仓库(需提前配置 registry 登录权限,如通过 Secret 注入)。

6️⃣ 最佳实践建议

  • 使用 Tekton Catalog

    Tekton 官方维护了 tektoncd/catalog,可直接复用任务模板(如 git-clone、kaniko、kubectl)。

  • 与 GitOps 结合

    Tekton 负责构建镜像,ArgoCD 负责部署发布,形成 CI + CD 闭环。

  • 参数化多环境管理

    通过 PipelineRun.params 定义 dev / staging / prod 环境变量,实现一套流水线多环境复用。

✅ 总结

Tekton 以 Kubernetes 原生 CRD + Controller 模式 实现了构建即声明、执行即资源的理念。

它的最大特点是“无侵入”:无需额外 Agent,无需守护进程,所有任务天然分布式、可伸缩。

所需的代价可能就是学习成本了~