开源 CI/CD 构建框架 TekTon 的深入剖析

简介

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel VBA 巧用自定义函数进行数组去重

目录 一. Dictionary方法删除重复项二. Collection 方法删除重复项三. 使用这两个函数1. RemoveDupesDict 函数调用示例:2. RemoveDupesColl函数调用示例:本贴将展示两种从数组中删除重复项的方法。 第一种方法使用字典,第二种方法使用集合。每种方法都有优点和缺点,但都能…

分享实录 | 企业CICD规模化落地浅析

【以下为分享实录,有删节】 今天分享的题目是《企业CICD规模化落地》,因此我们不会侧重讲解CICD是什么以及怎样做CICD,而是你已经知道怎样“玩转”CICD了,要如何在一个比较大的企业中规模化地落地。 研发流程与持续交付简析 持…

mysq5.7 和mysql8不区分大小写和不开启sql严格模式

mysq5.7 [mysqld] #不区分大小写 lower_case_table_names 1 #不开启sql严格模式 sql_mode "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"mysq8 [mysqld] #不区分大小写 lower_case_table_names 1 #不开启sql严格模式 sql_mode STRICT_TRANS_TABLES,NO_ENGINE_…

大湾区网络安全大会开幕在即,五个看点揭秘

11月28日至29日,首个由国家部委指导、地方政府主办的网络安全大会“湾区创见2020网络安全大会”将在深圳国际会展中心拉开序幕。 本届大会由公安部、国家密码管理局指导,深圳市人民政府主办,以“新基建 新安全”为主题,聚焦5G、人…

重磅发布:阿里云云安全中心一键防勒索功能上线!

5月6日,阿里云云安全中心重磅发布一键防勒索功能,致力于帮助客户实现对勒索病毒的一键式纵深防御。 勒索病毒对企业来说是危害极大的安全风险之一,一旦核心数据或文件被加密,除了缴纳赎金,基本上无法解密。两年前爆发…

用 Excel VBA 提取小数部分-自定义函数

利用VBA 提取小数部分 Function GetDec(cell As Range, Optional ConvertToWhole As Boolean) As Variant 示例:2.154a)如果忽略或设置为FALSE,则函数返回小数,类似于“0.154”的形式b)如果设置为TRUE,则函数返回一个整数,如“154”Dim i%If

【数据湖存储】数据湖的终极奥秘,无招胜有招

作为海量数据存储与分析的重要承载方式的数据湖,从2011年概念诞生至今,已经发展了9个年头。而数据湖是什么?又能为数字化经济带来什么?《阿里云数据湖存储解决方案蓝皮书》将为您揭开数据湖的终极奥秘——无招胜有招 关注“阿里云…

科天云会议产品升级,打造企业数字化转型办公协同新基建

2020年11月24日,科天云会议宣布升级科天章鱼云并发布科天aPaas办公协作中台。依托科天aPaas办公协作中台核心技术架构,科天章鱼云10大音视频通讯核心能力,科天云会议将以便捷轻量的SaaSPaaS模式,为大中型企业提供云到端、全场景的…

libreoffice Error: source file could not be loaded

原因是少装了LibreOffice的writer,直接执行: yum install libreoffice-writer/usr/bin/soffice --headless --invisible --convert-to pdf /app/files/问题汇总.docx[rootVM-24-10-centos ~]# /usr/bin/soffice --headless --invisible --convert-to pd…

社区首款 OAM 可视化平台发布!

作者 | 徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小…

linux:根据关键字或日期查找日志

文章目录脚本11. 脚本描述2. 要点3. 格式4. 脚本原型5. shell脚本6. 效果图脚本22.1. 脚本描述2.2. 要点2.3. 格式2.4. 脚本原型2.5. shell脚本2.6. 效果图脚本1 1. 脚本描述 查询指定日志文件中是否包含指定的关键词的日志信息 2. 要点 包含则输出包含的关建行所在日志信息…

Go 语言成为最受欢迎的语言

<关注阿里巴巴云原生公众号&#xff0c;回复 Go 即可下载清晰知识图谱> 对 Go 语言感兴趣但又不知从何学起的同学&#xff0c;可以参考一下 Go 语言系列文章&#xff1a; 为什么你要选择 Go&#xff1f;Go 面向失败编程带着服务器编程金刚经走进 2020 年敢问路在何方&a…

如何在DevSecOps道路上快速、安全地抵达终点

作者 | 吴翔责编 | 晋兆雨出品 | CSDN云计算头图 | 付费下载于视觉中国近年来&#xff0c;移动互联网的迅猛发展给人们带去不少便利&#xff0c;在软件安全领域内&#xff0c;一种名为敏捷开发的模式正悄然流行&#xff0c;而可打破业务隔离、提高效率的DevOps&#xff08;开发…

前端的葵花宝典 - 红宝书《JavaScript高级程序设计(第4版)》学习笔记

目录 前言1、第1章 什么是JavaScript1.1 ECMAScript1.2 DOM1.3 BOM小结第2章 HTML 中的JavaScript2.1 < script >元素2.1.1 标签位置2.1.2 推迟执行脚本2.1.3 异步执行脚本2.2 行内代码与外部文件小结第3章 语言基础3.1 语法3.1.1 区分大小写3.1.2标识符3.1.3 严格模式3.…

构建更动态更灵活的分布式计算生态

0. 前言 作为阿里巴巴核心大数据底座&#xff0c;伏羲调度和分布式执行系统&#xff0c;支撑着阿里集团内部以及阿里云上大数据平台绝大部分的大数据计算需求&#xff0c;在其上运行的MaxCompute(ODPS) 以及PAI等多种计算引擎&#xff0c;每天为用户进行海量的数据运算。 在&q…

企业微信H5_身份验证,H5应用网页授权登录获取身份

文章目录一、调用流程1. 企业微信OAuth2接入流程2. 使用OAuth2前须知3. 构造网页授权链接4. 获取访问用户身份二、调试前准备2.1. 配置域名映射2.2. 跨域域名请求2.3. 设置可信任域名2.4. 登录企微2.5. 选择自建应用三、实战演练3.1. 前端编码触发后端api3.2. 后端构造授权链接…

Istio 网关之南北向流量管理

作者 | 王夕宁 阿里巴巴高级技术专家 参与阿里巴巴云原生公众号文末留言互动&#xff0c;有机会获得赠书福利&#xff01; 本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书&#xff0c;文章介绍将集群外部的客户端连接到集群内运行的服务&…

想在边缘运行计算机视觉程序?先来迎接挑战!

作者 | alwaysAI翻译 | 火火酱~&#xff0c;责编 | 晋兆雨出品 | CSDN云计算头图 | 付费下载于视觉中国人工智能可以让计算机聪明地行动&#xff0c;并且在真实环境中快速做出决策&#xff0c;同时收获相对理想的效果。当然&#xff0c;这个概括性的定义较为宽泛和模糊&#xf…

企业微信_通讯录管理,获取部门列表部门成员及详情

企业微信H5_通讯录管理,获取部门列表部门成员及详情 文章目录一、POSTMAN调试1. 获取access_token2. 获取部门列表3. 获取部门成员4. 获取部门成员详情5. 获取成员详情二、实战演练2.1. 获取部门列表2.2. 获取部门成员2.3. 获取部门成员详情2.4. 获取人员详情三、代码讲解3.1.…

混合云下割裂的Web安全管理挑战如何破?

导语 4月29日&#xff0c;阿里云五大安全产品全面升级在线发布&#xff0c;包括发布阿里云Web应用防火墙混合云解决方案&#xff0c;破解混合云环境下割裂的web安全管理难题&#xff1b;发布容器安全解决方案&#xff0c;助力客户解决容器安全问题&#xff0c;提高运维管理效率…