首页 > CI/CD > kubernetes Tekton-CI/CD 持续集成流水线
2021
02-03

kubernetes Tekton-CI/CD 持续集成流水线

什么是Tekton

Tekton 是一个功能强大且灵活的 Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统。通过抽象底层实现细节,用户可以跨多云平台和本地系统进行构建、测试和部署。

那Tekton都提供了哪些CRD(自定义资源)呢?

  • Task:顾名思义,task表示一个构建任务,task里可以定义一系列的steps(步骤),例如编译代码、构建镜像、推送镜像等,每个step实际由一个Pod执行。
  • TaskRun:task只是定义了一个模版,taskRun才真正代表了一次实际的运行,当然你也可以自己手动创建一个taskRun,taskRun创建出来之后,就会自动触发task描述的构建任务。
  • Pipeline:一个或多个task、PipelineResource以及各种定义参数的集合。
  • PipelineRun:类似task和taskRun的关系,pipelineRun也表示某一次实际运行的pipeline,下发一个pipelineRun CRD实例到kubernetes后,同样也会触发一次pipeline的构建。
  • PipelineResource:表示pipeline input资源,比如github上的源码,或者pipeline output资源,例如一个容器镜像或者构建生成的jar包等。

他大概就是以yaml文件编排应用,构建,及部署流程

下面就让我们一起来深入详细了解下Tekton到底怎么玩。 Tekton Pipeline中有5类对象,核心理念是通过定义yaml定义构建过程

  • Task:一个任务的执行模板,用于描述单个任务的构建过程
  • TaskRun:需要通过定义TaskRun任务去运行Task。
  • Pipeline:包含多个Task,并在此基础上定义input和output,input和output以PipelineResource作为交付。
  • PipelineRun:需要定义PipelineRun才会运行Pipeline。
  • PipelineResource:可用于input和output的对象集合。

1.Task

Task 就是一个任务执行模板,之所以说 Task 是一个模板是因为 Task 定义中可以包含变量,Task 在真正执行的时候需要给定变量的具体值。如果把 Tekton 的 Task 有点儿类似于定义一个函数,Task 通过 inputs.params 定义需要哪些入参,并且每一个入参还可以指定默认值。下面是一个de’mo

Task 的 steps 字段表示当前 Task 是有哪些步骤组成的(类似与.gitlab-ci.yml里的 stages吧 ),每一个步骤具体就是基于镜像启动一个 container 执行一些操作。

2.TaskRun

Task 定义好以后是不能执行的,就像一个函数定义好以后需要调用才能执行一样。所以需要再定义一个 TaskRun 去执行 Task。下面是一个demo调用上面设置好的Task

上面这两个yaml创建后,就可以使用kubectl跑任务了

Task的step也可用于执行脚本,如下所示: (step中可执行脚本,可操作性大,可以在容器中执行你要的任务。)

查看运行的任务情况,使用tkn命令前需要先安装tekton CLI地址, 这边简单介绍下linux下安装tekton cli:

然后运行tkn命令查看正在运行的taskrun任务:

但是在实际使用过程中,我们一般很少使用TaskRun,因为它只能给不一个Task 传参,Tekton提供了给多个Task同时传参的解决方案Pipeline和PipelineRun,且看下文详解,这里只是多嘴一下,这个TaskRun很少使用,稍微了解下就可以了。

Pipeline

一个 TaskRun 只能执行一个 Task,当需要编排多个 Task 的时候就需要 Pipeline 出马了。Pipeline 是一个编排 Task 的模板。Pipeline 的 params 声明了执行时需要的入参。 Pipeline 的 spec.tasks 定义了需要编排的 Task。Tasks 是一个数组,数组中的 task 并不是通过数组声明的顺序去执行的,而是通过 runAfter 来声明 task 执行的顺序。Tekton controller 在解析 CRD 的时候会解析 Task 的顺序,然后根据 runAfter 设置生成的依次树依次去执行。Pipeline 在编排 Task 的时候需要给每一个 Task 传入必须的参数,这些参数的值可以来自 Pipeline 自身的 params 设置。下面是一个Demo:

PipelineRun

和 Task 一样 Pipeline 定义完成以后也是不能直接执行的,需要 PipelineRun 才能执行 Pipeline。PipelineRun 的主要作用是给 Pipeline 传入必要的入参,并执行 Pipeline。下面是一个Demo:

PipelineResource

可能你还想在 Task 之间共享资源,这就是 PipelineResource 的作用。比如我们可以把 git 仓库信息放在 PipelineResource 中。这样所有 Task 就可以共享这些信息了。

总结:

最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。