コンテンツにスキップ

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 状態でワークフローが停止する。

suspend

一時停止中の pod の状態を確認すると、無駄な pod がないことがわかる。

1
2
3
4
5
6
7
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 機能を用いた非同期実行はリソース効率に優れると言える。