什么是 Tekton
Tekton 的前身是 Knative 的子項(xiàng)目 build-pipeline,主要用來給 Kantive 的 build 模塊增加 pipeline 功能。之后獨(dú)立出來,Tekton 的目標(biāo)是一個(gè)通用的 CI/CD 工具毯盈。這是一種常見的產(chǎn)品孵化機(jī)制望迎。
目前搜骡,私有云市場占有率比較高的 CICD 工具對(duì) Kubernetes 都有所支持蚌卤,比如 Jenkins、GitLab CI幽钢。但是歉备,這些工具只是將 Kubernetes 作為其擴(kuò)展的一個(gè)方面,Kubernetes 作為新的基礎(chǔ)設(shè)施匪燕,需要原生的 CICD 方案蕾羊。
另一方面喧笔,Jenkins 的子項(xiàng)目 JenkinsX 也開始默認(rèn)使用 Tekton 作為 CI 引擎。使用云原生一等公民 CRD + Controller 實(shí)現(xiàn)的 Tekton 龟再,無疑有機(jī)會(huì)成為云原生的主流編排引擎书闸。
組成及原理
相關(guān)組成
- Tekton Pipelines
定義 Tekton 的 CRD 資源。下面會(huì)詳細(xì)介紹利凑,Task浆劲、TaskRun、Pipeline 等截碴,用來定義數(shù)據(jù)結(jié)構(gòu)梳侨。 - Tekton Operator
采用 Operator 模式蛉威,使用 Controller 監(jiān)聽 CR 數(shù)據(jù)日丹,執(zhí)行相關(guān)的動(dòng)作,是編排引擎的核心蚯嫌。 - Trigger Trigger
pipeline 觸發(fā)器哲虾,可以在 GitHub 推送或者合并 PR 后,觸發(fā)流水線择示。 - Tekton CLI
Tekton CLI 是一個(gè)與 Tekton 交互的命令行工具束凑。 - Tekton Dashboard
Tekton Pipelines 的 Web 圖形界面。 - Tekton Catalog
社區(qū)維護(hù)的 Tasks 栅盲、Pipelines 庫汪诉,降低用戶使用門檻、提高復(fù)用率谈秫。 - Tekton Hub
Tekton 的 Web 圖形界面扒寄。
核心對(duì)象
Task
Task 定義任務(wù)模板,包含一系列的 Step 步驟拟烫。每個(gè) Step 表示一個(gè)動(dòng)作该编,比如執(zhí)行命令、推送鏡像等硕淑。下面是一個(gè)示例:
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 的執(zhí)行實(shí)例课竣。通過 taskRef 引用一個(gè) Task,描述執(zhí)行參數(shù)置媳。下面是一個(gè)示例:
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 完整定義了一個(gè)流水線于樟,可以包含一系列的 Task 。下面是一個(gè)示例:
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 的執(zhí)行實(shí)例拇囊。通過 pipelineRef 引用 Pipeline 迂曲,描述執(zhí)行參數(shù)。下面是一個(gè)示例:
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 等類型谒拴。下面是一個(gè)示例:
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 中可以使用這些自定義變量,下面是一個(gè)使用 $(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
支持用戶自己實(shí)現(xiàn) Controller 涉波,讀取 Yaml 中的配置英上,執(zhí)行相關(guān)的動(dòng)作。這里 Controller 監(jiān)聽的就是 Example 類型 CR 的變動(dòng)啤覆。
工作原理
上面是一個(gè) Pipeline 的示意圖苍日。一個(gè) Pipeline 通常由多個(gè) Task 組成,這些 Task 串窗声、并執(zhí)行相恃。而每個(gè) Task 中,又有若干個(gè) Step 笨觅,Step 是串行執(zhí)行的拦耐。
同時(shí) Pipeline 還定義了輸入、輸出见剩,通常輸入 Git 倉庫杀糯,輸出鏡像。在運(yùn)行時(shí)苍苞,Pipeline 對(duì)象作為一個(gè)模板固翰,被 PipelineRun 引用,創(chuàng)建運(yùn)行實(shí)例羹呵。如下圖:
PipelineRunController 監(jiān)聽 PipelineRun 對(duì)象骂际,將 PipelineRun 中所有的 Task 構(gòu)建為一張有向無環(huán)圖,創(chuàng)建 TaskRun 担巩。而 TaskRunController 監(jiān)聽 TaskRun 對(duì)象的變化方援,根據(jù) TaskRun 引用的 Task ,創(chuàng)建 Pod 運(yùn)行 Step 涛癌。