Argo Workflow
Argo Workflows 是一个开源项目,为 Kubernetes 提供 container-native 工作流程,其主要通过 Kubernetes CRD 实现的。
特点如下:
- 工作流的每一步都是一个容器
- 将多步骤工作流建模为一系列任务,或者使用有向无环图(DAG)描述任务之间的依赖关系
- 可以在短时间内轻松运行用于机器学习或数据处理的计算密集型作业
- 在 Kubernetes 上运行 CI/CD Pipeline,无需复杂的软件配置
安装
安装控制器端
Argo Wordflows 的安装非常简单,直接使用以下命令安装即可。
|
|
安装完成后,会生成以下 4 个 pod。
|
|
其中:
- argo-server 是 argo 服务端
- mino 是进行制品仓库
- postgres 是数据库
- workflow-controller 是流程控制器
然后配置一个 server 端的 ingress,即可访问 UI,配置清单如下(我这里使用的是 traefik):
|
|
UI 界面如下:
再配置一个 minio 的 ingress,配置清单如下:
|
|
UI 界面如下(默认用户名密码是:admin:password):
安装 Client 端
Argo Workflows 提供 Argo CLI,其安装方式也非常简单,如下: Linux 系统:
|
|
安装完成后,使用以下命令校验是否安装成功。
|
|
其主要的命令有:
|
|
更多命令可以使用argo --help进行查看。
然后可以使用一个简单的 hello world 的 WorkFlow,如下:
|
|
使用如下命令创建并观察 workflow。
|
|
然后可以看到以下输出。
|
|
还可以通过 argo list 来查看状态,如下:
|
|
使用 argo logs 来查看具体的日志,如下:
|
|
核心概念
Workflow
Workflow 是 Argo 中最重要的资源,其主要有两个重要功能:
- 它定义要执行的工作流
- 它存储工作流程的状态
要执行的工作流定义在Workflow.spec字段中,其主要包括templates和entrypoint,如下:
|
|
Templates
templates 是列表结构,主要分为两类:
- 定义具体的工作流
- 调用其他模板提供并行控制
定义具体的工作流
定义具体的工作流有 4 种类别,如下:
- Container
- Script
- Resource
- Suspend
Container
container 是最常用的模板类型,它将调度一个 container,其模板规范和 K8S 的容器规范相同,如下:
|
|
Script
Script 是 Container 的另一种包装实现,其定义方式和 Container 相同,只是增加了source字段用于自定义脚本,如下:
|
|
脚本的输出结果会根据调用方式自动导出到{{tasks.<NAME>.outputs.result}}或{{steps.<NAME>.outputs.result}}中。
Resource
Resource 主要用于直接在 K8S 集群上执行集群资源操作,可以 get, create, apply, delete, replace, patch 集群资源。如下在集群中创建一个 ConfigMap 类型资源:
|
|
Suspend
Suspend 主要用于暂停,可以暂停一段时间,也可以手动恢复,命令使用argo resume进行恢复。定义格式如下:
|
|
调用其他模板提供并行控制
调用其他模板也有两种类别:
- Steps
- Dag
Steps
Steps 主要是通过定义一系列步骤来定义任务,其结构是"list of lists",外部列表将顺序执行,内部列表将并行执行。如下:
|
|
其中 step1 和 step2a 是顺序执行,而 step2a 和 step2b 是并行执行。
还可以通过When来进行条件判断。如下:
|
|
提交这个 Workflow,执行效果如下:
除了使用 When 进行条件判断,还可以进行循环操作,示例代码如下:
|
|
提交 Workflow,输出结果如下:
Dag
Dag 主要用于定义任务的依赖关系,可以设置开始特定任务之前必须完成其他任务,没有任何依赖关系的任务将立即执行。 如下:
|
|
其中 A 会立即执行,B 和 C 会依赖 A,D 依赖 B 和 C。
然后运行一个示例看看效果,示例如下:
|
|
提交 workflow。
|
|
Variables
在 argo 的 Workflow 中允许使用变量的,如下:
|
|
首先在 spec 字段定义arguments,定义变量message,其值是hello world,然后在templates字段中需要先定义一个inputs字段,用于templates的输入参数,然后在使用"{{}}"形式引用变量。
变量还可以进行一些函数运算,主要有:
- filter:过滤
- asInt:转换为 Int
- asFloat:转换为 Float
- string:转换为 String
- toJson:转换为 Json
例子:
|
|
更多语法可以访问https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md进行学习。
制品库
在安装 argo 的时候,已经安装了 mino 作为制品库,那么到底该如何使用呢?
先看一个官方的例子,如下:
|
|
其分为两步:
- 首先生成制品
- 然后获取制品
提交 Workflow,运行结果如下:
然后在 minio 中可以看到生成的制品,制品经过了压缩,如下:
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。比如:
|
|
创建 WorkflowTemplate,如下
|
|
然后在 Workflow 中引用,如下:
|
|
ClusterWorkflowTemplate
ClusterWorkflowTemplate 创建的是一个集群范围内的 WorkflowTemplate,其他 workflow 可以引用它。
如下定义一个 ClusterWorkflow。
|
|
然后在 workflow 中使用templateRef去引用它,如下:
|
|
实践
上面大概叙述了一下 argo 的基本理论知识,更多的理论知识可以到官网去学习。
下面将使用一个简单的 CI/CD 实践,来了解一下用 argo workflow 应该如何做。
CI/CD 的整个流程很简单,即:拉代码->编译->构建镜像->上传镜像->部署。
定义一个 WorkflowTemplate,如下:
|
|
说明: 1、使用 kaniko 来创建镜像,不用挂载 docker.sock,但是 push 镜像的时候需要 config.json,所以首先需要创建一个 secret,如下:
|
|
2、准备好 storageClass,当然也可以不需要,直接使用 empty,不过可以将缓存文件这些持久化,可以加速构建(我上面没有做)。 3、创建 WorkflowTemplate,命令如下:
|
|
创建完成后,可以在 UI 界面看到刚创建的 WorkflowTemplate,如下:
4、创建 Workflow,可以手动创建,如下:
|
|
也可以直接在 UI 界面点击创建,我这里直接在 UI 界面点击创建。选择刚创建的 WorkflowTemplate,点击创建,如下:
然后就会生成一条 Workflow,如下:
点进去,可以看到每个具体的步骤,如下
点击每个具体的步骤,可以看日志,如下:
也可以在命令行界面看到 Workflow 的执行结果,如下:
初次使用到这里就结束了,后期会逐步去优化。
参考文档
-
No backlinks found.