ETJava Beta | Java    注册   登录
  • 搜索:
  • ArgoWorkflow 教程(一)--DevOps 另一选择?云原生 CICD 初体验

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/KubeExplorer/p/18344987
    如有侵权 请联系我们删除  (页面底部联系我们)  

    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 系列】持续更新中,搜索公众号【探索云原生】订阅,阅读更多文章。