生命不止,框架不断。之前介绍过snakemake和 wdl,今天介绍下argo。
Argo 是一个开源的云原生工作流引擎,专门设计用于在 Kubernetes 上编排和运行复杂的并行任务。其核心组件 Argo Workflows 允许你将工作流定义为 Kubernetes 自定义资源(CRD),每个步骤都是一个独立的容器,通过 YAML 声明任务依赖、并行逻辑和数据传递。Argo 天然与 Kubernetes 集成,支持动态并行、构件管理、重试策略等特性,适用于 CI/CD、机器学习、生物信息学等场景。
除了最核心的 Argo Workflows,此外还包括 Argo CD(持续交付)、Argo Events(事件驱动)、Argo Rollouts(高级部署策略)等,共同构成一套完整的云原生 DevOps 工具链。
Argo 的核心特点包括:
- 容器原生:工作流的每一步都是一个独立的 Kubernetes 容器,环境依赖被封装在镜像中,保证了可移植性和一致性。
- Kubernetes 原生:工作流定义为 Kubernetes CRD(自定义资源),可直接用 kubectl 管理,并充分利用 K8s 的调度、资源隔离和监控能力。
- DAG 编排:通过 YAML 声明任务之间的依赖关系,支持复杂的并行和条件分支,自动管理执行顺序。
- 动态并行:支持基于列表或前序步骤输出动态生成并行任务,适合大规模数据处理。
- 构件管理:内置对 S3、OSS 等对象存储的支持,可自动传递输入/输出文件,简化中间数据管理。
- 可视化界面:提供 Web UI 实时查看工作流状态、日志和资源消耗。
今天我们先初步认识下 Argo Workflows。首先我们了解一下它的关键字,argo是基于yaml格式的流程描述语言,通过关键字的整体情况,我们可以先建立一个整体的认识,大概知道这套flow可以做哪些事情。
Argo 的核心关键字
1. 顶层资源 (Top-Level Resources)
| 关键字 | 可选值 | 功能说明 |
|---|---|---|
Workflow |
- | 工作流实例。创建此对象会触发一次具体的工作流运行,状态实时更新,既代表定义也代表运行实例。 |
WorkflowTemplate |
- | 工作流模板。定义可复用的工作流蓝图,存储在集群中,可被多个 Workflow 引用,避免重复定义。 |
CronWorkflow |
- | 定时工作流。使用 Cron 语法设置计划,在指定时间自动重复运行工作流。 |
2. 工作流核心配置 (Workflow spec)
在 Kubernetes 和 Argo Workflows 中,spec 是 specification(规范)的缩写。它位于每个 Kubernetes 资源(如 Workflow、Pod、Deployment 等)的 YAML 定义中,用于描述您期望该资源达到的理想状态。简单来说,spec 就是资源的“配置说明书”——您在这里定义工作流如何运行、包含哪些步骤、使用什么参数、需要多少资源等。
| 关键字 | 可选值 | 功能说明 |
|---|---|---|
entrypoint |
string (模板名称) |
必须字段。指定工作流启动时第一个执行的 template 。 |
templates |
[]Template |
模板列表。定义工作流中所有可被调用的执行单元(模板)。 |
arguments |
{parameters: [], artifacts: []} |
工作流参数。定义传递给工作流的全局参数或构件,可在所有模板中引用。 |
onExit |
string (模板名称) |
退出处理器。指定在 entrypoint 执行完毕后(无论成功或失败)运行的模板,常用于清理或通知。 |
serviceAccountName |
string |
服务账户。指定运行工作流 Pod 时所使用的 Kubernetes 服务账户,用于权限控制。 |
volumeClaimTemplates |
[]PersistentVolumeClaim |
动态存储卷。为工作流动态创建持久卷声明(PVC),生命周期与工作流绑定,常用于在步骤间共享临时数据。 |
ttlStrategy |
{secondsAfterCompletion: int, ...} |
设置工作流完成后经过多长时间自动删除整个 Workflow 对象。例如 secondsAfterCompletion: 300 表示完成后 300 秒删除。 |
podGC |
{strategy: string} |
何时删除其创建的 Pod。strategy 可以是 OnPodCompletion(Pod 完成后立即删除)、OnWorkflowCompletion(工作流完成后删除)等。 |
3. 模板 (Template) 深度解析
template 是 Argo 的核心单元,可以是具体的执行动作,也可以是用于编排其他模板的步骤。
3.1 基础执行模板
具体的最小任务执行单元
| 关键字 | 可选值/子字段 | 功能说明 |
|---|---|---|
container |
遵循 Kubernetes Container spec | 容器模板。最常用,定义一个标准 Kubernetes 容器来执行任务,包括镜像、命令、参数、资源限制等。 |
script |
image, command, source |
脚本模板。Container 的便捷包装,允许在 source 中直接编写脚本(如 Bash、Python),Argo 会将其保存为文件并执行。 |
resource |
action, manifest |
资源模板。用于直接操作 Kubernetes 集群资源。action 指定操作(create、get、apply、delete、replace、patch),manifest 提供资源的 YAML 定义。 |
suspend |
{} 或 duration: string |
暂停模板。暂停工作流执行。若不指定 duration,将无限期暂停,需人工通过 argo resume 恢复;指定时长(如 "5m")则暂停指定时间后自动继续。 |
http |
url: string, method: string |
HTTP 模板(v3.0+)。发起一个 HTTP 请求作为工作流步骤。可设置请求方法、URL、头信息和请求体。 |
data |
source, transformation |
数据模板(v3.1+)。用于处理数据,例如从 S3 获取数据并进行转换、过滤等操作,无需编写脚本。 |
3.2 编排模板
当基础执行模板有多个时候,通过编排模板制定任务的执行逻辑顺序。
| 关键字 | 子字段/语法 | 功能说明 |
|---|---|---|
steps |
- - name: ... |
步骤模板。以序列方式组织任务。在 steps 下,用 - -(双横线)表示一个顺序执行的步骤组,用 -(单横线)表示多个任务并行。 |
dag |
tasks: [{name, template, dependencies}] |
DAG 模板。处理复杂依赖关系。在 tasks 下列出所有任务,并通过 dependencies 明确指定依赖任务。 |
4. 任务与步骤的详细字段
在 steps 或 dag 中定义的每个具体任务,可使用以下字段丰富行为。
| 字段 | 可选值/示例 | 功能说明 |
|---|---|---|
name |
string |
当前步骤或任务的名称,在同级中唯一,方便被其他步骤引用。 |
template |
string |
指定此任务要引用的模板名称。 |
arguments |
{parameters: [], artifacts: []} |
向引用的模板传递参数或构件,覆盖模板中定义的默认值。 |
dependencies (仅用于 DAG) |
[string] |
在 DAG 中,列出当前任务依赖的其他任务名称。只有列出的任务都成功完成后,当前任务才会开始。 |
withItems |
[string] 或 [map] |
循环执行。根据提供的列表,为列表中的每一项并行执行一次当前任务。例如:withItems: [1, 2, 3]。 |
withParam |
string (变量引用) |
动态循环。与 withItems 类似,但列表来自一个变量(如上一步的输出),实现更动态的并行处理。 |
when |
string (条件表达式) |
条件执行。只有满足指定的条件时,才会执行当前任务。例如:when: "{{workflow.status}} == Succeeded"。 |
continueOn |
{failed: true, error: true} |
失败容忍。配置当前任务在遇到特定失败(如子任务失败)时是否继续执行,而不是立即终止整个工作流。 |
retryStrategy |
{limit: int, retryPolicy: string} |
重试策略。任务失败时是否自动重试。可设置重试次数 limit 和重试策略(如 Always、OnFailure)。 |
sidecars |
[]Container |
边车容器。为任务的主容器运行一个辅助容器,例如运行一个数据库容器供主容器测试使用。 |
daemon |
bool |
守护进程。若设为 true,该任务容器会作为后台守护进程一直运行直到工作流结束。常用于启动服务供后续步骤调用。 |
5. 数据与变量系统
5.1 参数与构件
| 关键字 | 子字段/语法 | 功能说明 |
|---|---|---|
parameters |
- name: string, value: string |
参数。传递小型的、键值对形式的字符串数据。可在 arguments 或 inputs/outputs 中定义。 |
artifacts |
- name: string, path: string, s3/git/http: ... |
构件。传递大型文件或目录,如二进制模型、日志文件等。Argo 可将构件自动上传/下载到 S3、Git 等多种存储。 |
inputs |
parameters, artifacts |
模板输入。定义模板期望接收的参数和构件。在模板内部通过 {{inputs.parameters.name}} 等形式引用。 |
outputs |
parameters, artifacts |
模板输出。定义模板执行后产生的结果。例如,可将容器的输出文件声明为 outputs.artifacts,或将标准输出的一部分声明为 outputs.parameters.result 供后续步骤使用。 |
5.2 变量引用 (Variable References)
Argo 允许在 YAML 字符串中通过 {{ }} 引用各种上下文信息。
| 变量类型 | 示例 | 功能说明 |
|---|---|---|
| 工作流元数据 | {{workflow.name}}, {{workflow.namespace}}, {{workflow.parameters.message}}, {{workflow.status}} |
引用当前工作流的名称、命名空间、参数和执行状态等全局信息。 |
| 步骤/任务输出 | {{steps.previous-step.outputs.result}}, {{tasks.previous-task.outputs.parameters.my-param}} |
引用之前步骤或任务的输出结果或参数,是实现任务间数据传递的关键。 |
| 输入/输出 | {{inputs.parameters.message}}, {{outputs.artifacts.model.path}} |
在模板内部引用自己的输入,或获取自己输出的路径。 |
| 动态项 | {{item}} |
在 withItems 循环中,引用当前迭代项的值。如果迭代项是对象,可用 {{item.key}}。 |
6. Kubernetes 相关概念补充说明
Argo Workflows 深度集成 Kubernetes,以下概念在配置中经常出现,了解它们有助于更好地理解和使用 Argo。
| 概念 | 可选值/示例 | 功能说明 |
|---|---|---|
| Pod | - | Kubernetes 中最小的部署单元,包含一个或多个容器(如主容器和 sidecar 容器)。Argo 中的每个任务(template)通常运行在一个独立的 Pod 中。 |
| Container | 镜像名称、命令、资源等 | 容器是 Pod 内运行的轻量级、可执行的软件包。在 Argo 中,container 模板直接定义一个容器。 |
| PersistentVolumeClaim (PVC) | 存储大小、访问模式 | 持久卷声明,用于向集群请求存储资源。Argo 的 volumeClaimTemplates 可动态创建 PVC,供工作流中的 Pod 挂载使用。 |
| ServiceAccount | string |
服务账户,为 Pod 中的进程提供身份标识,用于访问 Kubernetes API 或其他云服务时的权限控制。 |
| Volume | 各种卷类型(emptyDir、hostPath、PVC 等) | 卷是 Pod 中容器可以访问的存储目录。Argo 中可通过 volumes 字段挂载临时或持久存储。 |
| Sidecar | []Container |
边车容器,与主容器一起运行在同一个 Pod 中,用于提供辅助功能(如日志收集、代理等)。 |
| Daemon | bool |
守护进程模式,使容器在后台持续运行,直到工作流结束,常用于启动服务供后续步骤调用。 |
| Resource requests/limits | requests: {cpu: "1", memory: "1Gi"}, limits: {...} |
资源请求与限制,指定容器需要的最低资源量和最大可用资源量,Kubernetes 根据这些值调度 Pod。 |
| Namespace | string |
命名空间,用于在 Kubernetes 集群中隔离资源。Argo 工作流运行在特定的命名空间中。 |
| Custom Resource Definition (CRD) | - | 自定义资源定义,允许用户扩展 Kubernetes API。Argo 的 Workflow、WorkflowTemplate 等都是 CRD。 |
| Labels/Annotations | 键值对 | 标签和注解,用于为 Kubernetes 对象附加元数据,可用于选择、过滤和描述。 |
| 此文档涵盖了 Argo Workflows 配置中的绝大部分关键字段,可作为编写和理解工作流时的参考手册。 |