
作者 | 遙鹭、郡寶
導讀:近期,CNCF 技術監督委員會(Technical Oversight Committee,TOC)投票決定接受 Argo 作為孵化級别的托管項目。作為一個新加入的項目,Argo 主要關注于 Kubernetes 原生的工作流,持續部署等方面。
Argo 項目是一組 Kubernetes 原生工具集合,用于運作和管理 Kubernetes 上的作業和應用程式。它提供了一種在 Kubernetes 上建立工作和應用程式的三種計算模式 – 服務模式、工作流模式和基于事件的模式 – 的簡單組合方式。所有的 Argo 工具都實作為控制器和自定義資源。
阿裡雲容器服務是國内早期使用 argo workflow 的團隊之一。在落地生産過程中,解決了大量性能瓶頸,并且開發了較多功能回饋給社群,團隊成員也是 Argo 項目 Maintainer 之一。
Argo 項目:面向 K8s 的工作流
DAG (Directed acyclic graph,有向無環圖)是一個典型計算機圖論問題,可以用來模拟有互相依賴關系的資料處理任務,比如音視訊轉碼,機器學習資料流,大資料分析等。
Argo 最早是通過 workflow 在社群聞名。Argo Workflow 的項目名稱就是
Argo, 是 Argo 組織最初的項目。Argo Workflow 專注于 Kubernetes Native Workflow 設計,擁有聲明式工作流機制,能夠通過 CRD 的模式完全相容 Kubernetes 叢集,每個任務通過 Pod 的形式運作,Workflow 提供 DAG 等依賴拓撲,并且能夠通過 Workflow Template CRD 實作多個 Workflow 之間的組合與拼接。
上圖就是一個典型的 DAG 結構,Argo Workflow 可以根據使用者送出的編排模闆,很容易的建構出一個有互相依賴關系的工作流。Argo Workflow 就可以處理這些依賴關系,并且按照使用者設定的順序依次運作。
Argo CD 是另一個最近比較知名的項目。 Argo CD 主要面向 Gitops 流程,解決了通過 Git 一鍵部署到 Kubernetes 的需求,并且能夠根據版本辨別快速跟蹤,復原。Argo CD 還提供了多叢集部署功能,能夠打通多個叢集之間同一應用部署問題。
Argo Event 提供基于事件依賴關系的聲明式管理,以及基于各種事件源的 Kubernetes 資源觸發器。 Argo Events 的常見用法是觸發 Argo 工作流并為使用 Argo CD 部署的長期服務生成事件。
Argo Rollout 是為了解決多種部署形式而誕生的項目。Argo Rollout 能實作多種灰階釋出方式,同時結合 Ingress, Service Mesh 等方式完成流量管理與灰階測試。
Argo 各個子項目既可以單獨使用,也可以結合使用。一般而言,結合使用多個子項目能夠發揮 Argo 更大的能力,并且實作更多的功能。
使用 Argo 中遇到的問題與解決方法
阿裡雲最早落地的是 Argo Workflow,在使用 Argo Workflow 時第一個問題就是權限管理。Argo Workflow 每一個具體的任務都是通過 Pod 來執行,同時有一個 sidecar 容器來監聽主任務的進行。這裡的 sidecar 監聽方式是通過 mount docker.sock 來實作,這就繞過了 Kubernetes APIServer RBAC 機制,無法實作對于使用者權限的精确控制。我們與社群一起合作開發,實作了 Argo Kubernetes APIServer Native Executor 功能,sidecar 能夠通過 service account 監聽 APIServer 來擷取到主容器的動态與資訊,實作了 Kubernetes RBAC 的支援與權限收斂。
Argo Workflow 在 DAG 解析過程中,每一步都會根據 Workflow label 來掃描所有的 Pod 狀态,以此來決定是否需要進行下一步的動作。但是每一次掃描都是串行執行,當叢集中 Workflow 較多的時候,就會出現掃描速度緩慢,工作流的任務長時間等待的現象。基于此我們開發了并行掃描功能,将所有的掃描動作使用 goroutine 并行化,極大的加速了工作流執行效率。将原有需要 20 小時運作的任務,降低到 4 小時完成。此功能已經回饋給社群,并且在 Argo Workflow v2.4 版本釋出。
在實際生産中,Argo Workflow 執行的步數越多,占用的空間越多。所有的執行步驟均記錄在 CRD Status 字段裡面。當任務數量超過 1000 步的時候,就會出現單個對象過大,無法存儲進入 ETCD,或者會因為流量過大,拖垮 APIServer。我們與社群合作開發了狀态壓縮技術,能夠将 Status 進行字元串壓縮。壓縮後的 Status 字段大小僅為原來大小的 20 分之一,實作了 5000 步以上的大型工作流運作。
Argo 在基因資料處理場景的落地實踐
AGS(阿裡雲基因計算服務)主要應用于基因組測序二級分析,通過 AGS 加速 API 隻需要 15 分鐘即可完成一個 30X WGS 的基因比對、排序、去重、變異檢測全流程,相比經典流程可加速 120 倍,比目前全球最快的 FPGA/GPU 方案仍能提速 2-4 倍。
通過分析個體基因序列的突變機制,可為遺傳病檢測、惡性良性腫瘤篩查等提供有力支撐,未來将在臨床醫學和基因診斷方面發揮巨大作用。人類全基因組有約 30 億個堿基對,一個 30X 的 WGS 測序資料量大約在 100GB。AGS 在計算速度、精準度、成本、易用性、與上遊測序儀的整合度上具有極大優勢,同時适用于 DNA 的 SNP/INDEL 以及 CNV 結構變異檢測,以及 DNA/RNA 病毒檢測等場景。
AGS 工作流是基于 argo 實作的,為 Kubernetes 提供容器化的本地工作流程。工作流程中的每個步驟都定義為容器。
工作流引擎是作為 Kubernetes CRD(自定義資源定義)實作的。 是以,可以使用 kubectl 管理工作流,并與其它 Kubernetes 服務本地內建,例如 Volumes、Secrets 和 RBAC。 工作流控制器提供完整的工作流程功能,包括參數替換,存儲,循環和遞歸工作流程。
阿裡雲在基因計算場景下使用 Argo Workflow 在 Kubernetes 叢集上運作資料處理分析業務,能夠支援超過 5000 步以上的大型工作流,且能夠比傳統資料處理方式加速百倍。通過定制化的 Workflow 引擎,極大的便捷了基因資料處理的效率。
作者簡介
陳顯鹭,阿裡雲技術專家,深耕 Docker&Kubernetes 多年,是 Docker 多個項目的 Contributor, Kubernetes Group Member,《自己動手寫 Docker》作者。 專注于容器技術的編排與基礎環境研究。愛好折騰源代碼、熱愛開源文化并積極參與社群開源項目的研發。
郡寶,Kubernetes 項目貢獻者,Kubernetes 和 Kubernetes-sigs 社群成員。在容器、K8s 領域有多年的實踐經驗,目前就職于阿裡巴巴雲計算容器服務團隊,主要研究方向有容器存儲、容器編排 、 AGS 産品等領域.
AGS 試用連結:
https://help.aliyun.com/document_detail/156348.html“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”