
什么是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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: echo-hello-world spec: steps: - name: echo image: ubuntu:latest command: - echo args: - "hello world" ------------------------以下暂且不看---------------------- inputs: resources: - name: workspace type: git params: - name: pathToDockerFile type: string description: The path to the dockerfile to build default: /workspace/workspace/Dockerfile outputs: resources: - name: builtImage type: image |
1 |
上面这个task中的steps后面就是各个step,这边只有一个step,该step的内容就是在ubuntu:latest容器中运行 echo "hello world"这个命令,你可以在在一个task中定义多个step,每个step还可以执行脚本,后面我会加一个执行脚本的例子。你光创建task资源,任务不会执行,需要使用taskRun才可以运行task |
Task 的 steps 字段表示当前 Task 是有哪些步骤组成的(类似与.gitlab-ci.yml里的 stages吧 ),每一个步骤具体就是基于镜像启动一个 container 执行一些操作。
2.TaskRun
Task 定义好以后是不能执行的,就像一个函数定义好以后需要调用才能执行一样。所以需要再定义一个 TaskRun 去执行 Task。下面是一个demo调用上面设置好的Task
1 2 3 4 5 6 7 |
apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata: name: echo-hello-world-task-run spec: taskRef: #在taskrun中调用task任务的方式 name: echo-hello-world |
上面这两个yaml创建后,就可以使用kubectl跑任务了
Task的step也可用于执行脚本,如下所示: (step中可执行脚本,可操作性大,可以在容器中执行你要的任务。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: generateName: step-script- spec: taskSpec:#直接定义task。而不引用task。我不建议这样使用,这样的话task无法复用。task和taskrun藕合在一块了 params: - name: PARAM default: param-value steps: - name: noshebang image: ubuntu script: echo "no shebang" - name: bash image: ubuntu env:#环境变量 - name: FOO value: foooooooo script: | #!/usr/bin/env bash set -euxo pipefail echo "Hello from Bash!" echo FOO is ${FOO} echo substring is ${FOO:2:4} for i in {1..10}; do echo line $i done - name: place-file image: ubuntu script: | #!/usr/bin/env bash echo "echo Hello from script file" > /workspace/hello chmod +x /workspace/hello - name: run-file image: ubuntu script: | #!/usr/bin/env bash /workspace/hello - name: contains-eof image: ubuntu script: | #!/usr/bin/env bash cat > file << EOF this file has some contents EOF cat file - name: node image: node script: | #!/usr/bin/env node console.log("Hello from Node!") - name: python image: python script: | #!/usr/bin/env python3 print("Hello from Python!") - name: perl image: perl script: | #!/usr/bin/perl print "Hello from Perl!" # Test that param values are replaced. - name: params-applied image: python script: | #!/usr/bin/env python3 v = '$(params.PARAM)' if v != 'param-value': print('Param values not applied') print('Got: ', v) exit(1) # Test that args are allowed and passed to the script as expected. - name: args-allowed image: ubuntu args: ['hello', 'world'] script: | #!/usr/bin/env bash [[ $# == 2 ]] [[ $1 == "hello" ]] [[ $2 == "world" ]] |
查看运行的任务情况,使用tkn命令前需要先安装tekton CLI地址, 这边简单介绍下linux下安装tekton cli:
1 2 3 4 |
# Get the tar.xz curl -LO https://github.com/tektoncd/cli/releases/download/v0.7.1/tkn_0.7.1_Linux_x86_64.tar.gz # Extract tkn to your PATH (e.g. /usr/local/bin) sudo tar xvzf tkn_0.7.1_Linux_x86_64.tar.gz -C /usr/local/bin/ |
然后运行tkn命令查看正在运行的taskrun任务:
1 |
tkn taskrun describe echo-hello-world-task-run |
但是在实际使用过程中,我们一般很少使用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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
apiVersion: tekton.dev/v1alphal kind:Pipeline metadata: name: pipeline-with-parameters spec: params: - name: context type: string description: Path to context default: /some/where/or/other tasks: - name: task-1 #定义任务1打包镜像 taskRef: name: build params: - name: pathToDockerFile value: Dockerfile - name: pathToContext value: "${params.context}" - name: task-2 #定义任务2 push镜像 taskRef: name: build-push runAfter: name: source-to-image params: - name: pathToDockerFile value: Dockerfile - name: pathToContext value: "${params.context}" |
PipelineRun
和 Task 一样 Pipeline 定义完成以后也是不能直接执行的,需要 PipelineRun 才能执行 Pipeline。PipelineRun 的主要作用是给 Pipeline 传入必要的入参,并执行 Pipeline。下面是一个Demo:
1 2 3 4 5 6 7 8 9 10 |
apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: name: pipelinerun-with-parameters spec: pipelineRef: #在pipelineRun中调用pipeline任务的方式 name: pipeline-with-parameters params: - name: "context" value: "/workspace/examples/microservices/leeroy-web" |
PipelineResource
可能你还想在 Task 之间共享资源,这就是 PipelineResource 的作用。比如我们可以把 git 仓库信息放在 PipelineResource 中。这样所有 Task 就可以共享这些信息了。
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: myck-git namespace: default spec: type: git params: - name: url #定义仓库地址 value: https://<git地址>/xxx.git - name: revision #定义分支 value: master |
总结:

- 本文固定链接: https://www.yoyoask.com/?p=4685
- 转载请注明: shooter 于 SHOOTER 发表