コンテンツにスキップ

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

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

一時停止中は無駄な pod がないので、suspend 機能を使った非同期実行はポーリングするコンテナを作成する方法よりも効率的にリソースを利用できる。