简介html
Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于建立持续集成和交付(CI/CD)系统。 关于Tekton, 网上能够搜到不少不少介绍文档,本文主要阐述我对Tekton的实现原理和背后的技术逻辑的一点理解。 tekton.devgit
Tekton定义了Task, TaskRun, Pipeline, PipelineRun, PipelineResource 五类核心对象。Tekton经过对Task和Pipeline的抽象,咱们能够定义出任意组合的pipeline模板来完成各类各样的CICD任务。经过TaskRun,PipelineRun,PipelineResource能够将这些模板套用到各个实际的项目中。github
实现原理web
高度抽象的结构化设计使得Tekton具备很是灵活的特性。那么Tekton是如何实现workflow的流转的呢。spring
Tekton利用Kubernetes的List-Watch机制,在启动时初始化了2个Controller, PipelineRunController和TaskRunController。docker
PipelineRunController监听PipelineRun对象的变化。在它的reconcile逻辑中,将pipeline中全部的Task构建为一张有向无环图(DAG),经过遍历DAG找到当前可被调度的Task节点建立对应的TaskRun对象。api
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:
resources:
inputs: - name: workspace resource: my-repo outputs: - name: image resource: my-app-image
name: build-frontend
taskRef:
name: kaniko-build-frontend
runAfter:
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是其中最基础的一种。用法以下。
kind: PipelineResource
metadata:
name: skaffold-git-build-push-kaniko
spec:
type: git
params:
kind: Task
metadata:
name: build-push-kaniko
spec:
inputs:
resources: - name: workspace type: git
steps:
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:
command: - /tekton/tools/entrypoint image: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/executor@sha256:565d31516f9bb91763dcf8e23ee161144fd4e27624b257674136c71559ce4493 name: step-build-and-push
args:
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-d...
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: spring-cloud-demo
spec:
type: git
params:
根据SAE官方文档进行部署。
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: build-deploy-sae
spec:
inputs:
resources: - name: source type: git
steps:
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
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-hangzh..._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] ------------------------------------------------------------------------
在SAE控制台查看变动记录:
验证应用访问:
总结
区别于传统的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上还能够有不少想象空间。
做者信息:九辩,阿里巴巴高级开发工程师,负责阿里云EDAS(企业级分布式应用服务)应用生命周期研发工做,长期关注云时代微服务的部署和治理工做。