开源 CI/CD 构建框架 TekTon 的深入剖析
ccwgpt 2024-10-13 01:35 29 浏览 0 评论
简介
Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统。关于Tekton, 网上可以搜到很多很多介绍文档,本文主要阐述我对Tekton的实现原理和背后的技术逻辑的一点理解。
Tekton定义了Task, TaskRun, Pipeline, PipelineRun, PipelineResource 五类核心对象。Tekton通过对Task和Pipeline的抽象,我们可以定义出任意组合的pipeline模板来完成各种各样的CICD任务。
通过TaskRun,PipelineRun,PipelineResource可以将这些模板套用到各个实际的项目中。
实现原理
高度抽象的结构化设计使得Tekton具有非常灵活的特性。那么Tekton是如何实现workflow的流转的呢。
Tekton利用Kubernetes的List-Watch机制,在启动时初始化了2个Controller, PipelineRunController和TaskRunController。
PipelineRunController监听PipelineRun对象的变化。在它的reconcile逻辑中,将pipeline中所有的Task构建为一张有向无环图(DAG),通过遍历DAG找到当前可被调度的Task节点创建对应的TaskRun对象。
TaskRunController监听TaskRun对象的变化。在它的reconcile逻辑中将TaskRun和对应Task转化为可执行的Pod,由kubernetes调度执行。利用Kubernetes的OwnerReference机制,pipelinerun own taskrun, taskrun own pod。pod状态变更时触发taskrun的reconcile逻辑,taskrun状态变更时触发pipelinerun的reconcile逻辑。
DAG支持
Tekton对DAG的支持相对比较简单。在Tekton中一个Pipeline就是一张DAG,Pipeline中的多个Task可是DAG中的节点。Task默认并发执行,可以通过 RunAfter 和 From 关键字控制执行顺序。
示例:
- name: lint-repo
taskRef:
name: pylint
resources:
inputs:
- name: workspace
resource: my-repo
- name: test-app
taskRef:
name: make-test
resources:
inputs:
- name: workspace
resource: my-repo
- name: build-app
taskRef:
name: kaniko-build-app
runAfter:
- test-app
resources:
inputs:
- name: workspace
resource: my-repo
outputs:
- name: image
resource: my-app-image
- name: build-frontend
taskRef:
name: kaniko-build-frontend
runAfter:
- test-app
resources:
inputs:
- name: workspace
resource: my-repo
outputs:
- name: image
resource: my-frontend-image
- name: deploy-all
taskRef:
name: deploy-kubectl
resources:
inputs:
- name: my-app-image
resource: my-app-image
from:
- build-app
- name: my-frontend-image
resource: my-frontend-image
from:
- build-frontend
渲染出的执行顺序为:
| |
v v
test-app lint-repo
/ \
v v
build-app build-frontend
\ /
v v
deploy-all
相比于Argo等专注在workflow的项目而言,Tekton支持的任务编排方式是非常有限的。常见的循环,递归,重试,超时等待等策略都是没有的。
- 条件判断
Tekton支持 condition 关键字来进行条件判断。Condtion只支持判断当前Task是否执行,不能作为DAG的分支条件来进行动态DAG的渲染。
* condition检查失败(exitCode != 0),task不会被执行,pipelineRun状态不会因为condition检查失败而失败。
* 多个条件之间 “与” 逻辑关系
PipelineResource在Task间数据交换
作为CICD的工具,代码在什么时候Clone到WorkSpace中,如何实现的?Tekton中抽象了PipelineResource进行任务之间的数据交换,GitResource是其中最基础的一种。用法如下。
- 声明一个Git类型的PipelineResource:
kind: PipelineResource
metadata:
name: skaffold-git-build-push-kaniko
spec:
type: git
params:
- name: revision
value: v0.32.0
- name: url
value: https://github.com/GoogleContainerTools/skaffold
- 在Task中引用这个Resource做为输入:
kind: Task
metadata:
name: build-push-kaniko
spec:
inputs:
resources:
- name: workspace
type: git
steps:
- name: build-and-push
image: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/executor:v0.17.1
- 代码会被clone在/workspace目录。
Tekton是如何处理这些PipelineResource的呢,这就要从Taskrun Controller如何创建Pod说起。
Tekton中一个TaskRun对应一个Pod,每个Pod有一系列init-containers和step-containers组成。init-container中完成认证信息初始化,workspace目录初始化等初始化工作。
在处理step-container时,会根据这个Task引用的资源 Append或者Insert一个step-container来处理对应的输和输出,如下图所示。
Task中Step执行顺序控制
Tekton源自Knative Build,在Knative Build中使用Init-container来串联Steps保证Steps顺序执行,在上面的分析中我们知道Tekton是用Containers来执行Steps,Pod的Containers是并行执行的,Tekton是如何保证Steps执行顺序呢?
这是一个TaskRun创建的Pod的部分描述信息,可以看到所有的Step都是被/tekton/tools/entrypoints封装起来执行的。-wait_file指定一个文件,通过监听文件句柄,在探测到文件存在时执行被封装的Step任务。-post_file指定一个文件,在Step任务完成后创建这个文件。通过文件序列/tekton/tools/${index}来对Step进行排序。
- args:
- -wait_file
- /tekton/tools/0
- -post_file
- /tekton/tools/1
- -termination_path
- /tekton/termination
- -entrypoint
- /ko-app/git-init
- --
- -url
- https://github.com/GoogleContainerTools/skaffold
- -revision
- v0.32.0
- -path
- /workspace/workspace
command:
- /tekton/tools/entrypoint
image: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/git-init:v0.10.2
name: step-git-source-skaffold-git-build-push-kaniko-rz765
- args:
- -wait_file
- /tekton/tools/1
- -post_file
- /tekton/tools/2
- -termination_path
- /tekton/termination
- -entrypoint
- /kaniko/executor
- --
- --dockerfile=Dockerfile
- --destination=localhost:5000/leeroy-web
- --context=/workspace/workspace/examples/microservices/leeroy-web
- --oci-layout-path=$(inputs.resources.builtImage.path)
command:
- /tekton/tools/entrypoint
image: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/executor@sha256:565d31516f9bb91763dcf8e23ee161144fd4e27624b257674136c71559ce4493
name: step-build-and-push
- args:
- -wait_file
- /tekton/tools/2
- -post_file
- /tekton/tools/3
- -termination_path
- /tekton/termination
- -entrypoint
- /ko-app/imagedigestexporter
- --
- -images
- '[{"name":"skaffold-image-leeroy-web-build-push-kaniko","type":"image","url":"localhost:5000/leeroy-web","digest":"","OutputImageDir":"/workspace/output/builtImage"}]'
command:
- /tekton/tools/entrypoint
image: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/imagedigestexporter:v0.10.2
name: step-image-digest-exporter-lvlj9
实践
使用Tekton构建代码并部署到SAE
Serverless 应用引擎( SAE ) 是阿里云上一款面向应用的 Serverless PaaS 平台,帮助 PaaS 层用户免运维 IaaS,按需使用,按量计费,实现低门槛微服务应用上云,有效解决成本及效率问题。支持 Spring Cloud、Dubbo 和 HSF 等流行的开发框架,真正实现了 Serverless 架构和微服务架构的完美融合。
接下来将使用Tekton部署一个Spring Cloud微服务应用到SAE平台。
示例中的演示代码地址:https://github.com/alicloud-demo/spring-cloud-demo
前置条件
- 在Kubernetes集群上安装Tekton
- 创建一个SAE应用
- 定义一个Git资源
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: spring-cloud-demo
spec:
type: git
params:
- name: url
value: https://github.com/alicloud-demo/spring-cloud-demo
- 定义构建和部署Task
根据SAE官方文档进行部署。
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: build-deploy-sae
spec:
inputs:
resources:
- name: source
type: git
steps:
- name: build-and-deploy
image: maven:3.3-jdk-8
command: ["mvn", "clean", "package", "-f", "source", "toolkit:deploy", "-Dtoolkit_profile=toolkit_profile.yaml", "-Dtoolkit_package=toolkit_package.yaml", "-Dtoolkit_deploy=toolkit_deploy.yaml"]
securityContext:
runAsUser: 0
- 定义TaskRun运行任务
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
name: build-deploy-sae
spec:
taskRef:
name: build-deploy-sae
inputs:
resources:
- name: source
resourceRef:
name: spring-cloud-demo
- 导入到kubernetes中运行
kubectl apply -f source-2-service-taskrun.yaml
- 查看日志
kubectl logs build-deploy-sae-pod-85xdk step-build-and-deploy
部署日志:
[INFO] Start to upload [provider3-1.0-SNAPSHOT.jar] using [Sae uploader].
[INFO] [##################################################] 100.0%
[INFO] Upload finished in 3341 ms, download url: [https://edas-hz.oss-cn-hangzhou.aliyuncs.com/apps/K8S_APP_ID/37adb12b-5f0c-4711-98ec-1f1e91e6b043/provider3-1.0-SNAPSHOT.jar]
[INFO] Begin to trace change order: e2499b9a-6a51-4904-819c-1838c1dd62cb
[INFO] PipelineName: Batch: 1, PipelineId:f029314a-88bb-450b-aa35-7cc550ff1329
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Waiting...
[INFO] Deploy application successfully!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32:41 min
[INFO] Finished at: 2020-04-15T10:09:39+00:00
[INFO] Final Memory: 47M/190M
[INFO] ------------------------------------------------------------------------
总结
区别于传统的CICD工具(Jenkins),Tekton是一套构建CICD系统的框架。Tekton不能使你立即获得CICD的能力。但是基于Tekton可以设计出各种花式的构建部署流水线。得益于Tekton良好的抽象,这些设计出的流水线可以作为模板在多个组织,项目间共享。Tekton源自Knative的Build-Template项目,设计之初的一个重要目标就是使人们能够共享和重用构成pipeline的组件,以及Pipeline本身。在Tekton的RoadMap中Tekton Catelog就是为了实现这一目标而提出的。
区别于Argo这种基于Kubernetes的Workflow工具,Tekton在工作流控制上的支持是比较弱的。一些复杂的场景比如循环,递归等都是不支持的。更不用说Argo在高并发和大集群调度下的性能优化。这和Tekton的定位有关,Tekton定位于实现CICD的框架,对于CICD不需要过于复杂的流程控制。大部分的研发流程可以被若干个最佳实践来覆盖。而这些最佳实践应该也必须可以在不同的组织间共享,为此Tekton设计了PipelineResource的概念。PipelineResource是Task间交互的接口,也是跨平台跨组织共享重用的组件,在PipelineResource上还可以有很多想象空间。
相关推荐
- NestJS入门教程系列一
-
介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...
- 【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...
- Appium原理精讲
-
目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...
- Kubernetes最小部署单元Pod
-
一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...
- 最常用的四种跨域解决方案
-
前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...
- Bolt.New —— 全栈AI Web自动编程
-
Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...
- Nodejs Express新手教程&高手进阶
-
NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...
- Express.js 创建Node.js Web应用
-
Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...
- JavaScript 的 Express.js 功能及应用场景详解
-
Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...
- nodejs的express4文件下载
-
在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...
- Express 系列:快速生成一个项目
-
系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...
- nodejs的express自动生成项目框架
-
nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...
- express开发(一)简介与搭建
-
上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...
- Vue+Echarts可视化大屏系统后端框架搭建(附代码)
-
各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...
- Shopify电商API接口开发
-
Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)