Tekton是一个Kubernetes原生开源框架,用于创建持续集成和持续交付(CI/CD)系统。它还有助于通过抽象化底层实施细节,在多个云提供商或企业内部系统中进行端到端(构建、测试、部署)应用开发。
Tekton简介
Tekton最初被称为Knative Build,后来被重组为自己的开源项目,有自己的管理组织,现在是Linux基金会的项目。Tekton提供了一个集群内的容器镜像构建和部署工作流程,换句话说,它是一个持续集成(CI)和持续交付(CD)服务。它由Tekton管道和几个支持组件组成,如Tekton CLI、触发器和目录。
Tekton是一个Kubernetes本地应用程序。它在Kubernetes集群上作为扩展安装和运行,包括一套Kubernetes定制资源,定义了你可以为你的管道创建和重用的构建块。由于Tekton是一种K-native技术,所以它非常容易扩展。当你需要增加你的工作负载时,你只需向你的集群添加节点。由于其可扩展的设计和社区的贡献组件库,它也很容易定制。
Tekton是需要CI/CD系统来完成工作的开发者和为组织中的开发者建立CI/CD系统的平台工程师的理想选择。
Tekton组件
构建 CI/CD 管道是一项意义深远的工作,因此 Tekton 为每一步都提供了工具。以下是Tekton提供的主要组件。
- 管线 管道定义了一组 Kubernetes自定义资源,作为构建块,用于组装 CI/CD 管道。
- 触发器 触发器是一种Kubernetes自定义资源,允许您根据从事件有效载荷中提取的信息创建管道。例如,你可以在每次针对Git仓库的合并请求被打开时,触发管道的实例化和执行。
- CLICLI 提供名为
tkn的命令行界面,允许您从终端与 Tekton 互动。 - 仪表板仪表板是 Tekton 管线的一个基于网络的图形界面,可显示管线的执行信息。
- 目录目录是一个高质量的、由社区贡献的Tekton构件(任务、管线等)库,可用于您自己的管线。
- HubHub 是一个基于网络的图形界面,用于访问 Tekton 目录。
- 操作员Operator 是一种 Kubernetes操作员模式,允许您在 Kubernetes 集群上安装、更新、升级和删除 Tekton 项目。
- 链 Chains 是 Kubernetes 自定义资源定义(CRD)控制器,允许您在 Tekton 中管理供应链安全。它目前是一项正在进行的工作。
- 结果 结果旨在帮助用户对 CI/CD 工作负载历史进行逻辑分组,并将长期结果存储从管道控制器中分离出来。
Tekton 术语

-
步骤 步骤是 CI/CD 工作流中最基本的实体,如为 Python 网络应用程序运行一些单元测试或编译 Java 程序。Tekton 使用提供的容器镜像执行每个步骤。
-
任务 任务是按特定顺序进行的步骤的集合。Tekton 以Kubernetes pod 的形式运行任务,每个步骤都成为 pod 中的一个运行容器。
-
管线 管道是按特定顺序排列的任务的集合。Tekton收集所有任务,将它们连接成一个有向无环图(DAG),并按顺序执行该图。换句话说,它创建了一些Kubernetes豆荚,并确保每个豆荚按预期成功完成运行。

-
PipelineRun 顾名思义,PipelineRun 是管道的具体执行。
-
任务运行(TaskRun) TaskRun是一个任务的具体执行。当你选择在管道外运行一个任务时,任务运行也是可用的,你可以通过它查看任务中每个步骤执行的具体情况。
创建你自己的CI/CD流水线
开始使用Tekton的最简单方法是编写一个自己的简单管道。如果你每天都在使用Kubernetes,你可能对YAML很熟悉,这正是Tekton管道的定义方式。下面是一个克隆代码库的简单管道的例子。
首先,创建一个名为task.yaml的文件,并在你喜欢的文本编辑器中打开它。这个文件定义了你要执行的步骤。在这个例子中,那就是克隆一个版本库,所以我把这个步骤命名为克隆。该文件设置了一些环境变量,然后提供了一个简单的 shell 脚本来执行克隆。
接下来是任务。你可以把步骤看成是一个被任务调用的函数,任务设置步骤所需的参数和工作空间。
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: git-clone
spec:
workspaces:
- name: output
description: The git repo will be cloned onto the volume backing this Workspace.
params:
- name: url
description: Repository URL to clone from.
type: string
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: ""
steps:
- name: clone
image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.21.0"
env:
- name: PARAM_URL
value: $(params.url)
- name: PARAM_REVISION
value: $(params.revision)
- name: WORKSPACE_OUTPUT_PATH
value: $(workspaces.output.path)
script: |
#!/usr/bin/env sh
set -eu
CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}"
/ko-app/git-init \
-url="${PARAM_URL}" \
-revision="${PARAM_REVISION}" \
-path="${CHECKOUT_DIR}"
cd "${CHECKOUT_DIR}"
EXIT_CODE="$?"
if [ "${EXIT_CODE}" != 0 ] ; then
exit "${EXIT_CODE}"
fi
# Verify clone is success by reading readme file.
cat ${CHECKOUT_DIR}/README.md
创建第二个文件,名为pipeline.yaml ,并在你最喜欢的文本编辑器中打开它。这个文件通过设置重要的参数来定义管道,例如可以运行和处理任务的工作空间。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: cat-branch-readme
spec:
params:
- name: repo-url
type: string
description: The git repository URL to clone from.
- name: branch-name
type: string
description: The git branch to clone.
workspaces:
- name: shared-data
description: |
This workspace will receive the cloned git repo and be passed
to the next Task for the repo's README.md file to be read.
tasks:
- name: fetch-repo
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: revision
value: $(params.branch-name)
最后,创建一个名为pipelinerun.yaml 的文件,并在你喜欢的文本编辑器中打开它。这个文件实际上是运行管道。它调用管道中定义的参数(反过来,它又调用任务文件中定义的任务)。
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: git-clone-checking-out-a-branch
spec:
pipelineRef:
name: cat-branch-readme
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
params:
- name: repo-url
value: https://github.com/tektoncd/pipeline.git
- name: branch-name
value: release-v0.12.x
将你的工作安排在不同的文件中的好处是,git-clone 任务可以在多个管道中重复使用。
例如,假设你想为一个管道项目做端到端的测试,就可以使用git-clone 任务来确保你有一份需要测试的代码的新副本。
总结
只要你熟悉Kubernetes,开始使用Tekton就像采用任何其他K-native应用程序一样容易。它有很多工具可以帮助你创建管道并与你的管道对接。如果你喜欢自动化,不妨试试Tekton!