简介

Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统。 关于Tekton, 网上可以搜到很多很多介绍文档,本文主要阐述我对Tekton的实现原理和背后的技术逻辑的一点理解。
tekton.dev

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-repotaskRef:name: pylintresources:inputs:- name: workspaceresource: my-repo
- name: test-apptaskRef:name: make-testresources:inputs:- name: workspaceresource: my-repo
- name: build-apptaskRef:name: kaniko-build-apprunAfter:- test-appresources:inputs:- name: workspaceresource: my-repooutputs:- name: imageresource: my-app-image
- name: build-frontendtaskRef:name: kaniko-build-frontendrunAfter:- test-appresources:inputs:- name: workspaceresource: my-repooutputs:- name: imageresource: my-frontend-image
- name: deploy-alltaskRef:name: deploy-kubectlresources:inputs:- name: my-app-imageresource: my-app-imagefrom:- build-app- name: my-frontend-imageresource: my-frontend-imagefrom:- build-frontend

渲染出的执行顺序为:

        |            |v            vtest-app    lint-repo/        \v          v
build-app  build-frontend\          /v        vdeploy-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: gitparams:- name: revisionvalue: v0.32.0- name: urlvalue: https://github.com/GoogleContainerTools/skaffold
  • 在Task中引用这个Resource做为输入:
kind: Task
metadata:name: build-push-kaniko
spec:inputs:resources:- name: workspacetype: gitsteps:- name: build-and-pushimage: 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/workspacecommand:- /tekton/tools/entrypointimage: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/git-init:v0.10.2name: 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/entrypointimage: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/executor@sha256:565d31516f9bb91763dcf8e23ee161144fd4e27624b257674136c71559ce4493name: 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/entrypointimage: registry.cn-shanghai.aliyuncs.com/kaniko-project-edas/imagedigestexporter:v0.10.2name: 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
  • 前置条件

    1. 在Kubernetes集群上安装Tekton
    2. 创建一个SAE应用
  • 定义一个Git资源
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:name: spring-cloud-demo
spec:type: gitparams:- name: urlvalue: 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: sourcetype: gitsteps:- name: build-and-deployimage: maven:3.3-jdk-8command: ["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-saeinputs:resources:- name: sourceresourceRef: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] ------------------------------------------------------------------------
  • 验证部署结果

在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(企业级分布式应用服务)应用生命周期研发工作,长期关注云时代微服务的部署和治理工作。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

开源 CI/CD 构建框架 TekTon 的深入剖析相关推荐

  1. Kubernetes原生CI/CD构建框架Tekton详解

    流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本文主要介绍了诞生于云原生时代的流水线框架 Tekton. 什么是流水线? 在计算机中,流水线是 ...

  2. 热门开源CI/CD解决方案 GoCD 中曝极严重漏洞,可被用于接管服务器并执行任意代码...

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全 ...

  3. 推荐一些顶级的开源CI/CD工具

    持续集成.持续交付和持续部署(CI/CD)在开发社区中已经存在多年.有些组织已经有相应的运营工具,但许多没有.对于大多数组织来说,运营团队必须像开发团队一样熟悉CI/CD工具和实践. CI/CD实践对 ...

  4. CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台

    构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台 CI/CD是什么? 持续集成(CI)/持续交付(CD)的优势 自动化部署流程图 Git Github Gi ...

  5. 云原生 CI/CD 框架 Tekton 初体验

    Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pi ...

  6. 从零到一构建CI/CD的DevOps自动化流水线,需要考虑的开源项目

    构建CI/CD的DevOps自动化流水线的步骤 1.DevOps 和 CI/CD 流水线的简要介绍 2 构建CI/CD流水线需考虑的步骤 第一步:CI/CD 框架 第二步:源代码控制管理 第三步:自动 ...

  7. 测试开发工程师成长日记010 - Jenkins中的CI/CD/CT(持续集成构建/持续交付/持续测试)

    CI(Continuous integration,持续集成) CI(Continuous integration,中文意思是持续集成)是一种软件开发时间.持续集成强调开发人员提交了新代码之后,立刻进 ...

  8. CloudBees发布“Jenkins X”:面向部署到Kubernetes中的现代云应用的CI/CD解决方案

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ James Strachan和CloudBees团队发布了开源的"Jenkins ...

  9. Kubernetes 的 CI/CD 管道概述

    An Overview of CI/CD Pipelines With Kubernetes Take a look at CI/CD approaches in a Kubernetes ecosy ...

最新文章

  1. opencv根据直线方程求交点坐标
  2. DedeCMS筛选简单实现方法不改后台源文件
  3. not in SQL语句转化为 not exists
  4. Resin的安全性ip限制
  5. 计算机原理中阶符是指,计算机原理复习题1
  6. zoj3802:easy 2048 again(状压dp)
  7. 微擎结合thinkphp5要带上uniacid_毕业季宣传品征集 | “山水万程,皆要好运”
  8. 计算机网络超详细笔记(四):介质访问控制子层
  9. 卡巴斯基KEY被列入黑名单
  10. 在Latex如何添加Visio绘图
  11. Vue项目实战篇一:实现一个完整的留言板(带前后端源码下载)
  12. ts无损剪辑合并_视频如何合并?视频合并太难?其实很简单
  13. python面向对象编程指南pdf_Python面向对象编程指南(pdf+epub+mobi+txt+azw3)
  14. 伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265
  15. NVMe Protect Information
  16. 学习Python第四天
  17. 我的 Chrome 插件集
  18. 离散小波变换(DWT)
  19. 使用U盘系统盘安装操作系统步骤
  20. 数据结构与算法A实验六图论---7-9 最短路径(并查集Dijkstra)

热门文章

  1. python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现
  2. Java的主要特性有哪些?
  3. c语言字符为0和1,//C语言:将一个由字符0和1组成的表示二进制数的字符串,转换成相应的十进制数返回。...
  4. java企业人事管理系统源码_企业人事管理系统完美版源代码 - 源码下载|行业应用软件|企业管理(财务/ERP/EIP等)|源代码 - 源码中国...
  5. python怎么播放mp3_python上播放mp3歌曲
  6. dz论坛服务器技术支持,服务器更换 升级 dz论坛首页 dz其他页面打开为空白解决方法...
  7. java synchronized 静态_Java之Synchronized修饰实例方法和静态方法
  8. ue4集合类型_UE4项目问题集合
  9. 基于php的外卖订餐系统开题报告_订餐系统开题报告.doc
  10. android 获取wifi的加密类型,wifi加密类型