Argo Workflows の suspend 機能を活用した非同期実行
Argo Workflows と外部ジョブ連携による非同期処理には、ポーリングと suspend 機能による 2 つのアプローチが存在する。前者は外部ジョブの完了ステータスをポーリングするコンテナを Workflow 内に作成する方式。後者は suspend 機能を用いてワークフローを一時停止し、外部ジョブ完了後に再開する方式。本稿では、suspend 機能を用いた非同期実行について検証結果をまとめる。
環境
- minikube
- Argo Workflows v3.5.4
setup
Argo Workflows の公式ドキュメントに沿って minikube 上に Argo Workflows をセットアップする。
suspend 機能を使った非同期実行
公式ドキュメントに沿って suspend 機能を使った非同期実行を試してみる。
このパターンには 2 つのステップがある。最初のステップは、Argo の外部で長時間実行されるジョブ (HTTP 送信など) をトリガーする短時間実行のステップ。ここではcurl
のコマンドで外部 job を発火させるようなものを想定。2 番目のステップはワークフローの実行を一時停止し、外部ジョブの完了を待つ。外部ジョブの成否に応じて、Argo API を呼び出し Workflow を再開または停止(失敗)させる。
| 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
|
suspend 中はリソース消費が抑えられるため、ポーリング方式に比べ、suspend 機能を用いた非同期実行はリソース効率に優れると言える。