日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/8/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源 CI/CD 构建框架 TekTon 的深入剖析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡介

Tekton 是一個(gè)功能強(qiáng)大且靈活的Kubernetes 原生開源框架,用于創(chuàng)建持續(xù)集成和交付(CI/CD)系統(tǒng)。 關(guān)于Tekton, 網(wǎng)上可以搜到很多很多介紹文檔,本文主要闡述我對Tekton的實(shí)現(xiàn)原理和背后的技術(shù)邏輯的一點(diǎn)理解。
tekton.dev

Tekton定義了Task, TaskRun, Pipeline, PipelineRun, PipelineResource 五類核心對象。Tekton通過對Task和Pipeline的抽象,我們可以定義出任意組合的pipeline模板來完成各種各樣的CICD任務(wù)。通過TaskRun,PipelineRun,PipelineResource可以將這些模板套用到各個(gè)實(shí)際的項(xiàng)目中。

實(shí)現(xiàn)原理

高度抽象的結(jié)構(gòu)化設(shè)計(jì)使得Tekton具有非常靈活的特性。那么Tekton是如何實(shí)現(xiàn)workflow的流轉(zhuǎn)的呢。

Tekton利用Kubernetes的List-Watch機(jī)制,在啟動(dòng)時(shí)初始化了2個(gè)Controller, PipelineRunController和TaskRunController。

PipelineRunController監(jiān)聽PipelineRun對象的變化。在它的reconcile邏輯中,將pipeline中所有的Task構(gòu)建為一張有向無環(huán)圖(DAG),通過遍歷DAG找到當(dāng)前可被調(diào)度的Task節(jié)點(diǎn)創(chuàng)建對應(yīng)的TaskRun對象。

TaskRunController監(jiān)聽TaskRun對象的變化。在它的reconcile邏輯中將TaskRun和對應(yīng)Task轉(zhuǎn)化為可執(zhí)行的Pod,由kubernetes調(diào)度執(zhí)行。利用Kubernetes的OwnerReference機(jī)制,pipelinerun own taskrun, taskrun own pod。pod狀態(tài)變更時(shí)觸發(fā)taskrun的reconcile邏輯,taskrun狀態(tài)變更時(shí)觸發(fā)pipelinerun的reconcile邏輯。

?

DAG支持

Tekton對DAG的支持相對比較簡單。在Tekton中一個(gè)Pipeline就是一張DAG,Pipeline中的多個(gè)Task可是DAG中的節(jié)點(diǎn)。Task默認(rèn)并發(fā)執(zhí)行,可以通過?RunAfter?和?From?關(guān)鍵字控制執(zhí)行順序。

示例:

- 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

渲染出的執(zhí)行順序?yàn)?#xff1a;

| |v vtest-app lint-repo/ \v v build-app build-frontend\ /v vdeploy-all

相比于Argo等專注在workflow的項(xiàng)目而言,Tekton支持的任務(wù)編排方式是非常有限的。常見的循環(huán),遞歸,重試,超時(shí)等待等策略都是沒有的。

  • 條件判斷

Tekton支持?condition?關(guān)鍵字來進(jìn)行條件判斷。Condtion只支持判斷當(dāng)前Task是否執(zhí)行,不能作為DAG的分支條件來進(jìn)行動(dòng)態(tài)DAG的渲染。

* condition檢查失敗(exitCode != 0),task不會被執(zhí)行,pipelineRun狀態(tài)不會因?yàn)閏ondition檢查失敗而失敗。 * 多個(gè)條件之間 “與” 邏輯關(guān)系

PipelineResource在Task間數(shù)據(jù)交換

作為CICD的工具,代碼在什么時(shí)候Clone到WorkSpace中,如何實(shí)現(xiàn)的? Tekton中抽象了PipelineResource進(jìn)行任務(wù)之間的數(shù)據(jù)交換,GitResource是其中最基礎(chǔ)的一種。用法如下。

  • 聲明一個(gè)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中引用這個(gè)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如何創(chuàng)建Pod說起。

Tekton中一個(gè)TaskRun對應(yīng)一個(gè)Pod,每個(gè)Pod有一系列init-containers和step-containers組成。init-container中完成認(rèn)證信息初始化,workspace目錄初始化等初始化工作。

在處理step-container時(shí),會根據(jù)這個(gè)Task引用的資源 Append或者Insert一個(gè)step-container來處理對應(yīng)的輸和輸出,如下圖所示。

?

Task中Step執(zhí)行順序控制

Tekton源自Knative Build,在Knative Build中使用Init-container來串聯(lián)Steps保證Steps順序執(zhí)行,在上面的分析中我們知道Tekton是用Containers來執(zhí)行Steps,Pod的Containers是并行執(zhí)行的,Tekton是如何保證Steps執(zhí)行順序呢?

這是一個(gè)TaskRun創(chuàng)建的Pod的部分描述信息,可以看到所有的Step都是被/tekton/tools/entrypoints封裝起來執(zhí)行的。 -wait_file指定一個(gè)文件,通過監(jiān)聽文件句柄,在探測到文件存在時(shí)執(zhí)行被封裝的Step任務(wù)。 -post_file指定一個(gè)文件,在Step任務(wù)完成后創(chuàng)建這個(gè)文件。通過文件序列/tekton/tools/${index}來對Step進(jìn)行排序。

- 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

實(shí)踐

使用Tekton構(gòu)建代碼并部署到SAE

Serverless 應(yīng)用引擎(?SAE?) 是阿里云上一款面向應(yīng)用的 Serverless PaaS 平臺,幫助 PaaS 層用戶免運(yùn)維 IaaS,按需使用,按量計(jì)費(fèi),實(shí)現(xiàn)低門檻微服務(wù)應(yīng)用上云,有效解決成本及效率問題。支持 Spring Cloud、Dubbo 和 HSF 等流行的開發(fā)框架,真正實(shí)現(xiàn)了 Serverless 架構(gòu)和微服務(wù)架構(gòu)的完美融合。

接下來將使用Tekton部署一個(gè)Spring Cloud微服務(wù)應(yīng)用到SAE平臺。

示例中的演示代碼地址:https://github.com/alicloud-demo/spring-cloud-demo
  • 前置條件

  • 在Kubernetes集群上安裝Tekton
  • 創(chuàng)建一個(gè)SAE應(yīng)用
  • 定義一個(gè)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
  • 定義構(gòu)建和部署Task

根據(jù)SAE官方文檔進(jìn)行部署。

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運(yùn)行任務(wù)
apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata:name: build-deploy-sae spec:taskRef:name: build-deploy-saeinputs:resources:- name: sourceresourceRef:name: spring-cloud-demo
  • 導(dǎo)入到kubernetes中運(yùn)行
kubectl apply -f source-2-service-taskrun.yaml

?

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

構(gòu)建日志:

部署日志:

[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] ------------------------------------------------------------------------
  • 驗(yàn)證部署結(jié)果

在SAE控制臺查看變更記錄:

驗(yàn)證應(yīng)用訪問:

總結(jié)

區(qū)別于傳統(tǒng)的CICD工具(Jenkins),Tekton是一套構(gòu)建CICD系統(tǒng)的框架。Tekton不能使你立即獲得CICD的能力。但是基于Tekton可以設(shè)計(jì)出各種花式的構(gòu)建部署流水線。得益于Tekton良好的抽象,這些設(shè)計(jì)出的流水線可以作為模板在多個(gè)組織,項(xiàng)目間共享。 Tekton源自Knative的Build-Template項(xiàng)目,設(shè)計(jì)之初的一個(gè)重要目標(biāo)就是使人們能夠共享和重用構(gòu)成pipeline的組件,以及Pipeline本身。在Tekton的RoadMap中Tekton Catelog就是為了實(shí)現(xiàn)這一目標(biāo)而提出的。

區(qū)別于Argo這種基于Kubernetes的Workflow工具,Tekton在工作流控制上的支持是比較弱的。一些復(fù)雜的場景比如循環(huán),遞歸等都是不支持的。更不用說Argo在高并發(fā)和大集群調(diào)度下的性能優(yōu)化。這和Tekton的定位有關(guān),Tekton定位于實(shí)現(xiàn)CICD的框架,對于CICD不需要過于復(fù)雜的流程控制。大部分的研發(fā)流程可以被若干個(gè)最佳實(shí)踐來覆蓋。而這些最佳實(shí)踐應(yīng)該也必須可以在不同的組織間共享,為此Tekton設(shè)計(jì)了PipelineResource的概念。PipelineResource是Task間交互的接口,也是跨平臺跨組織共享重用的組件,在PipelineResource上還可以有很多想象空間。

作者信息:九辯,阿里巴巴高級開發(fā)工程師,負(fù)責(zé)阿里云EDAS(企業(yè)級分布式應(yīng)用服務(wù))應(yīng)用生命周期研發(fā)工作,長期關(guān)注云時(shí)代微服務(wù)的部署和治理工作。

原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的开源 CI/CD 构建框架 TekTon 的深入剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。