Argo Workflows是一个开源项目,为Kubernetes提供container-native工作流程,其主要通过Kubernetes CRD实现的。

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第1张

什么是Argo Workflows?

Argo Workflows是一个开源项目,为Kubernetes提供container-native工作流程,其主要通过Kubernetes CRD实现的。

特点如下:

  • 工作流的每一步都是一个容器
  • 将多步骤工作流建模为一系列任务,或者使用有向无环图(DAG)描述任务之间的依赖关系
  • 可以在短时间内轻松运行用于机器学习或数据处理的计算密集型作业
  • 在Kubernetes上运行CI/CD Pipeline,无需复杂的软件配置

安装

安装控制器端

Argo Wordflows的安装非常简单,直接使用以下命令安装即可。

  1. kubectlcreatensargo
  2. kubectlapply-nargo-fhttps://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/quick-start-postgres.yaml

安装完成后,会生成以下4个pod。

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m

其中:

  • Argo-server是argo服务端
  • mino是进行制品仓库
  • postgres是数据库
  • workflow-controller是流程控制器

然后配置一个server端的ingress,即可访问UI,配置清单如下(我这里使用的是traefik):

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746

UI界面如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第2张

再配置一个minio的ingress,配置清单如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000

UI界面如下(默认用户名密码是:admin:password):

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第3张

安装Client端

Argo Workflows提供Argo CLI,其安装方式也非常简单,如下:Linux系统:

  1. #Downloadthebinary
  2. curl-sLOhttps://github.com/argoproj/argo/releases/download/v3.0.0-rc4/argo-linux-amd64.gz
  3. #Unzip
  4. gunzipargo-linux-amd64.gz
  5. #Makebinaryexecutable
  6. chmod+xargo-linux-amd64
  7. #Movebinarytopath
  8. mv./argo-linux-amd64/usr/local/bin/argo

安装完成后,使用以下命令校验是否安装成功。

  1. #argoversion
  2. argo:v3.0.0-rc4
  3. BuildDate:2021-03-02T21:42:55Z
  4. GitCommit:ae5587e97dad0e4806f7a230672b998fe140a767
  5. GitTreeState:clean
  6. GitTag:v3.0.0-rc4
  7. GoVersion:go1.13
  8. Compiler:gc
  9. Platform:linux/amd64

其主要的命令有:

  1. list列出工作流
  2. logs查看工作流的日志
  3. submit创建工作流
  4. watch实时监听工作流
  5. get现实详细信息
  6. delete删除工作流
  7. stop停止工作流

更多命令可以使用argo --help进行查看。

然后可以使用一个简单的hello world的WorkFlow,如下:

  1. apiVersion:argoproj.io/v1alpha1
  2. kind:Workflow
  3. metadata:
  4. generateName:hello-world-
  5. labels:
  6. workflows.argoproj.io/archive-strategy:"false"
  7. spec:
  8. entrypoint:whalesay
  9. templates:
  10. -name:whalesay
  11. container:
  12. image:docker/whalesay:latest
  13. command:[cowsay]
  14. args:["helloworld"]

使用如下命令创建并观察workflow。

  1. $argosubmit-nargohelloworld.yaml--watch

然后可以看到以下输出。

  1. Name:hello-world-9pw7v
  2. Namespace:argo
  3. ServiceAccount:default
  4. Status:Succeeded
  5. Conditions:
  6. CompletedTrue
  7. Created:MonMar0814:51:35+0800(10secondsago)
  8. Started:MonMar0814:51:35+0800(10secondsago)
  9. Finished:MonMar0814:51:45+0800(now)
  10. Duration:10seconds
  11. Progress:1/1
  12. ResourcesDuration:4s*(1cpu),4s*(100Mimemory)
  13. STEPTEMPLATEPODNAMEDURATIONMESSAGE
  14. ✔hello-world-9pw7vwhalesayhello-world-9pw7v5s

还可以通过argo list来查看状态,如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
0

使用argo logs来查看具体的日志,如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
1

核心概念

Workflow

Workflow是Argo中最重要的资源,其主要有两个重要功能:

  • 它定义要执行的工作流
  • 它存储工作流程的状态

要执行的工作流定义在Workflow.spec字段中,其主要包括templates和entrypoint,如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
2

Templates

templates是列表结构,主要分为两类:

  • 定义具体的工作流
  • 调用其他模板提供并行控制

定义具体的工作流

定义具体的工作流有4种类别,如下:

  • Container
  • Script
  • Resource
  • Suspend

Container

container是最常用的模板类型,它将调度一个container,其模板规范和K8S的容器规范相同,如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
3

Script

Script是Container的另一种包装实现,其定义方式和Container相同,只是增加了source字段用于自定义脚本,如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
4

脚本的输出结果会根据调用方式自动导出到{{tasks..outputs.result}}或{{steps..outputs.result}}中。

Resource

Resource主要用于直接在K8S集群上执行集群资源操作,可以 get, create, apply, delete, replace, patch集群资源。如下在集群中创建一个ConfigMap类型资源:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
5

Suspend

Suspend主要用于暂停,可以暂停一段时间,也可以手动恢复,命令使用argo resume进行恢复。定义格式如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
6

调用其他模板提供并行控制

调用其他模板也有两种类别:

  • Steps
  • Dag

Steps

Steps主要是通过定义一系列步骤来定义任务,其结构是"list of lists",外部列表将顺序执行,内部列表将并行执行。如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
7

其中step1和step2a是顺序执行,而step2a和step2b是并行执行。

还可以通过When来进行条件判断。如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
8

提交这个Workflow,执行效果如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第4张

除了使用When进行条件判断,还可以进行循环操作,示例代码如下:

  1. #kubectlgetpo-nargo
  2. NAMEREADYSTATUSRESTARTSAGE
  3. argo-server-574ddc66b-62rjc1/1Running44h25m
  4. minio1/1Running04h25m
  5. postgres-56fd897cf4-k8fwd1/1Running04h25m
  6. workflow-controller-77658c77cc-p25ll1/1Running44h25m
9

提交Workflow,输出结果如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第5张

Dag

Dag主要用于定义任务的依赖关系,可以设置开始特定任务之前必须完成其他任务,没有任何依赖关系的任务将立即执行。如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
0

其中A会立即执行,B和C会依赖A,D依赖B和C。

然后运行一个示例看看效果,示例如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
1

提交workflow。

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
2

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第6张

image.png

Variables

在argo的Workflow中允许使用变量的,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
3

首先在spec字段定义arguments,定义变量message,其值是hello world,然后在templates字段中需要先定义一个inputs字段,用于templates的输入参数,然后在使用"{{}}"形式引用变量。

变量还可以进行一些函数运算,主要有:

  • filter:过滤
  • asInt:转换为Int
  • asFloat:转换为Float
  • string:转换为String
  • toJson:转换为Json

例子:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
4

更多语法可以访问https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md进行学习。

制品库

在安装argo的时候,已经安装了mino作为制品库,那么到底该如何使用呢?

先看一个官方的例子,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
5

其分为两步:

  • 首先生成制品
  • 然后获取制品

提交Workflow,运行结果如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第7张

然后在minio中可以看到生成的制品,制品经过了压缩,如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第8张

WorkflowTemplate

WorkflowTemplate是Workflow的模板,可以从WorkflowTemplate内部或者集群上其他Workflow和WorkflowTemplate引用它们。

WorkflowTemplate和template的区别:

  • template只是Workflow中templates下的一个任务,当我们定义一个Workflow时,至少需要定义一个template
  • WorkflowTemplate是驻留在集群中的Workflow的定义,它是Workflow的定义,因为它包含模板,可以从WorkflowTemplate内部或者集群上其他Workflow和WorkflowTemplate引用它们。

在2.7版本后,WorkflowTemplate的定义和Workflow的定义一样,我们可以简单的将kind:Workflow改成kind:WorkflowTemplate。比如:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
6

创建WorkflowTemplate,如下

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
7

然后在Workflow中引用,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
8

ClusterWorkflowTemplate

ClusterWorkflowTemplate创建的是一个集群范围内的WorkflowTemplate,其他workflow可以引用它。

如下定义一个ClusterWorkflow。

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:argo-ui
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`argowork-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:argo-server
  14. port:2746
9

然后在workflow中使用templateRef去引用它,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000
0

实践

上面大概叙述了一下argo的基本理论知识,更多的理论知识可以到官网去学习。

下面将使用一个简单的CI/CD实践,来了解一下用argo workflow应该如何做。

CI/CD的整个流程很简单,即:拉代码->编译->构建镜像->上传镜像->部署。

定义一个WorkflowTemplate,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000
1

说明:

1、使用kaniko来创建镜像,不用挂载docker.sock,但是push镜像的时候需要config.json,所以首先需要创建一个secret,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000
2

2、准备好storageClass,当然也可以不需要,直接使用empty,不过可以将缓存文件这些持久化,可以加速构建(我上面没有做)。

3、创建WorkflowTemplate,命令如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000
3

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第9张

4、创建Workflow,可以手动创建,如下:

  1. apiVersion:traefik.containo.us/v1alpha1
  2. kind:IngressRoute
  3. metadata:
  4. name:minio
  5. namespace:argo
  6. spec:
  7. entryPoints:
  8. -web
  9. routes:
  10. -match:Host(`minio-test.coolops.cn`)
  11. kind:Rule
  12. services:
  13. -name:minio
  14. port:9000
4

也可以直接在UI界面点击创建,我这里直接在UI界面点击创建。选择刚创建的WorkflowTemplate,点击创建,如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第10张

然后就会生成一条Workflow,如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第11张

点进去,可以看到每个具体的步骤,如下

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第12张

点击每个具体的步骤,可以看日志,如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第13张

也可以在命令行界面看到Workflow的执行结果,如下:

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第14张

初次使用到这里就结束了,后期会逐步去优化。

参考文档

https://github.com/argoproj/argo-Workflows/releases

https://argoproj.github.io/argo-workflows

https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md

https://github.com/argoproj/argo-workflows/tree/master/examples

 详解Argo Workflows-Kubernetes的工作流引擎 Argo Workflows 开源 项目 第15张

转载请说明出处
知优网 » 详解Argo Workflows-Kubernetes的工作流引擎

发表评论

您需要后才能发表评论