用 Tekton 在 Kubernetes 中編寫你的第一條 CI/CD 流水線
Tekton 是一個(gè)用于創(chuàng)建持續(xù)集成和持續(xù)交付(CI/CD)系統(tǒng)的 Kubernetes 原生開源框架。通過對(duì)底層實(shí)施細(xì)節(jié)的抽象,它還可以幫助你在多個(gè)云供應(yīng)商或企業(yè)內(nèi)部系統(tǒng)中進(jìn)行端到端(構(gòu)建、測(cè)試、部署)應(yīng)用開發(fā)。
Tekton 介紹
??Tekton?? 最初被稱為 ??Knative Build??,后來被重組為獨(dú)立的開源項(xiàng)目,有自己的 ??治理組織??,現(xiàn)在是屬于 ??Linux 基金會(huì)?? 的項(xiàng)目。Tekton 提供了一個(gè)集群內(nèi)的容器鏡像構(gòu)建和部署工作流程,換句話說,它是一個(gè) 持續(xù)集成continuous integration(CI)和 持續(xù)交付continuous delivery(CD)服務(wù)。它由 Tekton 流水線和幾個(gè)支持組件如 Tekton CLI、Triggers 和 Catalog 等組成。
Tekton 是一個(gè) Kubernetes 原生應(yīng)用。它在 Kubernetes 集群中作為擴(kuò)展被安裝和運(yùn)行,由一套Kubernetes 定制化資源組成,定義了你為流水線創(chuàng)建和復(fù)用的構(gòu)建塊。由于 Tekton 是一種 Kubernetes 原生技術(shù),所以它非常容易擴(kuò)展。當(dāng)你需要增加你的工作負(fù)載時(shí),你只需向你的集群添加節(jié)點(diǎn)就可以了。由于其可擴(kuò)展的設(shè)計(jì)和社區(qū)貢獻(xiàn)的組件庫,它也很容易定制。
對(duì)于需要 CI/CD 系統(tǒng)來開展工作的開發(fā)人員,和為其組織內(nèi)的開發(fā)人員建立 CI/CD 系統(tǒng)的平臺(tái)工程師,Tekton 是理想選擇。
Tekton 組件
構(gòu)建 CI/CD 流水線的過程非常復(fù)雜,因此 Tekton 為每一步都提供工具。以下是 Tekton 提供的主要組件:
- 流水線Pipeline: 定義了一組 Kubernetes ??自定義資源??,作為你用來組裝 CI/CD 流水線的構(gòu)建塊。
- 觸發(fā)器Triggers:一種 Kubernetes 自定義資源,允許你根據(jù)從事件有效載荷中提取的信息來創(chuàng)建流水線。例如,你可以在每次創(chuàng)建 Git 倉庫的合并請(qǐng)求時(shí),觸發(fā)流水線的實(shí)例化和執(zhí)行。
- 命令行CLI:提供一個(gè)名為 ?
?tkn?
? 的命令行界面,你可以使用它從終端與 Tekton 進(jìn)行交互。 - 儀表盤Dashboard:是 Tekton 流水線的一個(gè)基于網(wǎng)頁的圖形界面,顯示流水線的執(zhí)行信息。
- 目錄Catalog:是一個(gè)高質(zhì)量的、由社區(qū)貢獻(xiàn)的 Tekton 構(gòu)建塊(任務(wù)、流水線等),可在你自己的流水線中使用。
- 中心Hub:是一個(gè)基于網(wǎng)頁的圖形界面,用于訪問 Tekton 目錄。
- 操作員Operator:是一種 Kubernetes ??操作員模式??,你可以在 Kubernetes 集群中安裝、更新、升級(jí)和刪除 Tekton 項(xiàng)目。
- 鏈Chains:是一個(gè) Kubernetes 自定義資源定義Custom Resource Definition(CRD)控制器,使你可以在 Tekton 中處理供應(yīng)鏈安全的問題。正在開發(fā)中。
- 結(jié)果Results:旨在幫助用戶對(duì) CI/CD 工作負(fù)載歷史進(jìn)行邏輯分組,并將長(zhǎng)期結(jié)果的存儲(chǔ)從流水線控制器中分離出來。
Tekton 術(shù)語
Tekton terminology
- 步驟Step:是 CI/CD 工作流程中最基本的實(shí)體,例如為 Python 網(wǎng)絡(luò)應(yīng)用程序運(yùn)行一些單元測(cè)試或編譯一個(gè) Java 程序。Tekton 使用容器鏡像執(zhí)行每個(gè)步驟。
- 任務(wù)Task::kissing:* 是按特定順序排列的步驟的集合。Tekton 以 ??Kubernetes 容器莢?? 的形式運(yùn)行任務(wù),其中每個(gè)步驟都成為 容器莢pod
- 流水線Pipelines:是按特定順序排列的任務(wù)的集合。Tekton 把所有任務(wù)連接成一個(gè) 有向無環(huán)圖directed acyclic graph(DAG),并按順序執(zhí)行圖。換句話說,它創(chuàng)建了一些 Kubernetes 容器莢,并確保每個(gè)容器莢按預(yù)期成功運(yùn)行。
Tekton pipelines
- 流水線運(yùn)行PipelineRun:顧名思義,是一條流水線的具體執(zhí)行。
- 任務(wù)運(yùn)行TaskRun:是一個(gè)任務(wù)的具體執(zhí)行。你可以選擇在流水線外運(yùn)行一次任務(wù)運(yùn)行,可以通過它查看任務(wù)中每個(gè)步驟執(zhí)行的具體情況。
創(chuàng)建你的 CI/CD 流水線
開始使用 Tekton 的最簡(jiǎn)單方法是自己編寫一個(gè)簡(jiǎn)單的流水線。如果你每天都在使用 Kubernetes,那你可能對(duì) YAML 很熟悉,這正是 Tekton 流水線的定義方式。下面是一個(gè)克隆代碼庫的簡(jiǎn)單流水線的例子。
首先,創(chuàng)建一個(gè) ??task.yaml?
? 文件,用你喜歡的文本編輯器打開它。這個(gè)文件定義了你要執(zhí)行的 步驟Step。在這個(gè)例子中,就是克隆一個(gè)倉庫,所以我把這個(gè)步驟命名為 “clone”。該文件設(shè)置了一些環(huán)境變量,然后使用一個(gè)簡(jiǎn)單的 shell 腳本來執(zhí)行克隆。
接下來是 任務(wù)Task。你可以把步驟看作是一個(gè)被任務(wù)調(diào)用的函數(shù),而任務(wù)則設(shè)置步驟所需的參數(shù)和工作空間。
創(chuàng)建第二個(gè)文件 ??pipeline.yaml?
?,并用你喜歡的文本編輯器打開它。這個(gè)文件通過設(shè)置諸如可以運(yùn)行和處理任務(wù)的工作區(qū)等重要參數(shù)來定義流水線。
最后,創(chuàng)建一個(gè) ??pipelinerun.yaml?
? 文件,用喜歡的文本編輯器打開它。這個(gè)文件真正的運(yùn)行流水線。它調(diào)用流水線中定義的參數(shù)(繼而調(diào)用任務(wù)文件中定義的任務(wù))。
把不同工作分在不同的文件中的好處是,??git-clone?
? 任務(wù)可以在多條流水線中復(fù)用。
例如,假設(shè)你想為一個(gè)流水線項(xiàng)目做端到端的測(cè)試。你可以使用 ??git-clone?
? 任務(wù) 來讓每一次測(cè)試都基于最新的代碼。
總結(jié)
只要你熟悉 Kubernetes,那 Tekton 對(duì)你來說就像其他 Kubernetes 原生應(yīng)用一樣簡(jiǎn)單。它有很多工具可以幫助你創(chuàng)建流水線并與之交互。如果你喜歡自動(dòng)化,不妨試試 Tekton!