Kubernetes 原生 CI/CD 構(gòu)建框架 Tekton 詳解!

流水線(Pipeline)是把一個重復(fù)的過程分解為若干個子過程,使每個子過程與其他子過程并行進(jìn)行的技術(shù)。 本文主要介紹了誕生于云原生時代的流水線框架 Tekton。
作者:FogDong(Tekton 社區(qū))
編輯:Bach(才云)
什么是流水線?
在計(jì)算機(jī)中,流水線是把一個重復(fù)的過程分解為若干個子過程,使每個子過程與其他子過程并行進(jìn)行的技術(shù),也叫 Pipeline。由于這種 s工作方式與工廠中的生產(chǎn)流水線十分相似, 因此也被稱為流水線技術(shù)。從本質(zhì)上講,流水線技術(shù)是一種時間并行技術(shù)。以“構(gòu)建鏡像”過程為例:

Tekton
Tekton 是一個基于 Kubernetes 的云原生 CI/CD 開源框架,屬于 CD 基金會的項(xiàng)目之一。Tekton 通過定義 CRD 的方式,讓用戶以靈活的自定義流水線以滿足自身 CI/CD 需求。

Task: Task 為構(gòu)建任務(wù),是 Tekton 中不可分割的最小單位,正如同 Pod 在 Kubernetes 中的概念一樣。在 Task 中,可以有多個 Step,每個 Step 由一個 Container 來執(zhí)行。 Pipeline: Pipeline 由一個或多個 Task 組成。在 Pipeline 中,用戶可以定義這些 Task 的執(zhí)行順序以及依賴關(guān)系來組成 DAG(有向無環(huán)圖)。 PipelineRun: PipelineRun 是 Pipeline 的實(shí)際執(zhí)行產(chǎn)物,當(dāng)用戶定義好 Pipeline 后,可以通過創(chuàng)建 PipelineRun 的方式來執(zhí)行流水線,并生成一條流水線記錄。 TaskRun: PipelineRun 被創(chuàng)建出來后,會對應(yīng) Pipeline 里面的 Task 創(chuàng)建各自的 TaskRun。一個 TaskRun 控制一個 Pod,Task 中的 Step 對應(yīng) Pod 中的 Container。當(dāng)然,TaskRun 也可以單獨(dú)被創(chuàng)建。



git:代表一個 git 倉庫,包含了需要被構(gòu)建的源代碼。將 git 資源作為 Task 的 Input,會自動 clone 此 git 倉庫。 pullRequest:表示來自配置的 url(通常是一個 git 倉庫)的 pull request 事件。將 pull request 資源作為 Task 的 Input,將自動下載 pull request 相關(guān)元數(shù)據(jù)的文件,如 base/head commit、comments 以及 labels。 image:代表鏡像倉庫中的鏡像,通常作為 Task 的 Output,用于生成鏡像。 cluster:表示一個除了當(dāng)前集群外的 Kubernetes 集群。可以使用 Cluster 資源在不同的集群上部署應(yīng)用。 storage:表示 blob 存儲,它包含一個對象或目錄。將 Storage 資源作為 Task 的 Input 將自動下載存儲內(nèi)容,并允許 Task 執(zhí)行操作。目前僅支持 GCS。 cloud event:會在 TaskRun z執(zhí)行完成后發(fā)送事件信息(包含整個 TaskRun) 到指定的 URI 地址,在與第三方通信的時候十分有用。
文檔地址:https://github.com/tektoncd/pipeline/blob/master/docs/resources.md
Kaniko 是 Google 開源的項(xiàng)目之一,可在 Kubernetes 上無需特權(quán)模式地構(gòu)建 docker 鏡像。


configuring-authentication-for-docker 地址:https://github.com/tektoncd/pipeline/blob/master/docs/auth.md#configuring-authentication-for-docker
config-artifact-pvc 和一個叫做 config-artifact-bucket 的 Config Map。從命名就可以看出,這二者分別代表了產(chǎn)物存儲的兩種配置方式—— PVC 和存儲桶(目前支持 GCS 和 S3)。config-artifact-pvc 需要填寫兩個值:size 以及 storageClassName。size 默認(rèn)為 5GiB,storage class name 默認(rèn)為 default。這也意味著當(dāng)我們使用 PipelineResource 進(jìn)行資源傳遞時,會自動創(chuàng)建一個 5GiB 的存儲卷掛載在 Task 上,供 PipelineResource 使用。Tekton variables 地址:https://github.com/tektoncd/pipeline/blob/master/docs/variables.md


from:當(dāng) Task 的 Inputs 依賴于上一個 Task 的 Outputs 時,可以通過 from 參數(shù)來指定 runAfter:當(dāng) Task 間沒有資源依賴,但需要使一個 Task 在另外一個 Task 之后運(yùn)行的話,可以使用 runAfter 來指定。


lint-repo和test-app中的 Task 沒有from或runAfter關(guān)鍵字,會同時開始執(zhí)行。一旦
test-app完成,build-app和build-frontend都會開始同時執(zhí)行,因?yàn)樗鼈?nbsp;runAfter于test-app。deploy-all會在build-app和build-frontend都完成后才執(zhí)行,因?yàn)樗枰馁Y源from于這二者。



-post_file:指定了 Step 完成后的文件寫入路徑。如果 Step 失敗,則寫入到 {{post_file}}.err。可以看到上面的寫入路徑為 /tekton/tools/0,最后的這個數(shù)字即為 Step 的編號。-wait_file:指定了在啟動下一個 Step 之前要查看的文件路徑。它將監(jiān)聽 {{wait_file}}和{{wait_file}}.err。若有錯誤則跳過執(zhí)行寫入{{post_file}}.err并返回錯誤(exitCode >= 0);若無錯誤則執(zhí)行下一個 Step。如上例子為第一個 step,若為第二個 step,wait_ file 的地址會是/tekton/tools/0,也就是上一個 step 的 post_file 地址。

在有 LimitRange 限制 Container 必須有資源的的情況下,每個 Container 最小會設(shè)置為 LimitRange 的設(shè)置。


PipelineResource 仍處于 Alpha 版本,它有可能會被重新設(shè)計(jì)、替換、棄用或者完全刪除。Tekton 社區(qū)鼓勵用戶用 Task 代替 PipelineResources。
Workspace 與 Kubernetes 中 Volume 概念幾乎保持一致,只不過并不是 Pod 層級的而是作用于 Tekton 資源層級的。Workspace 在 Pipeline 中使用時是一個抽象的概念,實(shí)際的存儲類型需要在 PipelineRun 中指定。詳見:Workspaces。
Workspaces 地址:https://github.com/tektoncd/pipeline/blob/master/docs/workspaces.md

Conditions,高版本推薦使用 WhenExpressions(Conditions 將在不久后廢棄,完全替換為 WhenExpressions)。WhenExpressions 由 Input、Operator、Values 三部分組成,其中 Input 可以使用 Tekton 的 Parameter 或者 Results,Operator 目前僅支持 in 和 notin:



K8S 進(jìn)階訓(xùn)練營
點(diǎn)擊屏末 | 閱讀原文 | 即刻學(xué)習(xí)
