Tekton作为google开源出来的一个CD工具,与knative之前的build有很多相似的地方。build的功能相对来将较单一,且社区提出了很多改进的地方都由于其现有的架构设计局限而找不到解决方案。那么tekton基于build,都有哪些提升?
Tekton VS. Build
相对于build,tekton主要有以下这些改进,可能归纳的不够完整,后续再逐步补充。
- 提供了更高层抽象
knative-build只提供了build和build-template这两层,但是如果要做更高级的流水线编排就比较局限。tekton既有现有资源的映射:task->buildTemplate, taskRun->build; 又提供了更高层的抽象,pipeline和pipelineRun。pipeline可以包含多个task,这样就可以支持更加复杂的流水线逻辑。 - 支持DAG调度
tekton的pipeline中,各个task之间可以指定其运行的依赖顺序。通过解析这些依赖生成一个DAG图,在调度的时候基于该图的顺序来逐个调度task。 - Task不再使用initContainer
knative-build使用initContainer来做流水线的调度,这就导致了所有的step必须是串行的。在tekton中,task不再使用initContainer来实现各个step之间的顺序,而是通过在entrypoint中指定volume依赖来控制同一个pod中不同container的调用顺序。
实现原理
首先创建了pipelineRun之后,reconcile流程会分析里面包含的所有task,并生成DAG图。经过一系列对resources的替换处理之后,从pipeline的DAG中调度出待运行的task,并创建taskRun。pipeline reconcile逻辑会及时处理status,更新状态。
taskRun的reconcile通过查询该task的steps,也是解析resources并生成并部署pod。它也有对应的timeout逻辑,用于在执行超时的时候更新taskRun的状态。
Task调度
下面通过一个实例,手动创建一个task和taskrun,然后分析其生成的pod的yaml文件来了解其调度逻辑。
先创建一个task和taskRun。
1 | # task.yaml 和taskrun.yaml |
执行之后,可以在dashboad看到对应的两个step的状态。
接下来,分析pod的yaml文件。
1 | ~/Desktop/tekton kc get pod echo-hello-world-task-run-pod-01d042 -o yaml |
上面添加了较多的注释,应该比较好理解。通过编排pod,修改用户指定step的entrypoint,在启动用户commands前指定依赖文件,从而控制同一个pod中多个container的执行顺序。这就是task的调度中不依赖于initContainer来控制多step顺序的方案。