什么是 Tekton
Tekton 的前身是 Knative 的子项目 build-pipeline,主要用来给 Kantive 的 build 模块增加 pipeline 功能。之后独立出来,Tekton 的目标是一个通用的 CI/CD 工具。这是一种常见的产品孵化机制。
目前,私有云市场占有率比较高的 CICD 工具对 Kubernetes 都有所支持,比如 Jenkins、GitLab CI。但是,这些工具只是将 Kubernetes 作为其扩展的一个方面,Kubernetes 作为新的基础设施,需要原生的 CICD 方案。
另一方面,Jenkins 的子项目 JenkinsX 也开始默认使用 Tekton 作为 CI 引擎。使用云原生一等公民 CRD + Controller 实现的 Tekton ,无疑有机会成为云原生的主流编排引擎。
组成及原理
相关组成
- Tekton Pipelines
定义 Tekton 的 CRD 资源。下面会详细介绍,Task、TaskRun、Pipeline 等,用来定义数据结构。 - Tekton Operator
采用 Operator 模式,使用 Controller 监听 CR 数据,执行相关的动作,是编排引擎的核心。 - Trigger Trigger
pipeline 触发器,可以在 GitHub 推送或者合并 PR 后,触发流水线。 - Tekton CLI
Tekton CLI 是一个与 Tekton 交互的命令行工具。 - Tekton Dashboard
Tekton Pipelines 的 Web 图形界面。 - Tekton Catalog
社区维护的 Tasks 、Pipelines 库,降低用户使用门槛、提高复用率。 - Tekton Hub
Tekton 的 Web 图形界面。
核心对象
Task
Task 定义任务模板,包含一系列的 Step 步骤。每个 Step 表示一个动作,比如执行命令、推送镜像等。下面是一个示例:
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: task-with-parameters
spec:
params:
- name: flags
type: array
- name: someURL
type: string
steps:
- name: build
image: my-builder
args: ["build", "$(params.flags[*])", "url=$(params.someURL)"]
TaskRun
TaskRun 是 Task 的执行实例。通过 taskRef 引用一个 Task,描述执行参数。下面是一个示例:
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: run-with-parameters
spec:
taskRef:
name: task-with-parameters
params:
- name: flags
value:
- "--set"
- "arg1=foo"
- "--randomflag"
- "--someotherflag"
- name: someURL
value: "http://google.com"
Pipeline
Pipeline 完整定义了一个流水线,可以包含一系列的 Task 。下面是一个示例:
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: pipeline-with-parameters
spec:
params:
- name: context
type: string
description: Path to context
default: /some/where/or/other
tasks:
- name: build-skaffold-web
taskRef:
name: build-push
params:
- name: pathToDockerFile
value: Dockerfile
- name: pathToContext
value: "$(params.context)"
PipelineRun
PipelineRun 是 Pipeline 的执行实例。通过 pipelineRef 引用 Pipeline ,描述执行参数。下面是一个示例:
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: pipelinerun-with-parameters
spec:
pipelineRef:
name: pipeline-with-parameters
params:
- name: "context"
value: "/workspace/examples/microservices/leeroy-web"
PipelineResource
PipelineResource 定义 Task 的输入输出,包括 Git、Pull Request、Image、Cluster、Storage 等类型。下面是一个示例:
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: test-cluster
spec:
type: cluster
params:
- name: url
value: https://10.10.10.10
- name: username
value: admin
在 Task 中可以使用这些自定义变量,下面是一个使用 $(resources.inputs.test-cluster.name) 的示例:
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: deploy-image
namespace: default
spec:
resources:
inputs:
- name: test-cluster
type: cluster
steps:
- name: deploy
image: image-with-kubectl
command: ["bash"]
args:
- "-c"
- kubectl --kubeconfig
/workspace/$(resources.inputs.test-cluster.name)/kubeconfig --context
$(resources.inputs.test-cluster.name) apply -f /workspace/service.yaml'
Run
apiVersion: tekton.dev/v1alpha1
kind: Run
metadata:
name: my-example-run
spec:
ref:
apiVersion: example.dev/v1alpha1
kind: Example
name: my-example-task
支持用户自己实现 Controller ,读取 Yaml 中的配置,执行相关的动作。这里 Controller 监听的就是 Example 类型 CR 的变动。
工作原理
上面是一个 Pipeline 的示意图。一个 Pipeline 通常由多个 Task 组成,这些 Task 串、并执行。而每个 Task 中,又有若干个 Step ,Step 是串行执行的。
同时 Pipeline 还定义了输入、输出,通常输入 Git 仓库,输出镜像。在运行时,Pipeline 对象作为一个模板,被 PipelineRun 引用,创建运行实例。如下图:
PipelineRunController 监听 PipelineRun 对象,将 PipelineRun 中所有的 Task 构建为一张有向无环图,创建 TaskRun 。而 TaskRunController 监听 TaskRun 对象的变化,根据 TaskRun 引用的 Task ,创建 Pod 运行 Step 。
网友评论