Argo Workflows の suspend 機能を使った非同期実行
Argo Workflows と外部の job を使って非同期処理するには二通りの方法がある。 一つ目の方法は、外部ジョブの完了ステータスをポーリングするコンテナを作成するもの。 二つ目の方法は、suspend 機能を使ってワークフローを一時停止し、外部ジョブの完了時に再開するもの。
このドキュメントでは suspend 機能を使った非同期実行を試してみた結果をまとめる。
環境
- minikube
- Argo Workflows v3.5.4
setup
Argo Workflows の公式ドキュメントに沿って minikube 上に Argo Workflows をセットアップする。
suspend 機能を使った非同期実行
公式ドキュメントに沿って suspend 機能を使った非同期実行を試してみる。
このパターンには 2 つのステップがある。最初のステップは、Argo の外部で長時間実行されるジョブ (HTTP 送信など) をトリガーする短時間実行のステップ。curl
のコマンドで 外部 job を発火させるようなものを想定。2 番目のステップはワークフローの実行を一時停止し、再開もしくは停止(失敗)させるステップ。Argo 外部のジョブが成功または失敗したときに Argo API を呼び出すことによって実行される。
| apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: external-job-template
spec:
entrypoint: run-external-job
arguments:
parameters:
- name: "job-cmd"
templates:
- name: run-external-job
inputs:
parameters:
- name: "job-cmd"
value: "{{workflow.parameters.job-cmd}}"
steps:
- - name: trigger-job
template: trigger-job
arguments:
parameters:
- name: "job-cmd"
value: "{{inputs.parameters.job-cmd}}"
- - name: wait-completion
template: wait-completion
arguments:
parameters:
- name: uuid
value: "{{steps.trigger-job.outputs.result}}"
- name: trigger-job
inputs:
parameters:
- name: "job-cmd"
container:
image: appropriate/curl:latest
command: ["/bin/sh", "-c"]
args: ["{{inputs.parameters.job-cmd}}"]
- name: wait-completion
inputs:
parameters:
- name: uuid
suspend: {}
|
上記のマニフェストを使ってワークフローを実行すると下記の図のように suspend された状態でワークフローが停止する。
一時停止中の pod の状態を確認すると、無駄な pod がないことがわかる。
| kubectl get po -n argo
NAME READY STATUS RESTARTS AGE
argo-server-7f6f746dc8-9ptj8 1/1 Running 0 17m
external-job-template-p6q2k-trigger-job-3484167944 0/2 Completed 0 76s
httpbin-6cf64fcd4f-wvrfs 1/1 Running 0 18m
minio-75b4dbbdb8-fgs54 1/1 Running 0 18m
workflow-controller-7d7f4f8f9c-nc5rk 1/1 Running 0 18m
|
一時停止中は無駄な pod がないので、suspend 機能を使った非同期実行はポーリングするコンテナを作成する方法よりも効率的にリソースを利用できる。