之前我們分析了,Workflow、WorkflowTemplate 、template 3 者之間如何傳遞引數。
本文主要分析同一個 Workflow 中的不同 step 之間實現引數傳遞,比如將上一個步驟的輸出作為下一個步驟的結果進行使用(而非以檔案方式傳遞)。
1. 概述
然後就是之前只分析了 Workflow、WorkflowTemplate 、template 3 者之間如何傳遞引數,今天繼續分析一下步驟之間如何傳遞引數。
要實現步驟間引數傳遞,需要實現兩個功能:
-
1)匯出結果
-
2)匯入引數
基於之前的知識,要實現這兩個功能,可以想到的一種方式就是使用 artifact:
- 匯出結果:將引數寫入檔案,然後以 artifact 儲存到 s3
- 匯入引數:下一個 step 下載 artifact 並從中獲取引數。
確實可以實現功能,但是有點蹩腳,畢竟 artifact 主要是用於儲存檔案的。argoworkflow 中也直接提供了對應的 feature 來供大家使用。
2. 步驟間引數傳遞
- 將結果匯出為 Output Parameter
- 將上一步的 Output Parameter 匯入為當前步驟的 Input Parameter
完整 Demo 如下:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: output-parameter-
spec:
entrypoint: output-parameter
templates:
- name: output-parameter
steps:
- - name: generate-parameter
template: whalesay
- - name: consume-parameter
template: print-message
arguments:
parameters:
# Pass the hello-param output from the generate-parameter step as the message input to print-message
- name: message
value: "{{steps.generate-parameter.outputs.parameters.hello-param}}"
- name: whalesay
container:
image: docker/whalesay:latest
command: [sh, -c]
args: ["echo -n hello world > /tmp/hello_world.txt"] # generate the content of hello_world.txt
outputs:
parameters:
- name: hello-param # name of output parameter
valueFrom:
path: /tmp/hello_world.txt # set the value of hello-param to the contents of this hello-world.txt
- name: print-message
inputs:
parameters:
- name: message
container:
image: docker/whalesay:latest
command: [cowsay]
args: ["{{inputs.parameters.message}}"]
匯出結果
- name: whalesay
container:
image: docker/whalesay:latest
command: [sh, -c]
args: ["echo -n hello world > /tmp/hello_world.txt"] # generate the content of hello_world.txt
outputs:
parameters:
- name: hello-param # name of output parameter
valueFrom:
path: /tmp/hello_world.txt # set the value of hello-param to the contents of this hello-world.txt
首先是 step 的內容,這裡為了簡單,就只有一個 echo 命令,將結果(hello world)寫入到檔案
/tmp/hello_world.txt
中。
然後就是到處結果了:
outputs:
parameters:
- name: hello-param # name of output parameter
valueFrom:
path: /tmp/hello_world.txt # set the value of hello-param to the contents of this hello-world.txt
定義了一個 output 引數,名為 hello-param,該引數的 value 從 /tmp/hello_world.txt
檔案中獲取,最終得到的 value 就是之前寫入的 hello world
。
至此,我們就講當前步驟的結果匯出成了一個 Output Parameter,可以在後續步驟使用了。
匯入引數
後續步驟,其實很簡單,和普通步驟一樣的,透過 Input Parameter 定義引數,然後在使用的使用透過語法{{inputs.parameters.name}}
引用即可。
- name: print-message
inputs:
parameters:
- name: message
container:
image: docker/whalesay:latest
command: [cowsay]
args: ["{{inputs.parameters.message}}"]
唯一區別在於,這個引數的來源,之前我們都是直接講引數定義在 Workflow 中的,這裡需要改成引用之前步驟匯出的 Output Parameter,就像這樣:
spec:
entrypoint: output-parameter
templates:
- name: output-parameter
steps:
- - name: generate-parameter
template: whalesay
- - name: consume-parameter
template: print-message
arguments:
parameters:
# Pass the hello-param output from the generate-parameter step as the message input to print-message
- name: message
value: "{{steps.generate-parameter.outputs.parameters.hello-param}}"
在 arguments.parameters 中直接引用了之前步驟的 Output Parameter,語法為 {{steps.$stepName.outputs.parameters.$parameterName}}
。
之前我們匯出結果的步驟名為 generate-parameter,然後匯出的引數名為 hello-param,因此這裡就使用{{steps.generate-parameter.outputs.parameters.hello-param}}
來引用該引數。
內建的 result 引數
除了我們手動匯出的引數之外,ArgoWorkflow 還會預設生成一個 Output Parameter,他就是 result。
和其他 Output Parameter 一樣,可以透過 {{steps.$stepName.outputs.parameters.$parameterName}}
語法進行引用。
這個 result 引數會捕獲最大 256KB 的標準輸出作為 value,因此他可以包含以下內容:
- 1)script 的執行結果
- 2)容器的標準輸出
- 3)...
只要是在容器中輸出到標準輸出的,內容都可以被 result 捕獲。
【ArgoWorkflow 系列】持續更新中,搜尋公眾號【探索雲原生】訂閱,閱讀更多文章。
3. 小結
本文主要分析了 Argo 中的 Workflow 中怎麼傳遞引數還是比較簡單的:
- 1)透過 Output Parameter 匯出引數
- 2)在 arguments.parameters 中引用上一步匯出的引數
最後介紹了一下內建的 result Output Parameter ,可以用於獲取容器中的標準輸出。