Tekton 入门

术语解释

Cloud Native

​ 云原生是一种软件开发方法,其中应用程序被分解为微服务,这些微服务被打包到容器中,容器在云中动态编排以优化资源利用

Continuous Delivery

​ 持续交付是一种软件开发实践,团队可以安全、快速、可持续地向用户发布软件变更。

Tekton

​ Tekton 是一个用于创建持续交付系统的开源 kubernetes 原生的框架。你可以使用 tekton 跨多个云提供商或混合环境构建,测试和部署。Tekton 通过抽象出复杂的kubenetes概念和实现细节来简化应用程序管理。它提供了用于声明持续交付管道的 Kubernetes 自定义资源。

基本构建块

    其中Task、TaskRun、Pipeline、PipelineRun、PipelineResource、Condition作为其核心CRD,这里主要介绍它们。

  • Task: 定义构建任务,它由一系列有序steps构成。每个step可以定义输入和输出,且可以将上一个step的输出作为下一个step的输入。每个step都会由一个container来执行。

    • 是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样
  • TaskRun: Task用于定义具体要做的事情,并不会真正的运行,而TaskRun就是真正的执行者,并且会提供执行所需需要的参数,一个TaskRun就是一个Pod。

  • Pipeline: 顾名思义就是流水线,它由一系列Tasks组成。就像Task中的step一样,上一个Task的输出可以作为下一个Task的输入。

  • PipelineRun: Pipeline的实际执行,创建后会创建Pod来执行Task,一个PipelineRun中有多个Task。

  • PipelineResource: 主要用于定义Pipeline的资源,常见的如Git地址、Docker镜像等。

  • Condition: 它主要是在Pipeline中用于判断的,Task的执行与否通过Condition的判断结果来决定。

Tips: PipelineResource和Condition都会被废弃。但是在低版本中还是会继续使用,所以这里会简单介绍一下。

image-20230301151952643

Step

Step 是 tekton中最小的单元 step = Container

​ 它相当一个容器在它指定的输入上执行,以产生输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
steps:
	- name: deploy-app
		image: foo/base-image:2.7
		env:
			- name: API_KEY
			valueFrom:
						secretKeyRef:
							name:	secure-properties
							key: apiKey
		script: |
				cloud login -a $(params.api-url)

Task

运行一系列容器的一系列步骤 task = pod(k8s)是存在 k8s 中一种自定义资源

​ 它在 kubernetes 集群上向上执行, Task 中的所有 Step 都可以访问共享工作区。该工作区作为隐式卷安装到端口。Task使用TaskRun执行,TaskRun提供 Task所需要的参数和其他资源。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: deploy-to-my-awesome-cloud
spec:
	params:
		- name: api-url
		  default: cloud.con
  steps:
	- name: deploy-app
		image: foo/base-image:2.7
		script: |
				cloud login -a $(params.api-url)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  generateName: deploy-to-my-awesome-cloud-
spec:
	params:
		- name: api-url
		  default: gcp.com
	taskRef:
		- name: deploy-to-my-awesome-cloud

Pipelines

​ 运行一组 Kuberbetes pod 的 Tekton Task的集合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: project-pipeline
spec:
  params:
  - name: api-url
  - name: cloud-region
  tasks:
    - name: clone
      taskRef:
        name: git-clone
    - name: build
      taskRef:
        - build
      runAfter:
      	- clone
    - name: deploy
    	taskRef:
    			name: deploy
    	runAfter:
    			- build
  script: |
				cloud login -a $(params.api-url) -r $(params.cloud-region)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
	generateName: project-pipeline-run-
spec:
	params:
		- name: api-url
			value: gcp.com
		- name: cloud-region
			value: us-east
	pipelineRef:
		- name: project-pipeline

Triggers

触发自动调用 pipeline :如在推送代码 ,提交或创建拉取请求时触发

Trigger Template(触发器模版)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: trigger-template
spec:
  resourcetemplates:
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    spec:
      pipelineRef:
        name: trigger-pipeline

Trigger Binding(触发器绑定)

1
2
3
4
5
6
7
8
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: trigger-binding
spec: 
  params:
  - name: git-repo-url
    value: $(event.repository.git-repo-url)

Event Listeners(事件侦听器)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: event-listener
spec:
  serviceAccountName: tekton-robot
  triggers:
    - name: event-trigger 
      bindings:
      - ref: trigger-binding
      template:
        ref: trigger-template

Tekton 如何运作

运行

​ 粗略地说,在其核心,Tekton Pipelines 通过包装每个你的Step。更具体地说,Tekton Pipelines 在步骤容器中注入一个二进制文件,该二进制文件在以下情况下执行您指定的命令 系统已准备就绪。

​ Tekton Pipelines 使用 Kubernetes 注释跟踪管道的状态。 这些注释以表单的形式投影在每个步骤容器内 使用 Kubernetes 向下 API 的文件。 二进制文件密切监视投影文件,并且只会 如果特定批注显示为文件,请启动提供的命令。为 例如,当您要求 Tekton 在一个任务中连续运行两个步骤时, 注入第二步容器的二进制文件将 闲置地等待,直到注释报告第一步容器 已成功完成。

​ 此外,Tekton Pipelines 会安排一些容器自动运行。 步骤前后的容器,以便支持特定的内置 功能,例如检索输入资源和上传 输出到 Blob 存储解决方案。您可以将他们的运行状态跟踪为 通过任务运行和管道运行。该系统还执行一个数字 在运行步骤之前设置环境的其他操作

小结

  • Task- 适用于更简单的工作负载,例如运行测试、lint 或构建 Kaniko 缓存。单个执行在单个中执行 Kubernetes Pod,使用单个磁盘,通常保持简单。Task
  • Pipeline- 适用于复杂的工作负载,例如静态分析,以及测试、构建和部署复杂的项目。