ARGO-工作流部署与管理工具
作者:不二小张
审稿:童蒙
编辑:amethyst
1 argo简介
基于Kubernetes,是用于调控容器本地工作流运行的引擎,支持DAG和基于步骤的工作流。
Argo 是 Applatix 推出的一个开源项目,为 Kubernetes 提供 container-native(工作流中的每个步骤是通过容器实现)工作流程,它为Kubernetes提供本地容器运行的工作流,并将工作流中的每个步骤作为容器实现。Argo允许用户使用类似于传统YAML的自定义DSL启动多步骤管道。该框架提供了复杂的循环、条件、与DAG的依赖关系管理等,这有助于提高部署应用程序堆栈的灵活性以及配置和依赖关系的灵活性。使用Argo,用户可以定义依赖关系、以编程方式构建复杂的工作流、用于将任何步骤的输出作为输入链接到后续步骤的工件管理,以及在易于阅读的UI中监视计划的作业。
2 argo组件
2.1 Argo Workflows
Argo Workflows(https://github.com/argoproj/argo)
2.2 Argo CD
Argo CD(https://github.com/argoproj/argo-cd):持续集成开发工具,与自动化工具和改进的工作流程集成的部署管道,可以最大程度地减少人为错误,并增强整个SDLC的反馈循环,使团队可以在更短的时间内交付较小的发行版;工厂里的装配线以快速、自动化、可重复的方式从原材料生产出消费品。同样,软件交付管道以快速、自动化和可重复的方式从源代码生成发布版本。如何完成这项工作的总体设计称为“持续交付”(CD)。启动装配线的过程称为“持续集成”(CI)。确保质量的过程称为“持续测试”,将最终产品提供给用户的过程称为“持续部署。
2.3 Argo Events
Argo Events(https://github.com/argoproj/argo-events):事件管理,是用于Kubernetes的基于事件的依赖管理器,它帮助您定义来自各种事件源(如webhook、s3、计划、工作流等)的多个依赖,并在成功解决事件依赖关系后触发Kubernetes对象。
2.4 Argo Rollouts
Argo Rollouts(https://github.com/argoproj/argo-rollouts):引入了一个称为卷展栏的新自定义资源,用于向Kubernetes提供额外的部署策略,如Blue Green and Canary。卷展栏自定义资源提供了与具有附加部署策略的部署资源对等的功能。(https://argoproj.github.io/argo-rollouts/)
3 workflow的实现
内部工作流实现机制
- 工作流是一个有向无环图(DAG)
算法工作流也是一个DAG,里面的一个点,就是一个step,目前的工作流,有简单到一个step就可以完成的,也有n多个step组成的。每个step,都会有对应的输入,也会有对应的输出,然后构成一个完整的pipeline。
-
基于声明式得有向无环图或者步骤工作流,可以支持工作流中各个步骤得依赖关系,目前只支持关系“与”,不支持关系“或”,所以上一步某个任务完成就触发下一步得工作流需要定制开发。
-
开发工作流
4 任务投递工具优劣比较
4.1 优势
- Argo专为容器而设计,没有传统VM和基于服务器的环境的开销和限制;
- Argo软件基于Kubernetes,是轻量级的,安装不到一分钟,但提供了完整的工作流功能,包括参数替换、工件、装置、循环和递归工作流;
- Argo是云不可知的,可以在任何kubernetes集群上运行;
- 在Kubernetes上轻松地编排高度并行的作业;
- Argo with Kubernetes让云量级的超级计算机触手可及;
- 在工作中遇到需要串联 n 个容器任务的情况,选择了 Argo 进行工作流程的控制;
- 新的Argo软件重量轻,安装不到一分钟,并提供完整的工作流功能,包括参数替换、工件、装置、循环和递归工作流;
- argo 是一个基于 kubernetes CRD 实现的一个 Workflow(工作流) 工具,基于 kubernetes 的调度能力实现了工作流的控制和任务的运行;
- 应用模板的概念,使得项目尽可能快的效率开发,并保持项目的可扩展性。
4.2 缺点
pipeline不支持关系“或”,详情查看扩展链接(https://blog.csdn.net/oqqYuan1234567890/article/details/104271124#j1)
5 AGS - 阿里
工具介绍
AGS 是阿里云基因服务的通用命令行工具, 目前主要集成 argo 功能并且适配阿里云各个产品的 addon功能命令,实现了对argo绝大部分功能的兼容。
参数详解
ags is the command line interface to Alibaba Cloud Genomics Compute Service
Usage:
ags [flags]
ags [command]
Available Commands:
add 增加node|-|ags add node
completion 为指定的shell输出shell完成代码|-|output shell completion code for the specified shell (bash or zsh)
config 设置ags客户端必需信息|-|setup ags client necessary info
delete 删除工作流及其关联的pod|-|delete a workflow and its associated pods
get 显示有关工作流的详细信息|-|display details about a workflow
help 弹出帮助文档|-|Help about any command
install 安装ags或者其他相关包|-|install ags
kubectl 使用kubectl命令|-|kubectl command
lint 验证工作流清单的文件或目录|-|validate a file or directory of workflow manifests
list 列出工作流|-|list workflows
logs 查看工作流日志|-|view logs of a workflow
remote 异地阿里云定制流程|-|remote aliyun custom process
resubmit 重新提交工作流|-|resubmit a workflow
resume 恢复工作流|-|resume a workflow
retry 重试工作流|-|retry a workflow
submit 提交工作流|-|submit a workflow
suspend 挂起工作流|-|suspend a workflow
terminate 终止工作流|-|terminate a workflow
uninstall 卸载ags|-|uninstall ags
version 打印版本信息|-|Print version information
wait 等待工作流完成|-|waits for a workflow to complete
watch 监视工作流直到它完成|-|watch a workflow until it completes
重要参数介绍
submit
功能描述:投递一个编订好任务的yaml文件
Flags:
file 描述pipeline的yaml文件
-o, --output string 日志输出|--|Output format. One of: name|json|yaml|wide
-p, --parameter stringArray pass an input parameter
-f, --parameter-file string pass a file containing all input parameters
-w, --wait 监控任务直到任务运行结束|--|wait for the workflow to complete
--watch watch the workflow until it completes
retry
功能描述:断点重投一个已经failed的workflow
Usage:
ags retry WORKFLOW [flags]
Flags:
-o, --output string Output format. One of: name|json|yaml|wide
-w, --wait wait for the workflow to complete
--watch watch the workflow until it completes
delete
功能描述:删除指定的任务工作流
Flags:
--all 删除所有在线工作流|-|Delete all workflows
--completed 删除完成运行的工作流|-|Delete completed workflows
--older string 删除一定时间前完成运行的工作流|-|Delete completed workflows older than the specified duration (e.g. 10m, 3h, 1d)
workflow_id 删除指定workflow_id
get
功能描述:描述指定的workflow任务每一步运行的状态
Flags:
workflow_id 获得指定workflow_id的运行状态与细节
--metrics 矩阵显示child_task and pods and CPU and memory 消耗|--|Show workflow metrics usage
--no-color 输出字符没有颜色标识|--|Disable colorized output
-o, --output string get到的信息输出格式类型|--|Output format. One of: json|yaml|wide
--show 展现出资源消耗的情况|--|Show workflow resource usage
--status string Filter by status (Pending, Running, Succeeded, Skipped, Failed, Error)
--sum-info Show workflow sum info
工具下载
由于大部分的生信软件具有Linux版本,所以以下仅介绍Linux环境下argo的安装
阿里的AGS工具安装:
wget http://ags-hub.oss-cn-hangzhou.aliyuncs.com/ags-linux && chmod +x ags-linux && mv ags-linux /usr/local/bin/ags
原生argo工具安装
curl -sLO https://github.com/argoproj/argo/releases/download/v2.7.0-rc4/argo-linux-amd64
chmod +x argo-linux-amd64
mv ./argo-linux-amd64 /usr/local/bin/argo
##安装成功后的校验
argo version
argo的模板-yaml文件格式定义
template 在 argo 中代表可运行的节点,一共有 6 种分类,分别是 Container,Script,Resource,Suspend,Steps,DAG。
Argo 中的工作流自动化是通过使用 ADSL(Argo 领域特定语言)设计的 YAML 模板(因为 Kubernetes 主要也使用相同的 DSL 方式,所以非常容易使用)进行驱动的。ADSL 中提供的每条指令都被看作一段代码,并与代码仓库中的源码一起托管。Argo 支持6中不同的 YAML 结构
Container Type(容器申明)
1简单示例
2- name: whalesay
3 container:
4 image: docker/whalesay:latest
5 command: [sh, -c]
6 args: ["echo -n hello world > /tmp/test.txt"]
Script Type(脚本执行内容申明)
1在 Container 的类型上面添加了一个 Source 字段来表示,且需要加入相应的执行环境
2name: print_number
3script:
4 image: python:alpine3.6
5 command: [python]
6 source: |
7 import random
8 [i*random.randont(1,10) for i in range(20, 31)]
Resource Type(资源申明)
1- container:
2 args:
3 - sh {{inputs.parameters.shell}} 1>{{inputs.parameters.shell}}.o.${MY_POD_NAME}
4 2>{{inputs.parameters.shell}}.e.${MY_POD_NAME}
5 command:
6 - sh
7 - -c
8 imagePullPolicy: IfNotPresent
9 resources:
10 limits:
11 cpu: 1.5
12 memory: 1.5Gi
13 requests:
14 cpu: 1.0
15 memory: 1Gi
Suspend Type(挂起申明)
1name: wait-end
2suspend: {}
Steps Type(步骤申明)
1描述一个当变量等于'tails'是执行函数名tails的段落,为'heads'执行heads的函数段落
2apiVersion: argoproj.io/v1alpha1
3kind: Workflow
4metadata:
5 generateName: coinflip-
6spec:
7 entrypoint: coinflip
8 templates:
9 - name: coinflip
10 steps:
11 - - name: flip-coin
12 template: flip-coin
13 - - name: heads
14 template: heads
15 when: "{{steps.flip-coin.outputs.result}} == heads"
16 - name: tails
17 template: tails
18 when: "{{steps.flip-coin.outputs.result}} == tails"
19
20 - name: flip-coin
21 script:
22 image: python:alpine3.6
23 command: [python]
24 source: |
25 import random
26 result = "heads" if random.randint(0,1) == 0 else "tails"
27 print(result)
28 - name: heads
29 container:
30 image: alpine:3.6
31 command: [sh, -c]
32 args: ["echo \"it was heads\""]
33
34 - name: tails
35 container:
36 image: alpine:3.6
37 command: [sh, -c]
38 args: ["echo \"it was tails\""]
DAG type(DAG 类型 workflow)
1#描述一个以下DAG依赖关系的workflow及其实现方法
2#
3# A
4# / \
5# B C
6# \ /
7# D
8apiVersion: argoproj.io/v1alpha1
9kind: Workflow
10metadata:
11 generateName: dag-diamond-
12spec:
13 entrypoint: diamond
14 templates:
15 - name: diamond
16 dag:
17 tasks:
18 - name: A
19 template: echo
20 arguments:
21 parameters: [{name: message, value: A}]
22 - name: B
23 dependencies: [A]#注释,模块B依赖A
24 template: echo
25 arguments:
26 parameters: [{name: message, value: B}]
27 - name: C
28 dependencies: [A]#注释,模块C依赖A
29 template: echo
30 arguments:
31 parameters: [{name: message, value: C}]
32 - name: D
33 dependencies: [B, C]#注释,模块D依赖B和C
34 template: echo
35 arguments:
36 parameters: [{name: message, value: D}]
37
38 - name: echo
39 inputs:
40 parameters:
41 - name: message
42 container:
43 image: alpine:3.7
44 command: [echo, "{{inputs.parameters.message}}"]
基于步骤依赖和基于DAG依赖的区别(https://blog.csdn.net/zzq900503/article/details/83589464)
参数传递区别
steps模式的使用传参方式是
{{steps.generate-parameter.outputs.parameters.hello-param}}
DAG templates模式 则使用 tasks 作为前缀与其他步骤关联
{{tasks.generate-artifact.outputs.artifacts.hello-art}}
任务运行流向区别
steps模式是按照步骤,从前往后的工作流调度方案。工作流中的每一步都只依赖上一步的结果。
DAG templates模式每一步可能依赖之前的多步输出,但是不会循环依赖。
相关链接
- github开源地址:(https://github.com/argopro)
- github官网:(https://argoproj.github.io)
- 下载和安装:(https://argoproj.github.io/docs/argo/docs/getting-started.html)
- 算法工作流-调度服务argo源码入门:(https://blog.csdn.net/oqqYuan1234567890/article/details/104271124)
- AGS-阿里云:(https://help.aliyun.com/document_detail/156348.html?spm=a2c4g.11186623.6.684.3b30688erUTNYV)
- Kubernetes 工作流引擎:Argo:(https://www.qikqiak.com/post/argo-workflow-engine-for-k8s)
- argo模板:(https://github.com/argoproj/argo/blob/master/examples)
- 算法工作流:(https://blog.csdn.net/oqqYuan1234567890/article/details/104271124#j1)
该文来源于“生信阿拉丁”,第一时间查收“新款”生信学习干货。