argo workflows template

argo workflow & template

Workflow 的相关类型

Workflow

  • 定义: 是一个具体的工作流实例,描述了要执行的任务和步骤。
  • 使用: 可以直接包含 templates,或者引用 WorkflowTemplateClusterWorkflowTemplate

WorkflowTemplate

  • 定义: 是一个可重用的工作流模板,适用于同一命名空间内的多个工作流。
  • 使用: Workflow 可以引用 WorkflowTemplate 以使用其定义的步骤和任务。

ClusterWorkflowTemplate

  • 定义: 与 WorkflowTemplate 类似,但在集群范围内可用,适用于跨命名空间的工作流。
  • 使用: Workflow 可以引用 ClusterWorkflowTemplate,这使得模板在所有命名空间中都可用。

Templates

  • 定义: 是工作流中定义的实际可执行单元,可以是单个任务、步骤或 DAG。
  • 使用: 定义在 WorkflowWorkflowTemplateClusterWorkflowTemplate 中。templates 可以相互引用,支持复用和组合。

关系

  • Workflow 可以包含 templates 直接执行,也可以引用 WorkflowTemplateClusterWorkflowTemplate
  • WorkflowTemplateClusterWorkflowTemplate 提供了复用和参数化的能力,使得工作流定义更加灵活和可维护。
  • Templates 是工作流各组件的基本构建块,定义了具体的执行逻辑。

Workflow 的 yaml 解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: steps- # 自动生成工作流名称,以 steps- 开头。
spec:
entrypoint: hello # 指定工作流的起始模板是 hello。entrypoint和java的main方法类似,是Workflow的入口
templates:
- name: hello # 这个是hello模板,被entrypoint引用,
steps: # 这是一个步骤模板,定义了顺序执行的任务
- - name: hello
template: whalesay # 该步骤引用了名为 whalesay 的模板。
arguments: # 传递参数 message,其值为 "hello"。
parameters: [{name: message, value: "hello"}]

- name: whalesay # 这个是whalesay模板,被上面的hello模板中的hello步骤引用
inputs: # 定义输入参数
parameters:
- name: message
container: # 定义一个容器任务。说明whalesay模板是个容器模板
image: docker/whalesay # 使用 docker/whalesay 镜像。
command: [cowsay] # 执行 cowsay 命令,下面的{{}}获取上面的输入的参数
args: ["{{inputs.parameters.message}}"]

Template

Templates 有下面这几种。

Container Template

  • 用于定义要运行的容器任务。
  • 包含镜像、命令、参数等。
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: container-example-
spec:
entrypoint: container-example
templates:
- name: container-example
container:
image: alpine:latest
command: [echo]
args: ["Hello, World!"]

Script Template

  • 用于运行脚本。
  • 可以指定脚本语言和内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: script-example-
spec:
entrypoint: script-example
templates:
- name: script-example
script:
image: python:alpine
command: [python]
source: |
print("Hello, World!")

Steps Template

  • 用于定义一系列顺序执行的任务。
  • 每个步骤可以引用其他模板。
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
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: steps-example-
spec:
entrypoint: steps-example
templates:
- name: steps-example
steps:
- - name: step1
template: print-message
arguments:
parameters: [{name: message, value: "Hello"}]
- - name: step2
template: print-message
arguments:
parameters: [{name: message, value: "World"}]

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

DAG Template

  • 使用有向无环图定义任务之间的依赖关系。
  • 适合并行和条件执行。
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: dag-example-
spec:
entrypoint: dag-example
templates:
- name: dag-example
dag:
tasks:
- name: A
template: print-message
arguments:
parameters: [{name: message, value: "Task A"}]
- name: B
template: print-message
dependencies: [A]
arguments:
parameters: [{name: message, value: "Task B"}]

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

Resource Template

  • 用于创建、更新、删除 Kubernetes 资源。
  • 适用于操作外部资源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: resource-example-
spec:
entrypoint: resource-example
templates:
- name: resource-example
resource:
action: create
manifest: |
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
key: value

Suspend Template

  • 暂停工作流,等待手动恢复。
  • 适用于需要人工干预的步骤。
1
2
3
- name: delay
suspend:
duration: "20s"

参数传递

  • inputs:形参,申明该 template 需要使用哪些参数,可指定默认值
  • arguments:实参,为对应 template 中的参数赋值,会覆盖 inputs 提供的默认值

inputs 形式参数

1
2
3
4
5
6
7
8
9
templates:
- name: whalesay
inputs:
parameters:
- name: message
container:
image: docker/whalesay
command: [cowsay]
args: ["{{inputs.parameters.message}}"] # 直接获取上面inputs的参数

arguments 全局参数

1
2
3
4
arguments:
parameters:
- name: message # 下面引用{{workflow.parameters.message}}
value: "Hello from Workflow"

spec.arguments用于定义要传递的全局参数,全局参数在当前 Workflow 下的所有 Template 中都可以使用,可以使用 {{workflow.parameters.$name}} 语法来引用。

WorkflowTemplate

WorkflowTemplate就是 Workflow 的定义,WorkflowTemplate描述了这个流水线的详细信息,包括有哪些任务,任务之间的先后顺序等等。

在 Argo Workflows 中,工作流模板根据范围不同分为两种:WorkflowTemplateClusterWorkflowTemplate

WorkflowTemplate

  • 范围:仅限于命名空间。
  • 使用场景:适用于需要在同一命名空间内多次使用的模板。
  • 引用:只能在创建它的命名空间中引用。
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: WorkflowTemplate
metadata:
name: workflow-template-submittable #WorkflowTemplate的名字
spec:
workflowMetadata: #Template的元数据,由这个WorkflowTemplate创建的Workflow都会带有这个labels
labels:
dou: bao
entrypoint: whalesay-template #入口模板的名字
serviceAccountName: argo #将来执行Workflow的sa账号
arguments: #全局参数
parameters:
- name: message
value: wf-test-01
templates:
- name: whalesay-template #模板的名字,被入口引用
inputs:
parameters:
- name: message #模板的输入参数
value: twf-test-02
container:
image: docker/whalesay
command: [cowsay]
args: ["{{inputs.parameters.message}}"] #引用模板的入参

ClusterWorkflowTemplate

  • 范围:集群范围。
  • 使用场景:适用于需要跨多个命名空间共享的模板。
  • 引用:可以在集群的任何命名空间中引用。
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: ClusterWorkflowTemplate
metadata:
name: cluster-workflow-template-submittable #clusterWorkflowTemplate的名字
spec:
workflowMetadata: #Template的元数据,由这个clusterWorkflowTemplate创建的Workflow都会带有这个labels
labels:
dou: bao
entrypoint: whalesay-template #入口模板的名字
serviceAccountName: argo #将来执行Workflow的sa账号
arguments: #全局参数
parameters:
- name: message
value: wf-test-01
templates:
- name: whalesay-template #模板的名字,被入口引用
inputs:
parameters:
- name: message #模板的输入参数
value: twf-test-02
container:
image: docker/whalesay
command: [cowsay]
args: ["{{inputs.parameters.message}}"] #引用模板的入参

TemplateRef

上面创建的 WorkflowTemplate 可以在 Workflow 中使用 TemplateRef 引用对应的模板,这样 Workflow 对象就会比较干净

workflowTemplateRef

引用完整的 WorkflowTemplate,Workflow 中只需要指定全局参数即可。Workflow 和 WorkflowTemplate 需要在同一个命名空间

1
2
3
4
5
6
7
8
9
10
11
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: workflow-templateref-test- #由于是动态的名字,kubectl apply无法使用,可以使用kubectl create
spec:
arguments: #全局参数,如果写了就覆盖template中的,不写就用template默认的
parameters:
- name: message
value: "i am from workflow"
workflowTemplateRef:
name: workflow-template-submittable #引用上面的WorkflowTemplate的名字

clusterWorkflowTemplateRef

workflowTemplateRef类似,只需要增加 clusterScope: true 配置即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: cluster-workflow-template-ref-test-
spec:
entrypoint: whalesay
serviceAccountName: argo
templates:
- name: whalesay
steps: # 执行步骤
- - name: run-whalesay
templateRef:
name: cluster-workflow-template-submittable #引用的模板名字
template: whalesay-template # 模板中的具体模板
clusterScope: true # 设置true来引用clustertemplate
arguments: # 全局参数,设置就覆盖template中的,不设置就用template中默认的
parameters:
- name: message
value: "hello cluster template"

templateRef

引用WorkflowTemplate中的某一个template

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: workflow-templateref-test-
spec:
entrypoint: whalesay
serviceAccountName: argo
templates:
- name: whalesay
steps: # 执行步骤
- - name: call-whalesay-template
templateRef:
name: workflow-template-submittable # 引用的模板
template: whalesay-template # 模板中的具体模板
arguments: # 全局参数,设置就覆盖template中的,不设置就用template中默认的
parameters:
- name: message
value: "hello whalesay template "