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
|
模板标签(也称为模板变量)是一种在运行时将数据替换到工作流中的方式。模板标签由分隔,并在模板执行时被替换。
可使用的标签取决于模板类型,同时存在一些全局标签可以使用,例如 {{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开始生成指定数量的整数。
start
和 end
: 指定序列的起始值和结束值(包括边界)。如果指定了 start
和 end
,则 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)