参数化 - parameters

hello-world-parameters.yaml文件解析

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: hello-world-parameters-
  5. spec:
  6. entrypoint: whalesay # 调用 whalesay 模板
  7. arguments: # 传递给函数的参数
  8. parameters: # 声明参数
  9. - name: message # Key
  10. value: hello world # value
  11. templates:
  12. - name: whalesay # whalesay 模板
  13. inputs:
  14. parameters:
  15. - name: message
  16. container:
  17. image: docker/whalesay
  18. command: [cowsay]
  19. args: ["{{inputs.parameters.message}}"]

提交此工作流时,可以指定实际参数值

  1. [root@k8s-master01 argo]# argo submit -n argo arguments-parameters.yaml -p message="goodbye world"
  2. [root@k8s-master01 argo]# argo logs -n argo hello-world-parameters-xxx

自定义 Parameter 数据生产端和消费端

output 作为生产端信息输出给 input 作为信息消费端,以parameter参数的方式。

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: output-parameter-
  5. spec:
  6. entrypoint: output-parameter
  7. templates:
  8. - name: output-parameter
  9. steps:
  10. # 产生参数
  11. - - name: generate-parameter
  12. template: nginx
  13. # 消费参数
  14. - - name: consume-parameter
  15. template: print-message
  16. arguments:
  17. parameters:
  18. - name: message
  19. value: "{{steps.generate-parameter.outputs.parameters.nginx-index}}"
  20. # 生产模板 nginx
  21. - name: nginx
  22. container:
  23. image: nginx:latest
  24. # 输出 logs,不影响实际的消费信息
  25. command: [sh, -c]
  26. args: ["sleep 1; cat /usr/share/nginx/html/index.html"]
  27. # 输出生产信息
  28. outputs:
  29. parameters:
  30. - name: nginx-index
  31. # 检查 path 文件是否存在,如果不存在,则输出 "Foobar"
  32. valueFrom:
  33. default: "Foobar"
  34. # 输出文件内容,作为 print-message 的输入内容
  35. path: /usr/share/nginx/html/index.html
  36. # 消费模板 print-message
  37. - name: print-message
  38. inputs:
  39. parameters:
  40. - name: message
  41. container:
  42. image: alpine:latest
  43. # 输出 outputs 过来的信息
  44. command: [echo]
  45. args: ["{{inputs.parameters.message}}"]

生产端日志

消费端日志

steps 类型工作流

hello-hello-hello.yaml文件解析

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: steps- # Workflow 的名称前缀
  5. spec:
  6. entrypoint: hello-hello-hello # 表示第一个执行的模板名称,让工作流知道从哪个模板开始执行,类似于 main 函数
  7. # 该templates中有两个模板,分别是:hello-hello-hello和whalesay
  8. templates:
  9. - name: hello-hello-hello # 第一个模板 hello-hello-hello
  10. steps: # template 的类型是 steps
  11. # 一个 template 有多种类型,分别为:container、script、dag、steps、resource、suspend
  12. - - name: hello1 # 在 steps 类型中,[--] 表示顺序执行,[-] 表示并行执行
  13. template: whalesay # 引用 whalesay 模板
  14. arguments: # 传递给函数的参数
  15. parameters: # 声明参数
  16. - name: message # Key
  17. value: "hello1" # value
  18. - - name: hello2a # [--] 顺序执行
  19. template: whalesay
  20. arguments:
  21. parameters:
  22. - name: message
  23. value: "hello2a"
  24. - name: hello2b # [-] 表示跟上一步并行运行
  25. template: whalesay
  26. arguments:
  27. parameters:
  28. - name: message
  29. value: "hello2b"
  30. - name: whalesay # 第二个模板 whalesay
  31. inputs: # input、output 实现数据交互
  32. parameters:
  33. - name: message
  34. container:
  35. image: docker/whalesay # 镜像名称
  36. command: [cowsay] # 执行命令
  37. args: ["{{inputs.parameters.message}}"] # 参数引用

上面的工作流规范打印了三种不同的“hello”。hello-hello-hello模板由三个步骤组成。名为hello1的第一步将按顺序运行,而名为hello2a和hello2b的后面两个步骤将并行运行。使用argo CLI命令,我们可以图形化地显示这个工作流规范的执行历史,它显示了名为hello2a和hello2b的步骤彼此并行运行。

DAG工作流

作为指定步骤序列的另一种方法,您可以通过指定每个任务的依赖关系来将工作流定义为有向无环图(DAG)。对于复杂的工作流,这可以更容易维护,并且在运行任务时允许最大程度的并行性。

在下面的工作流中,步骤A首先运行,因为它没有依赖项。一旦A完成,步骤B和步骤C将并行运行。最后,一旦BC完成,步骤D就可以运行了。

dag-diamond.yaml文件解析

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: dag-diamond-
  5. spec:
  6. entrypoint: diamond
  7. # 分别有 echo 和 diamond 两个模板
  8. templates:
  9. - name: echo
  10. inputs:
  11. parameters: # 声明参数
  12. - name: message
  13. container:
  14. image: alpine:3.7
  15. command: [echo, "{{inputs.parameters.message}}"]
  16. # 入口点模板
  17. - name: diamond
  18. # DAG声明
  19. dag:
  20. tasks:
  21. - name: A
  22. template: echo
  23. arguments:
  24. parameters: [{name: message, value: A}]
  25. - name: B
  26. # 任务B依赖于任务A
  27. dependencies: [A]
  28. template: echo
  29. arguments:
  30. parameters: [{name: message, value: B}]
  31. - name: C
  32. dependencies: [A]
  33. template: echo
  34. arguments:
  35. parameters: [{name: message, value: C}]
  36. - name: D
  37. # 任务D同时依赖于任务B、C
  38. dependencies: [B, C]
  39. template: echo
  40. arguments:
  41. parameters: [{name: message, value: D}]

Artifacts 工作流

通过 input/output 以及 artifacts 实现 Job 之间数据传递。

在工作流中,某些步骤产生或者消费构件,是很常见的需求。通常,前一环节的输出构件,用作下一环节的输入构件。

下面的例子包含两个Step,前一个步骤产生构件供后一个消费。

artifact-passing.yaml文件解析

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: artifact-passing-
  5. spec:
  6. entrypoint: artifact-example
  7. templates:
  8. - name: artifact-example
  9. steps:
  10. # 产生构件
  11. - - name: generate-artifact
  12. template: whalesay
  13. # 消费构件
  14. - - name: consume-artifact
  15. template: print-message
  16. arguments:
  17. artifacts:
  18. # 绑定构件名message到generate-artifact,输出制品库 hello-art 内容
  19. - name: message
  20. from: "{{steps.generate-artifact.outputs.artifacts.hello-art}}"
  21. # 此模板产生构件
  22. - name: whalesay
  23. container:
  24. image: docker/whalesay:latest
  25. command: [sh, -c]
  26. args: ["cowsay hello world | tee /tmp/hello_world.txt"]
  27. # 输出构件声明
  28. outputs:
  29. artifacts:
  30. - name: hello-art # 生成制品共享 hello-art
  31. path: /tmp/hello_world.txt # 把这个文件打包后上传到制品库中
  32. # 此模板消费构件
  33. - name: print-message
  34. # 输入构件声明
  35. inputs:
  36. artifacts:
  37. - name: message
  38. path: /tmp/message
  39. container:
  40. image: alpine:latest
  41. command: [sh, -c]
  42. args: ["cat /tmp/message"]

生产信息

消费信息

Scripts & Results

很多情况下,我们仅仅希望 Template 来执行一个脚本:

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: scripts-bash-
  5. spec:
  6. entrypoint: bash-script-example
  7. templates:
  8. - name: bash-script-example
  9. steps:
  10. - - name: generate
  11. # 调用其中一个模板,分别有 gen-random-int-bash、python、javascript
  12. template: gen-random-int-python
  13. - - name: print
  14. template: print-message
  15. arguments:
  16. parameters:
  17. - name: message
  18. # 引用 result 此特殊的输出参数
  19. value: "{{steps.generate.outputs.result}}"
  20. - name: gen-random-int-bash
  21. # 在 script 关键字的 source 标签中,可以编写脚本
  22. # script 还导致执行脚本时的标准输出,保存为名为 result 的特殊输出参数
  23. script:
  24. image: debian:9.4
  25. command: [bash]
  26. # Shell 脚本随机生成一个数值
  27. source: |
  28. cat /dev/urandom | od -N2 -An -i | awk -v f=1 -v r=100 '{printf "%i\n", f + r * $1 / 65536}'
  29. - name: gen-random-int-python
  30. script:
  31. image: python:alpine3.6
  32. command: [python]
  33. # Python 脚本随机生成数值
  34. source: |
  35. import random
  36. i = random.randint(1, 100)
  37. print(i)
  38. - name: gen-random-int-javascript
  39. script:
  40. image: node:9.1-alpine
  41. command: [node]
  42. # JS 脚本随机生成数值
  43. source: |
  44. var rand = Math.floor(Math.random() * 100);
  45. console.log(rand);
  46. # 输出随机数模板 print-message
  47. - name: print-message
  48. inputs:
  49. parameters:
  50. - name: message
  51. container:
  52. image: alpine:latest
  53. command: [sh, -c]
  54. args: ["echo result was: {{inputs.parameters.message}}"]

generate 模板调用 gen-random-int-python 任务随机生成个50数值,print 模板利用result特殊参数调用输出,如图所示。

退出处理器工作流

Exit handler是一种必然会在工作流结尾执行的模板,不论工作流执行成功与否。它的运用场景包括:

  • 工作流运行后清理
  • 发送工作流状态的通知(例如,电子邮件/Slack)
  • 将成功/失败状态传递为 Webhook 结果(例如GitHub Build Result)
  • 重新提交工作流 或 提交另外一个工作流
  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: exit-handlers-
  5. spec:
  6. entrypoint: intentional-fail
  7. # 在工作流的末尾调用退出处理程序模板
  8. onExit: exit-handler
  9. templates:
  10. # 工作流主模板
  11. - name: intentional-fail
  12. container:
  13. image: alpine:latest
  14. command: [sh, -c]
  15. # exit 1 表示工作流异常退出,exit 0 表示工作流成功退出
  16. args: ["echo intentional failure; exit 1"]
  17. # 退出处理器模板
  18. # 主模板完成后,工作流状态可以通过全局变量{{workflow.status}}获取,其值是Succeeded, Failed, Error之一
  19. - name: exit-handler
  20. steps:
  21. # 无论工作流是否成功,都会调用 send-email 模板
  22. - - name: notify
  23. template: send-email
  24. # 如果工作流等于 Succeeded,才会调用 celebrate 模板
  25. - name: celebrate
  26. template: celebrate
  27. when: "{{workflow.status}} == Succeeded"
  28. # 如果工作流不等于 Succeeded,则会调用 cry 模板
  29. - name: cry
  30. template: cry
  31. when: "{{workflow.status}} != Succeeded"
  32. # send-email 模板信息
  33. - name: send-email
  34. container:
  35. image: alpine:latest
  36. command: [sh, -c]
  37. # 输出工作流名称和工作流状态
  38. args: ["echo send e-mail: {{workflow.name}} {{workflow.status}}"]
  39. # celebrate 模板信息
  40. - name: celebrate
  41. container:
  42. image: alpine:latest
  43. command: [sh, -c]
  44. args: ["echo hooray!"]
  45. # cry 模板信息
  46. - name: cry
  47. container:
  48. image: alpine:latest
  49. command: [sh, -c]
  50. args: ["echo boohoo!"]

接下来分别演示工作流成功和不成功所执行的任务,只需要更改exit 0/1状态码即可。

演示工作流不成功:

演示工作流成功:

简单的将官方案例进行实践和配置详细解析,欢迎有研究Argo的大佬们一起交流交流,多多指教!

Argo workflow 案例练习和配置详细解析的更多相关文章

  1. Linux系统下ssh的相关配置详细解析

    Linux系统下ssh的相关配置进行了详细的分析介绍. ssh是大家常用的登录linux服务器的方式,但是为了安全考虑,有时候我们需要针对ssh做一些特殊处理,本文记录笔者曾经做过的一些修改,供大家参 ...

  2. redis.conf配置详细解析

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  3. nginx配置详细解析

    转自 http://blog.csdn.net/zhongguozhichuang/article/details/528168871.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将 ...

  4. Redis 中 redis.conf配置详细解析

    ########################################### 基本配置 ##################################### # 端口 port 666 ...

  5. redis配置详细解析

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等: # # 1k => 1000 bytes # 1kb = ...

  6. Nginx配置详细解析(全)

    一.nginx.conf文件结构 (1)共三部分:由全局块.events块.http块组成.http块又包含http全局块.server块:server块由多个location块组成. (2)一般情况 ...

  7. C# Memcache集群原理、客户端配置详细解析

    概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...

  8. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  9. 云原生流水线 Argo Workflow 的安装、使用以及个人体验

    注意:这篇文章并不是一篇入门教程,学习 Argo Workflow 请移步官方文档 Argo Documentation Argo Workflow 是一个云原生工作流引擎,专注于编排并行任务.它的特 ...

随机推荐

  1. WinMain是如何被调用的

    WinMain函数 WinMain函数原型 Win32应用程序的入口函数为WinMain,函数原型在WinBase.h文件中: int WINAPI WinMain (     _In_ HINSTA ...

  2. HDU 1754 I Hate It(线段数-单点更新)

    原题链接:I Hate It 题目分析:这个是线段树的基本操作--更新和查询,属于基础题,也就相当于一个模板吧,这里就不再多说了. 代码如下:(PS:特别注意--输入输出用  不然会超时) #incl ...

  3. php反序列化之pop链构造

    本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...

  4. Java 集合详解 | 一篇文章解决Java 三大集合

    更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...

  5. css3中transition属性详解

    css3中通过transition属性可以实现一些简单的动画过渡效果~ 1.语法 transition: property duration timing-function delay; transi ...

  6. 自旋锁-JUC系列

    公众号原文:自旋锁-JUC系列 前言 2022!这个年份现在看起来都觉得有那么些恍惚的未来感,然而现在已在脚下. 无边落木萧萧下, 不尽长江滚滚来! 人生如白驹过隙! 本来计划最近把AQS源码分析做了 ...

  7. 虚拟化架构与Centos7系统部署

    1.什么是虚拟化(Virtualization) 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可 ...

  8. tarjan全家桶

    tarjan 全家桶 关于tarjan 它太强了 CCCOrz dfs树&low dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树.于是图上所有点都被这棵树包含,一部分边被包 ...

  9. python if-elif-else 判断

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 age=12 if age<4: price=0 elif age<18: price=40 elif ...

  10. Let's Encrypt 证书 wget 报错

    最近发现一个奇怪的问题,网站使用 let's encrypt 的免费证书,浏览器访问时正常,但是wget的时候报错.报错信息如下: wget https://www.example.com --202 ...