[argo]argo templates

Argo Templates

1 Template Types

模板有几种类型,分为两个不同的类别:工作(work)和编排(orchestration)。

第一类定义了需要完成的工作。这包括:

  • 容器(container)
  • 容器集(container set)
  • 数据(data)
  • 资源(resource)
  • 脚本(script)

第二类编排工作:

  • 有向无环图(DAG)
  • 步骤(steps)
  • 暂停(suspend)

2 Container Template

一个完整的例子

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: container-
spec:
entrypoint: main
templates:
- name: main
container:
image: busybox
command: [echo]
args: ["hello world"]

运行上面定义的工作流

1
argo submit --serviceaccount argo-workflow --watch container-workflow.yaml

3 Template Tags

模板标签(也称为模板变量)是一种在运行时将数据替换到工作流中的方式。模板标签由分隔,并在模板执行时被替换。

可使用的标签取决于模板类型,同时存在一些全局标签可以使用,例如 {{workflow.name}} ,它会被工作流的名称所替换。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: template-tag-
spec:
entrypoint: main
templates:
- name: main
container:
image: busybox
command: [echo]
args: ["hello {{workflow.name}}"]

Workflow Variables - Argo Workflows - The workflow engine for Kubernetes

4 Work Templates

还有哪些类型的工作模板?

  • 容器集(container set)允许您在单个Pod中运行多个容器。当您希望这些容器共享一个共同的工作空间,或者希望将Pod的启动时间整合到工作流中的一个步骤时,这非常有用。
  • 数据(data)模板允许您从存储(例如S3)中获取数据。当每项数据代表一项需要完成的工作时,这非常有用。
  • 资源(resource)模板允许您创建一个Kubernetes资源并等待其满足某个条件(例如成功状态)。如果您希望与另一个Kubernetes系统(如AWS Spark EMR)进行互操作,这是很有用的。
  • 脚本(script)模板允许您在容器中运行脚本。这与容器模板非常相似,但在此基础上添加了脚本。

每种执行工作的模板都是通过运行一个Pod来完成的。您可以使用kubectl查看这些Pod:

kubectl get pods -l workflows.argoproj.io/workflow

可以通过workflows.argoproj.io/workflow标签识别工作流Pod。

5 DAG Template

DAG(有向无环图)模板是一种常见的编排模板。一个完整的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: a
template: echo
- name: b
template: echo
dependencies:
- a
- name: echo
container:
image: busybox
command: [ echo ]
args: [ "hello world" ]

在这个例子中,有两个模板:

  • “main” 模板是DAG。
  • “echo” 模板与容器示例中的模板相同。

这个DAG包含两个任务:”a” 和 “b”。两者都运行 “echo” 模板,但由于 “b” 依赖于 “a”,所以它不会启动,直到 “a” 成功完成。

增加一个c,依赖a和b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: a
template: echo
- name: b
template: echo
- name: c
template: echo
dependencies:
- a
- b
- name: echo
container:
image: busybox
command: [echo]
args: ["hello world"]

6 Loops

6.1 withItems

DAG允许使用withItems来遍历多个项目:

1
2
3
4
5
6
7
8
9
10
11
dag:
tasks:
- name: print-message
template: echo
arguments:
parameters:
- name: message
value: "{{item}}"
withItems:
- "hello world"
- "goodbye world"

在这个例子中,它将为列出的每个项目执行一次。我们可以在这里看到一个模板标签{{item}},它将被替换为”hello world”和”goodbye world”。DAG并行执行,会同时开始执行两个任务。

提交工作流的命令如下:

1
argo submit --serviceaccount argo-workflow --watch with-items-workflow.yaml

6.2 withSequence

可以使用withSequence来遍历一系列数字:

1
2
3
4
5
6
7
8
9
10
dag:
tasks:
- name: print-message
template: echo
arguments:
parameters:
- name: message
value: "{{item}}"
withSequence:
count: 5

运行

1
argo submit --serviceaccount argo-workflow --watch with-sequence-workflow.yaml

请注意,这里显示有5个Pod同时运行,并且它们的名字中包含了索引值(从零开始计数)。

基本语法

1
2
3
4
5
withSequence:
count: <number> # 或者使用 start 和 end 来指定范围
start: <start_number>
end: <end_number>
format: <format_string> # 可选,格式化输出
  • count: 如果只指定 count,它会从0开始生成指定数量的整数。
  • startend: 指定序列的起始值和结束值(包括边界)。如果指定了 startend,则 count 将被忽略。
  • format: 可选参数,用于格式化输出的字符串。可以使用Go语言的格式化规则(如 %v)。

指定范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: with-sequence-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: print-message
template: echo
arguments:
parameters:
- name: message
value: "{{item}}"
withSequence:
start: 10
end: 20

- name: echo
inputs:
parameters:
- name: message
container:
image: busybox
command: [echo]
args: ["{{inputs.parameters.message}}"]

7 Exit Handler

如果需要在某个任务完成后执行另一项任务,可以使用退出处理器。退出处理器通过onExit指定:

1
2
3
4
5
dag:
tasks:
- name: a
template: echo
onExit: tidy-up

这里只是指定了在退出时应运行的模板名称。

一个完整的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: exit-handler-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: a
template: echo
onExit: tidy-up

- name: echo
container:
image: busybox
command: [echo]
args: ["hello world"]

- name: tidy-up
container:
image: busybox
command: [echo]
args: ["tidy up!"]

workflow onExit

要将退出处理器改为在工作流结束时运行,而不是在单个模板结束后运行,您可以直接在工作流的顶级定义onExit处理器。下面是一个修改后的例子,展示了如何在工作流结束时执行一个退出处理器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: exit-handler-workflow-
spec:
entrypoint: main
onExit: workflow-exit-handler
templates:
- name: main
dag:
tasks:
- name: a
template: echo-message
arguments:
parameters: [{name: message, value: "Hello World"}]

- name: echo-message
inputs:
parameters:
- name: message
container:
image: alpine:latest
command: [echo]
args: ["{{inputs.parameters.message}}"]

- name: workflow-exit-handler
container:
image: alpine:latest
command: [sh, -c]
args: ["echo 'Workflow cleanup done.'"]

在这个修改后的示例中,onExit字段被移动到了工作流的顶级(即与entrypoint同级),并指定为workflow-exit-handler模板。这意味着无论main入口点内的任务是成功完成还是失败,都会在工作流结束时运行这个退出处理器。

退出处理器(Exit handlers - Argo Workflows - The workflow engine for Kubernetes)以及生命周期钩子(lifecycle hooks)(Lifecycle-Hook - Argo Workflows - The workflow engine for Kubernetes


[argo]argo templates
https://erlsrnby04.github.io/2025/03/17/argo-argo-templates/
作者
ErlsrnBy04
发布于
2025年3月17日
许可协议