【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

  • 2020-05-10
  • 本文字数:5298 字

    阅读完需:约 17 分钟

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

简介

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


Tekton 定义了 Task、TaskRun、Pipeline、PipelineRun、PipelineResource 五类核心对象,通过对 Task 和 Pipeline 的抽象,我们可以定义出任意组合的 pipeline 模板来完成各种各样的 CI/CD 任务,再通过 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          vbuild-app  build-frontend   \          /    v        v    deploy-all
复制代码


相比于 Argo 等专注在 workflow 的项目而言, Tekton 支持的任务编排方式是非常有限的。常见的循环,递归,重试,超时等待等策略都是没有的。


条件判断


Tekton 支持 condition 关键字来进行条件判断。Condtion 只支持判断当前 Task 是否执行,不能作为 DAG 的分支条件来进行动态 DAG 的渲染。


condition:


https://github.com/tektoncd/pipeline/blob/e2755583d52ae46907790d40ba4886d55611cd23/docs/conditions.md


* condition检查失败(exitCode != 0),task不会被执行,pipelineRun状态不会因为condition检查失败而失败。* 多个条件之间 “与” 逻辑关系
复制代码

PipelineResource 在 Task 间数据交换

作为 CI/CD 的工具,代码在什么时候 Clone 到 WorkSpace 中,如何实现的? Tekton 中抽象了 PipelineResource 进行任务之间的数据交换, GitResource 是其中最基础的一种。用法如下。


声明一个 Git 类型的 PipelineResource :


kind: PipelineResourcemetadata:  name: skaffold-git-build-push-kanikospec:  type: git  params:  - name: revision    value: v0.32.0  - name: url    value: https://github.com/GoogleContainerTools/skaffold
复制代码


在 Task 中引用这个 Resource 做为输入:


kind: Taskmetadata:  name: build-push-kanikospec:  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
复制代码


1、前置条件


在 Kubernetes 集群上安装 Tekton :


https://github.com/tektoncd/pipeline/blob/master/docs/install.md


创建一个 SAE 应用:


https://help.aliyun.com/document_detail/122439.html


2、定义一个 Git 资源


apiVersion: tekton.dev/v1alpha1kind: PipelineResourcemetadata:  name: spring-cloud-demospec:  type: git  params:  - name: url    value: https://github.com/alicloud-demo/spring-cloud-demo
复制代码


3、定义构建和部署 Task


根据 SAE 官方文档进行部署,详情参考:


https://help.aliyun.com/document_detail/110639.html


apiVersion: tekton.dev/v1alpha1kind: Taskmetadata:  name: build-deploy-saespec:  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
复制代码


4、定义 TaskRun 运行任务


apiVersion: tekton.dev/v1alpha1kind: TaskRunmetadata:  name: build-deploy-saespec:  taskRef:    name: build-deploy-sae  inputs:    resources:    - name: source      resourceRef:        name: spring-cloud-demo
复制代码


5、导入到 kubernetes 中运行


kubectl apply -f source-2-service-taskrun.yaml
复制代码



6、查看日志


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] ------------------------------------------------------------------------
复制代码


7、验证部署结果


在 SAE 控制台查看变更记录:



验证应用访问:


总结

区别于传统的 CI/CD 工具(Jenkins),Tekton 是一套构建 CICD 系统的框架。 Tekton 不能使你立即获得 CI/CD 的能力。但是基于 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(企业级分布式应用服务)应用生命周期研发工作,长期关注云时代微服务的部署和治理工作。


本文转载自公众号阿里巴巴中间件(ID:Aliware_2018)。


原文链接


https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247489348&idx=3&sn=161f6eabdfce7dfb8c51ae2e9f8faada&chksm=fdeb2524ca9cac326c362778f8dcf2299a5fb28c80657b44c7c82760f5c8df773421455faf90&scene=27#wechat_redirect


2020-05-10 14:065555

评论 1 条评论

发布
用户头像
Tekton 需要从 gcr.io 下载镜像,可以使用国内的镜像源 gcr.lank8s.cn
http://gcr.iohttp://registry.k8s.io 的镜像都可以使用http://lank8s.cn提供的镜像服务来拉取镜像,详情看看这篇文章
https://liangyuanpeng.com/post/service-lank8s.cn/
2023-05-29 15:43 · 广东
回复
没有更多了
发现更多内容

项目经验还写外卖和商城?来看看异构数据源数据流转服务DatalinkX

李晓飞

flink springboot

交互式数字人将取代全球3亿人工岗位!

青否数字人

数字人

如何避免购买体育直播系统源码时隐藏费用陷阱

软件开发-梦幻运营部

Office2019 for Mac(办公套件全家桶) v16.78正式激活版

mac

苹果mac Windows软件 office 2019

小红书 X WSDM 2024「对话式多文档问答挑战赛」火热开赛!

小红书技术REDtech

人工智能 数据挖掘 搜索 信息检索 WSDM

【Java技术深入解析】「核心技术提升」最流行的Java模拟框架Mockito入门指南(Java单元测试)

洛神灬殇

Java Mock 服务 技术分析 2024年第四篇文章

Helm vs Kustomize 深度比较

俞凡

Kubernetes 云原生 Helm Kustomize

技术写作概述:内容分析、平台和转化追踪以及内容老化

小万哥

程序人生 软件工程 后端开发 技术写作 内容分析

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(Staking 玩法)

长安区块链

2024-01-06:用go语言,在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧 在桥上有一些石子,青蛙很讨厌踩在这些石子上 由于桥的长度和青蛙一次跳过的距离都是正整数 我们可以把独木桥

福大大架构师每日一题

福大大架构师每日一题

通过聚道云软件连接器实现钉钉与自研主数据系统的完美融合

聚道云软件连接器

案例分享

DevOps|产研运协作工具链上的皇冠-项目管理工具

laofo

项目管理 DevOps cicd 敏捷开发 研发效能

最大输出 18W,集成 Type-C PD 输出和各种快充输出协议

攻城狮Wayne

文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题

福大大架构师每日一题

福大大架构师每日一题

【Linux】工具介绍vim及gcc详解。

百度搜索:蓝易云

vim Linux 运维 云服务器 GCC

数字人分身让企业更高效!

青否数字人

Ulysses 27 for Mac(markdown编辑软件) v27.3中文完整激活版

mac

苹果mac Windows软件 Ulysses Markdown写作工具

解读 $mash 通证 “Fair Launch” 规则,公平的极致?(Staking 玩法)

EOSdreamer111

有什么安全处理方案可以有效防护恶意爬虫

德迅云安全杨德俊

爬虫 安全 CDN

关于在容器中,nignx代理后端多个服务如何保证后端服务的地址不变呢?

百度搜索:蓝易云

nginx 云计算 Linux 运维 云服务器

IDC报告:网心科技以11.8%的市场份额位居中国边缘公有云第三

网心科技

软件开发给外包公司,开发需求功能纸面合同化有多重要

软件开发-梦幻运营部

解读 $mash 通证 “Fair Launch” 规则,公平的极致?(Staking 玩法)

股市老人

分布式系统设计: 从1千到10亿用户的跨越

俞凡

架构

clickhouse重启,以及修改数据存储目录后重启失败的解决办法

百度搜索:蓝易云

云计算 Linux 运维 Clickhouse 服务器

原创逼真实时互动“青否数字人”是如何生产出来的?

青否数字人

数字人

macos三国策略游戏:三国志11威力加强版最新中文版

胖墩儿不胖y

mac游戏 游戏推荐 好玩的游戏分享

YouTube音乐转MP3转换器 MediaHuman YouTube to MP3 Converter 中文

mac大玩家j

Mac软件 音频格式转换器

重庆大学OpenHarmony技术俱乐部成立:产学研紧密合作,共创数智生态新篇章

科技热闻

分层架构最佳实践

俞凡

架构

开源 CI/CD 构建框架 TekTon 的深入剖析_服务革新_九辩_InfoQ精选文章