你不能不知道的Argo
近些年內伴隨著 GitOps 與 Cloud Native 的潮流湧至,乘在浪頂的你可能對於 Argo 這個項目並不陌生,因大多數的 GitOps 是採用 Argo CD 來實作的,而我們今天要介紹的主角是 Argo Workflow。
不同於 Argo CD 許多人都有一些部署管理上的優化需求,Argo Workflow 所面向的使用群眾則相較沒那麼地廣泛,或者說不乏有相似功能的產品已能符合部分使用情境,另外值得一提的是知名的 Kubeflow 底層就是採用 Argo workflow 來實作的,那麽它還有哪些特別的優勢,又能為我們解決什麼樣的問題呢,接下來跟著本文一起深入探索吧!
先瞭解 Argo 吧
雲原生基金會(CNCF)下孵化器所託管的一個專案,致力於 Kubernetes 上各種流程優化工具開發,旗下包含了4個專案,分別是用於平行調度的工作流程引擎 Argo Workflow、GitOps 部署管理的 Argo CD、更高階的發佈策略控制工具 Argo Rollouts、以及事件相依管理器 Argo Events。
目前有許多知名企業採用 Argo 作為產品開發生產中不可或缺的工具之一,其中就包含了Adobe、Nvidia、Tesla、Google、RedHat 等公司。
開始之前先稍微看看 Argo Workflow 官方所宣稱的優勢:
- 基於容器化服務生態所設計的,沒有傳統 Virtual Machine 及伺服器導向環境的高昂成本與限制
- 沒有公私有雲平台限制,可以在任何 Kubernetes 群集上運行
- 可以輕鬆編排高平行併發的任務
- 如同超級電腦般的運算流程及效率
Script
正式進入主題了,以下是我們常見在定義工作流時,單一任務的描述內容,以 gitlab-ci 及 drone-ci為例:
接著看看 Argo Workflow的定義方式:
以差不多任務腳本定義的範例比較,可以看出推出多時且成熟的 gitlab-ci 與 drone-ci 在單純支援腳本語法的限制下已可以完成多數人的使用情境,而 Argo workflow 在腳本定義上可以直接支援不同語言撰寫,相比之下則更為彈性,另外 Argo 也有提供 Library 可以完全使用 Golang、Java 或 Python 來描述工作流程而非原本的 YAML 方式。
雖說前者也可以將提前撰寫好的程式檔案利用掛載方式透過腳本來執行,但從維護及維運的角度會發現兩個痛點,第一點是維護時無法直觀地在定義工作流的內容上看清整體運作邏輯;第二點是維運時以 gitlab-ci 為例,在 gitlab portal 上觀看任務執行過程紀錄時僅會顯示執行了某某檔案,如果在執行過程中失敗更是難以追朔除錯。
看完上述的範例我們可以發現,在差不多的任務定義下 Argo workflow 更為靈活彈性可以應付不同的場景需求,然而光這樣可能還不足夠吸引人,它被設計所要應付的情境遠遠不止這些,接下來我們繼續挖掘它令人無法忽視的強大!
Template
Argo workflow 支援模板的定義功能,增加了相似任務的重用性,引用模板時給予不同的參數便可以達成不一樣的任務執行,下面我們來看看範例:
範例中我們定義了兩個模板hello-template
及 hello-exec
,並設置執行的進入點為 hello-exec
,而 hello-exec
模板內則描述了兩個任務步驟且分別調用了 hello-template
模板,執行後便可以得到 hello Tom
與 hello Amy
兩個結果。在日趨增長的需求下我們的工作流程也可能伴隨著需求不斷地調整,有了模板的定義功能後便能應付更多複雜的場景,同時也能大大減少相似任務的冗余描述。
DAG (Directed Acyclic Graph)
有向無環圖,讓我們定義類似樹狀結構的工作流,可以應付一些有依賴關係的複雜任務,範例:
範例是一個典型的CI/CD描述,分別定義了兩個任務,一個是 build image,一個是部署到 staging 環境,而部署的任務內又給定了依賴關係,需要在 image build 完後才會執行。有了這層設置便可以描述較為複雜的樹狀工作流程,同時因為有明確的依賴關係定義,不管是從開發維護還是維運都更容易掌握每一個任務的執行時機與排錯,相較其它只用階段(Stage)來定義 Pipeline 的產品來看又增添了不少彈性跟穩定性。
迴圈、條件控制、重試、遞迴…等
我們已經透過上面幾個範例看到 Argo workflow 的各種彈性設計,很難想像地它竟如同寫程式一般也可以直接把迴圈、條件控制、重試及遞迴這些透過描述方式來定義工作流的每一項任務,正所謂族繁不及備載,本文也就不一一列舉了,官方的文件也足夠詳盡,有興趣朋友可以直接拜讀。
站在巨人的肩膀
Argo workflow 除了本身設計優秀之外,也因為兼容建置在強大的 Kubernetes 這套與原生雲密不可分的容器管理平台之上,使得它可以發揮更多的價值!
怎麼說呢?它支援在定義工作任務時直接調用 Kubernetes 上的資源,不管是 Volume、Secret、Job…等,甚至是系統本身的計算資源,允許任務可定義為系統後台運作達到跨工作流使用的效果,也可以定義 Sidecar 來輔助主要任務運行的容器。這些種種的功能設計也都印證了官方所宣稱的優勢,沒有公私有雲限制,基於 Kubernetes 平台就能擁有強大的容器生態工作流編排利器!
結語
由於 Argo workflow 功能過於強大,本文無法將其全部列舉,僅分享筆者本身覺得較泛用且吸引人的特點。誠如文章一開始提及的,不乏有相似可編排工作流的服務引擎,但 Argo 在各方面可以看得出設計上的彈性,即是為了推向更多的使用情境,不管是 Machine Learning、Data Processing、Stream Processing、CI/CD 或是 Infrastructure Automation 都可以透過它進行工作編排。
對筆者來說最吸引人的是與 Argo CD 一樣,有一個可以完整 monitor 的 UI Portal,將定義好的工作流程視覺化方便管理監看!雖然 Argo workflow 不是近期才推出的,但功能也是逐年演進優化,在這邊還是非常推薦大家深入去看看,說不定能帶來不同的啟發,甚至大大改善既有的工作流程。