Kubernetes 原生 CI/CD 構建框架 Argo 詳解!

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

上圖流程中使用的是 Jenkins。Jenkins 作為老牌流水線框架被大家所熟知。在云原生時代,Jenkins 推出了 Jenkins X 作為基于 Kubernetes 的新一代流水線,另外云原生時代還誕生了兩大流水線框架—— Argo 和 Tekton。本文就詳細介紹了 Argo 的相關內(nèi)容。
《Kubernetes 原生 CI/CD 構建框架 Tekton 詳解!》詳細介紹了 Tekton 的相關內(nèi)容。
Argo
Quick Start
Argo 基于 Kubernetes,可以直接使用 kubectl 安裝,安裝的組件主要包括了一些 CRD 以及對應的 controller 和一個 server。

注意,上述安裝只會執(zhí)行同 namespace 內(nèi)的 Workflow,cluster install 詳見文檔。文檔地址:https://github.com/argoproj/argo/blob/master/docs/installation.md
三級定義
要了解 Argo 定義的 CRD,先從其中的三級定義入手。概念上的從大到小分別為 WorkflowTemplate、Workflow、template,這些資源的命名有些相似,要注意分辨。
從最簡單的 template 說起,一個 template 有多種類型,分別為 container、script、dag、steps、resource 以及 suspend。對于 template,我們可以簡單的將其理解為一個 Pod ——container/script/resource 類型的 template 都會去實際控制一個 Pod,而 dag/steps 類型的 template 則是由多個基礎類型的 template (container/script/resource)組成的。
container:最常見的模板類型,與 Kubernetes container spec 保持一致。
script:該類型基于 Container,支持用戶在 template 定義一段腳本,另有一個 Source 字段來表示腳本的運行環(huán)境。
resource:該類型支持我們在 template 中對 kubernetes 的資源進行操作,有一個 action 字段可以指定操作類型,如 create, apply, delete 等,并且支持設定相關的成功與失敗條件用于判斷該 template 的成功與失敗。
suspend:Suspend template 將在一段時間內(nèi)或在手動恢復執(zhí)行之前暫停執(zhí)行。可以從 CLI (使用 argo resume)、API 或 UI 恢復執(zhí)行。
steps:Steps Template 允許用戶以一系列步驟定義任務。在 Steps 中,[--] 代表順序執(zhí)行,[-] 代表并行執(zhí)行。
dag:DAG template 允許用戶將任務定義為帶依賴的有向無環(huán)圖。在 DAG 中,通過 dependencies設置在特定任務開始之前必須完成的其他任務。沒有任何依賴項的任務將立即運行。有關 DAG 的詳細邏輯可見源碼 https://github.com/argoproj/argo/blob/master/workflow/controller/dag.go#L204。




定義了要執(zhí)行的工作流。 存儲了工作流的狀態(tài)。
而 Workflow 由一個 entrypoint 及一系列 template 組成,entrypoint 定義了這個 workflow 執(zhí)行的入口,而 template 會實際去執(zhí)行一個 Pod,其中,用戶定義的內(nèi)容會在 Pod 中以 Main Container 體現(xiàn)。此外,還有兩個 Sidecar 來輔助運行。
Sidecar
在 Argo 中,這些 Sidecar 的鏡像都是 argoexec。Argo 通過這個 executor 來完成一些流程控制。


Inputs and Outputs
在運行 Workflow 時,一個常見的場景是輸出產(chǎn)物的傳遞。通常,一個 Step 的輸出產(chǎn)物可以用作后續(xù)步驟的輸入產(chǎn)物。在 Argo 中,產(chǎn)物可以通過 Artifact 或是 Parameter 傳遞。



{{xxx}} 是 Argo 固定的變量替換格式:
關于變量的格式詳見文檔,文檔地址:https://github.com/argoproj/argo/blob/master/docs/variables.md 關于變量替換的邏輯詳見源碼,源碼地址:https://github.com/argoproj/argo/blob/master/workflow/common/util.go#L305






其他流程控制功能
循環(huán)







對比 Tekton
相較于 Tekton 而言,Argo 的流程控制功能更加豐富。擁有著循環(huán)、遞歸等功能,這對于一些機器學習的場景都是十分適用的。而 Argo 社區(qū)對自己的定位也是 MLOps、AIOps、Data/Batch Processing,這也正是 Kubeflow Pipeline 底層基于 Argo 的原因(盡管 KFP 也在做 Tekton 的 backend)。
Argo Roadmap:https://github.com/argoproj/argo/blob/master/docs/roadmap.md Argo Examples:https://argoproj.github.io/argo/examples/#welcome Argo Source Code:https://github.com/argoproj/argo
K8S 進階訓練營
點擊屏末 | 閱讀原文 | 即刻學習
