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

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,182元/月
简介:

简介

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逻辑。

image

DAG支持

Tekton对DAG的支持相对比较简单。在Tekton中一个Pipeline就是一张DAG,Pipeline中的多个Task可是DAG中的节点。Task默认并发执行,可以通过 RunAfterFrom 关键字控制执行顺序。

示例:

- 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来处理对应的输和输出,如下图所示。

image

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
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

image

  • 查看日志
kubectl logs build-deploy-sae-pod-85xdk step-build-and-deploy

构建日志:
image

部署日志:

[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控制台查看变更记录:
image

验证应用访问:
image

总结

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
监控 安全 测试技术
现在公司都在用的CI/CD框架到底是什么?
现在公司都在用的CI/CD框架到底是什么?
5192 1
|
6月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
228 0
|
6月前
|
大数据
“你朋友圈的真面目,大数据都知道!”——用社交网络分析看透人情世故
“你朋友圈的真面目,大数据都知道!”——用社交网络分析看透人情世故
183 16
|
9月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
570 276
|
10月前
|
Prometheus 监控 Cloud Native
无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?
Prometheus 是一个完全开源的系统监控和告警工具包,受 Google 内部 BorgMon 系统启发,自2012年由前 Google 工程师在 SoundCloud 开发以来,已被众多公司采用。它拥有活跃的开发者和用户社区,现为独立开源项目,并于2016年加入云原生计算基金会(CNCF)。Prometheus 的主要特点包括多维数据模型、灵活的查询语言 PromQL、不依赖分布式存储、通过 HTTP 拉取时间序列数据等。其架构简单且功能强大,支持多种图形和仪表盘展示模式。安装和使用 Prometheus 非常简便,可以通过 Docker 快速部署,并与 Grafana 等可
4406 2
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
10月前
|
运维 jenkins Java
Jenkins 自动化局域网管控软件构建与部署流程
在企业局域网管理中,Jenkins 作为自动化工具,通过配置源码管理、构建及部署步骤,实现了高效、稳定的软件开发与部署流程,显著提升局域网管控软件的开发与运维效率。
181 5
|
11月前
|
监控 前端开发 jenkins
Jenkins 在前端项目持续部署中的应用,包括其原理、流程以及具体的实现方法
本文深入探讨了Jenkins在前端项目持续部署中的应用,涵盖其基本原理、流程及具体实现方法。首先介绍了Jenkins的基本概念及其在自动化任务中的作用,随后详细解析了从前端代码提交到生产环境部署的全过程,包括构建、测试、部署等关键步骤。最后,强调了持续部署中的代码质量控制、环境一致性、监控预警及安全管理等注意事项,旨在帮助开发者高效、安全地实施持续部署。
243 5
|
SQL JSON 缓存
玳数科技集成 Flink CDC 3.0 的实践
本文投稿自玳数科技工程师杨槐老师,介绍了 Flink CDC 3.0 与 ChunJun 框架在玳数科技的集成实践。
859 7
玳数科技集成 Flink CDC 3.0 的实践
|
Kubernetes jenkins 持续交付
Jenkins部署以及基本使用
Jenkins部署以及基本使用
452 7