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)