关于Argo Workflow
的流程数据传递方式,官方文档上提供的是三种方式:Parameters
、Artifacts
及Volume
。其中,通过共享Volume
传递数据方式官方只是提了个例子(https://argoproj.github.io/argo-workflows/examples/#volumes),来自于Kubernetes
基本功能,并不属于Argo Workflow
的自有特性。那么Argo Workflow
的Parameters
和Artifacts
功能特性底层又是怎么实现的呢,我们这里着重探究前两种流程数据传递方式的本质。
一、Parameters
Parameters
的参数传递分为两种,一种是不带Outputs
输出的Parameters
,另一种是带有Outputs
输出的Parameters
。
1、不带Outputs
输出的Parameters
这是 Argo Workflow
中最简单的方式,甚至都不用做任何的脚本执行解析。因为变量都直接通过Yaml
的形式配置到了Workflow
中,Argo Workflow Controller
中可以直接通过模板变量解析的方式即可将参数嵌入到命令行参数中。我们以官方示例steps.yaml
作为示例演示一下。
我们查看一下创建的Pod
情况:
hello1
节点的执行:
hello2a
节点的执行:
hello2b
节点的执行:
2、带有Outputs
输出的Parameters
这种情况会稍微复杂一些,因为会涉及到命令的执行以及执行结果的保存和传递。我们在之前的源码解析中有介绍到,在Wait Container
中等待Main Container
结束后,会根据Template
的配置决定是否将Template
的执行结果Json
化之后,通过Patch
方式写入到该Template
运行Pod
的MetaData.Annotation
中,随后其他依赖该Template
的Node会读取该MetaData.Annotation
,并解析该数据后存放到globalParams
中,并使用globalParams
做自身的模板变量替换,随后创建该Template Pod
。
Parameters
存储到MetaData.Annotations
:
在Argo Workflow Controller
中Template
使用MetaData.Annotations:
我们以官方实例output-parameter.yaml
作为示例演示一下。
执行后我们看看Pod
情况:
generate-parameter
执行结果的保存:
consumer-parameter
对于其他节点执行结果参数的输入:
二、Artifacts
Artifacts
会稍微复杂一些。Argo
默认使用minio
来对Artifacts
做存储和读取,并且Main Container
对于Atifacts
内容的操作原理都是基于共享Volume
。也就是说往往必须要挂载Volume
来使用Artifacts
,不过Volume
的挂载是由Argo Workflow Controller
自动帮我们实现的,我们并不能直接感知到。我们以官方示例artifact-passing.yaml
作为示例演示一下。
在generate-artifact
的节点Annotiations
中只有Artifacts
的输出路径及类型,真实的内容是保存到minio
中的:
在consume-artifact
节点中Init/Wait/Main Containers
挂载了相同的Volume
,因此可以共享Artifacts
数据。其中Init Container
负责将Artifacts
的内容拉取到本地的/argo/inputs/artifacts
路径下,随后Main Container
会读取/tmp/message
路径下的内容,这两个路径均是来自于相同的Volume (input-artifacts)
。