文章插图
Workflow Overview
文章插图
在了解了 Argo 的三级定义后,我们首先来深入一下 Argo 中最为关键的定义,Workflow 。Workflow 是 Argo 中最重要的资源,有两个重要的功能:
- 定义了要执行的工作流 。
- 存储了工作流的状态 。
Workflow Template 的定义与 Workflow 几乎一致,除了类型不同 。正因为 Workflow 既可以是一个定义也可以是一个实例,所以才需要 WorkflowTemplate 作为 Workflow 的模板,WorkflowTemplate 在定义后可以通过提交(Submit)来创建一个 Workflow 。
而 Workflow 由一个 entrypoint 及一系列 template 组成,entrypoint 定义了这个 workflow 执行的入口,而 template 会实际去执行一个 Pod,其中,用户定义的内容会在 Pod 中以 Main Container 体现 。此外,还有两个 Sidecar 来辅助运行 。
Sidecar
在 Argo 中,这些 Sidecar 的镜像都是 argoexec 。Argo 通过这个 executor 来完成一些流程控制 。
Init
当用户的 template 中需要使用到 inputs 中的 artifact 或者是 script 类型时(script 类型需要注入脚本),Argo 都会为这个 pod 加上一个 Init Container —— 其镜像为 argoexec,命令是 argoexec init 。
在这个 Init Container 中,主要工作就是加载 artifact:
文章插图
Wait
除了 Resource 类型外的 template,Argo 都会注入一个 Wait Container,用于等待 Main Container 的完成并结束所有 Sidecar 。这个 Wait Container 的镜像同样为 argoexec,命令是 argoexec wait 。(Resource 类型的不需要是因为 Resource 类型的 template 直接使用 argoexec 作为 Main Container 运行)
文章插图
Inputs and Outputs
在运行 Workflow 时,一个常见的场景是输出产物的传递 。通常,一个 Step 的输出产物可以用作后续步骤的输入产物 。在 Argo 中,产物可以通过 Artifact 或是 Parameter 传递 。
Artifact
要使用 Argo 的 Artifact,首先必须配置和使用 Artifact 存储仓库 。具体的配置方式可以通过修改存有 Artifact Repository 信息的默认 Config Map 或者在 Workflow 中显示指定,详见 配置文档,在此不做赘述 。下表为 Argo 支持的仓库类型 。
文章插图
一个简单的使用了 Artifact 的例子如下:
文章插图
默认情况下,Artifact 被打包为 tar 包和 gzip 包,我们也可以使用 archive 字段指定存档策略 。
在上面的例子里,名为 whalesay 的 template 使用 cowsay 命令生成一个名为 /tmp/hello-world.txt 的文件,然后将该文件作为一个名为 hello-art 的 Artifact 输出 。名为 print-message 的 template 接受一个名为 message 的输入 Artifact,在 /tmp/message 的路径上解包它,然后使用 cat 命令打印 /tmp/message 的内容 。
在前面 Sidecar 介绍中提到过,Init Container 主要用于拉取 Artifact 产物 。这些 Sidecar 正是产物传递的关键 。下面,我们通过介绍另一种产物传递的方式来体验 Argo 中传递产物的关键 。
Scripts
先来看一个简单的例子:
文章插图
在上面的例子中,有两个类型为 script 的 template,script 允许使用 source 规范脚本主体 。这将创建一个包含脚本主体的临时文件,然后将临时文件的名称作为最后一个参数传递给 command(执行脚本主体的解释器),这样便可以方便的执行不同类型的脚本(bash、Python、js etc) 。
Script template 会将脚本的标准输出分配给一个名为 result 的特殊输出参数从而被其他 template 调用 。在这里,通过 {{
steps.generate.outputs.result}} 即可获取到名为 generate 的 template 的脚本输出 。
{{xxx}} 是 Argo 固定的变量替换格式:那么,容器内部应该如何获取这个脚本输出呢?
关于变量的格式详见文档,文档地址:
https://github.com/argoproj/argo/blob/master/docs/variables.md
关于变量替换的逻辑详见源码,源码地址:
https://github.com/argoproj/argo/blob/master/workflow/common/util.go#L305
推荐阅读
- 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用
- 放弃微服务,构建单体应用
- 如何通过抓包来查看Kubernetes API流量?
- 原生运行安卓App,真的比模拟器更加优越?
- Nginx 推出 Kubernetes 微服务参考架构
- 用Python构建API的八大流行框架
- Python构建代理池,突破IP的封锁爬取海量数据
- NVIDIA|NVIDIA更新GeForce Now:为Apple Silicon处理器提供原生支持
- 原生芦荟图鉴,芦荟价格表
- Prometheus + Granafa 构建MySQL监控平台