ArgoWorkflow 教程(一)--DevOps 另一選擇?雲原生 CICD 初體驗

探索云原生發表於2024-08-06

argo-workflow-logol

本文主要記錄瞭如何在 k8s 上快速部署雲原生的工作流引擎 ArgoWorkflow。

ArgoWorkflow 是什麼

Argo Workflows 是一個開源的雲原生工作流引擎,用於在 Kubernetes 上編排並行作業。Argo 工作流作為Kubernetes CRD 實現。

  • 定義工作流,其中工作流中的每個步驟都是一個容器。
  • 將多步驟工作流建模為一系列任務,或使用 DAG 來捕獲任務之間的依賴關係圖。
  • 使用 Argo 可以在很短的時間內在 Kubernetes 上輕鬆執行機器學習或資料處理的計算密集型作業

一句話描述:ArgoWorkflow 是一個用於在 Kubernetes 上編排並行作業的開源雲原生工作流引擎

元件

相對於 Tekton 來說,ArgoWorkflow 元件比較少,整體架構比較簡單。

核心元件:

  • argo-server:為工作流提供 API 和 UI 介面。
  • workflow-controller:真正幹活的元件,解析使用者建立的 CR 物件並啟動 Pod 來真正執行流水線

部署

官方提供 helm chart 可以一鍵部署,完整命令如下:

# 新增參考並更新
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

# 部署
# -set server.authMode=server 配置切換認證模式,便於免token 登入 UI 介面
helm install argo-workflows argo/argo-workflows -n argo --create-namespace --set server.authMode=server

部署完成後會啟動兩個 Pod

[root@argo ~]# kubectl -n argo get po
NAME                                   READY   STATUS    RESTARTS   AGE
argo-server-84fd55bfc-hd6qp            1/1     Running   0          2m16s
workflow-controller-557756b7c8-blmp7   1/1     Running   0          2m16s

然後將 Service 切換為 NodePort 便於訪問

kubectl patch svc argo-workflows-server -n argo -p '{"spec": {"type": "NodePort"}}'

最後透過 NodePort 訪問即可,就像這樣:http://172.20.148.126:31691

[root@argo ~]# kubectl -n argo get svc argo-workflows-server
NAME                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
argo-workflows-server   NodePort   10.108.150.173   <none>        2746:31691/TCP   2m3s

UI 介面如下,整體和 ArgoCD 挺像的:

dashboard

Demo

簡單啟動一個 Workflow 測試一下 ArgoWorkflow 能否正常執行。

使用以下命令建立一個 Workflow 物件:

kubectl create -f - << EOF
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: steps-
spec:
  entrypoint: hello           # We reference our first "template" here
  templates:
  - name: hello               # The first "template" in this Workflow, it is referenced by "entrypoint"
    steps:                    # The type of this "template" is "steps"
    - - name: hello
        template: whalesay    # We reference our second "template" here
        arguments:
          parameters: [{name: message, value: "Hello ArgoWorkflow!"}]

  - name: whalesay             # The second "template" in this Workflow, it is referenced by "hello"
    inputs:
      parameters:
      - name: message
    container:                # The type of this "template" is "container"
      image: docker/whalesay
      command: [cowsay]
      args: ["{{inputs.parameters.message}}"]
EOF

功能也很簡單,就是列印 Hello ArgoWorkflow! 這句話。

檢視狀態

[root@argo ~]# kubectl get workflow
NAME          STATUS    AGE   MESSAGE
steps-75xmq   Running   6s

可以看到,當前處於 Running 狀態,不過這是一個非常簡單的任務,因此很快就會結束,時間應該是耗費在拉取映象上。

檢視 Pod 執行情況

[root@argo ~]# kubectl get po -w
NAME                              READY   STATUS            RESTARTS   AGE
steps-75xmq-whalesay-1542601109   0/2     PodInitializing   0          96s

看起來正在拉取映象,等一下

[root@argo ~]# kubectl get po
NAME                              READY   STATUS      RESTARTS   AGE
steps-75xmq-whalesay-1542601109   0/2     Completed   0          2m58s
[root@argo ~]# kubectl get workflow
NAME          STATUS      AGE    MESSAGE
steps-75xmq   Succeeded   3m6s

Pod 已經執行完成了,Workflow 也進行 Successed 狀態,檢視 Pod 日誌,確認是否真的執行了

[root@argo ~]# kubectl logs -f steps-75xmq-whalesay-1542601109
 _____________________
< Hello ArgoWorkflow! >
 ---------------------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/
time="2023-10-20T08:48:32.163Z" level=info msg="sub-process exited" argo=true error="<nil>"

可以看到,確實列印出了 "Hello ArgoWorkflow" 這句話,至此說明我們部署的 ArgoWorkflow 是能夠正常執行的。

到這裡 ArgoWorkflow 的部署就完成了,如果理解不了這個 demo 中做的事情也沒關係,後續會有 ArgoWorkflow 的使用教程,敬請期待~

下期預告:Workflow & Template 概念模型, 構建 ArgoWorkflow 流水線


【ArgoWorkflow 系列】持續更新中,搜尋公眾號【探索雲原生】訂閱,閱讀更多文章。


相關文章