pipeline-frameworks-argo-01.入门简介

生命不止,框架不断。之前介绍过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 指定操作(creategetapplydeletereplacepatch),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. 任务与步骤的详细字段

stepsdag 中定义的每个具体任务,可使用以下字段丰富行为。

字段 可选值/示例 功能说明
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 和重试策略(如 AlwaysOnFailure)。
sidecars []Container 边车容器。为任务的主容器运行一个辅助容器,例如运行一个数据库容器供主容器测试使用。
daemon bool 守护进程。若设为 true,该任务容器会作为后台守护进程一直运行直到工作流结束。常用于启动服务供后续步骤调用。

5. 数据与变量系统

5.1 参数与构件

关键字 子字段/语法 功能说明
parameters - name: string, value: string 参数。传递小型的、键值对形式的字符串数据。可在 argumentsinputs/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 的 WorkflowWorkflowTemplate 等都是 CRD。
Labels/Annotations 键值对 标签和注解,用于为 Kubernetes 对象附加元数据,可用于选择、过滤和描述。
此文档涵盖了 Argo Workflows 配置中的绝大部分关键字段,可作为编写和理解工作流时的参考手册。
-------------本文结束感谢您的阅读-------------