すべてのプロダクト
Search
ドキュメントセンター

Elastic Container Instance:ECI での Argo ワークフローの実行

最終更新日:Jun 22, 2026

サーバーレス Kubernetes は Pod レベルの弾力性を提供し、数秒以内の起動、秒単位の課金、毎分 2,000 Pod という高い同時実行性などの利点があります。そのため、Argo の実行環境としてますます人気が高まっています。このトピックでは、Alibaba Cloud Container Service for Kubernetes (ACK) クラスターを使用して、Elastic Container Instance (ECI) 上で Argo ワークフローを実行する方法について説明します。

Kubernetes と Argo のセットアップ

  1. Alibaba Cloud サーバーレス Kubernetes クラスターをセットアップします。

  2. Kubernetes クラスターに Argo をデプロイします。

    • (推奨) ack-workflow コンポーネントをインストールします。詳細については、「Argo Workflows」をご参照ください。

    • Argo を手動でデプロイします。詳細については、「Argo クイックスタート」をご参照ください。

  3. Argo CLI をインストールします。詳細については、「argo-workflows」をご参照ください。

基本リソース構成の最適化

デフォルトでは、Argo をデプロイした後、argo-server および workflow-controller コアコンポーネントの Pod にはリソースリクエストとリミットが指定されていません。これにより、Pod には低いサービス品質 (QoS) クラスが割り当てられ、クラスターリソースが不足した場合に Out of Memory (OOM) キルや Pod のエビクションが発生しやすくなります。クラスターの規模に応じて、これら 2 つのコンポーネント Pod の resources を調整することを推奨します。手始めに、リクエストまたはリミットを 2 vCPU および 4 GiB メモリ以上に設定します。

アーティファクトリポジトリとしての OSS の使用

デフォルトでは、Argo は MinIO をアーティファクトリポジトリとして使用します。本番環境では、アーティファクトリポジトリの安定性が非常に重要です。ack-workflow コンポーネントは、Alibaba Cloud Object Storage Service (OSS) を永続的で信頼性の高いアーティファクトリポジトリとして使用することをサポートしています。OSS をアーティファクトリポジトリとして設定する方法については、「Configuring Alibaba Cloud OSS」をご参照ください。

設定が完了したら、次の例を使用してワークフローを作成し、設定を検証します。

  1. 次の内容を workflow-oss.yaml として保存します。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: artifact-passing-
    spec:
      entrypoint: artifact-example
      templates:
      - name: artifact-example
        steps:
        - - name: generate-artifact
            template: whalesay
        - - name: consume-artifact
            template: print-message
            arguments:
              artifacts:
              # bind message to the hello-art artifact
              # generated by the generate-artifact step
              - name: message
                from: "{{steps.generate-artifact.outputs.artifacts.hello-art}}"
      - name: whalesay
        container:
          image: docker/whalesay:latest
          command: [sh, -c]
          args: ["cowsay hello world | tee /tmp/hello_world.txt"]
        outputs:
          artifacts:
          # generate hello-art artifact from /tmp/hello_world.txt
          # artifacts can be directories as well as files
          - name: hello-art
            path: /tmp/hello_world.txt
      - name: print-message
        inputs:
          artifacts:
          # unpack the message input artifact
          # and put it at /tmp/message
          - name: message
            path: /tmp/message
        container:
          image: alpine:latest
          command: [sh, -c]
          args: ["cat /tmp/message"]
  2. ワークフローを作成します。

    argo -n argo submit workflow-oss.yaml
  3. ワークフローの実行結果を表示します。

    argo -n argo list

    想定される出力:

    s@xxxxxxxxxid:~$ argo -n argo list
    NAME                    STATUS      AGE   DURATION   PRIORITY   MESSAGE
    artifact-passing-2746t  Succeeded   3m    30s        0

エグゼキュータの選択

各 Argo ワーカー Pod には、少なくとも 2 つのコンテナが含まれています:

  • main コンテナ

    これは、ビジネスロジックが実行されるアプリケーションコンテナです。

  • wait コンテナ

    Argo はこのシステムコンポーネントをサイドカーとして Pod に挿入します。その主な責務は次のとおりです:

    • 起動フェーズ

      • main コンテナが依存するアーティファクトと入力をロードします。

    • 実行フェーズ

      • main コンテナが終了するのを待ち、関連するサイドカーコンテナを強制終了します。

      • main コンテナから出力とアーティファクトを収集し、そのステータスを報告します。

エグゼキュータは、wait コンテナが main コンテナにアクセスして制御するためのブリッジとして機能します。Argo はこれを ContainerRuntimeExecutor インターフェイスに抽象化し、次の操作を定義します:

  • GetFileContentsmain コンテナから出力パラメーター (outputs/parameters) を取得します。

  • CopyFilemain コンテナから出力アーティファクト (outputs/artifacts) を取得します。

  • GetOutputStreammain コンテナの標準出力 (標準エラーを含む) を取得します。

  • Waitmain コンテナが終了するのを待ちます。

  • Kill:関連するサイドカーコンテナを強制終了します。

  • ListContainerNames:Pod 内のコンテナの名前をリストします。

Argo は、標準の Kubernetes アーキテクチャ向けに設計された、さまざまな基盤メカニズムを持つ複数のエグゼキュータをサポートしています。サーバーレス Kubernetes のアーキテクチャは標準の Kubernetes とは異なるため、互換性のあるエグゼキュータを選択する必要があります。サーバーレス Kubernetes 環境で Argo を実行するには、Emissary エグゼキュータの使用を推奨します。次の表に、利用可能なエグゼキュータの詳細を示します:

エグゼキュータ

説明

Emissary

emptyDir ボリュームを介してファイルを共有することで機能します。

このエグゼキュータは、標準の emptyDir 機能にのみ依存し、他の依存関係がないため推奨されます。

Kubernetes API

Kubernetes API を使用しますが、その機能は不完全です。

このエグゼキュータは機能が不完全であり、大規模な環境では Kubernetes コントロールプレーンに負荷をかける可能性があるため、推奨されません。

PNS

Pod 内のプロセス名前空間 (PID) 共有と chroot に依存します。このアプローチは Pod のプロセス空間を汚染し、特権が必要です。

サーバーレス Kubernetes はより高いレベルのセキュリティ分離を強制し、特権コンテナをサポートしていません。したがって、このエグゼキュータは互換性がありません。

Docker

Docker CLI を使用してその機能を実行します。これには、基盤となる Docker コンテナランタイムへの直接アクセスが必要です。

サーバーレス Kubernetes は基盤となるノードを公開しないため、ノード上の Docker デーモンにアクセスできません。したがって、このエグゼキュータは互換性がありません。

Kubelet

Kubelet Client API を使用してその機能を実行します。これには、ノード上の基盤となる Kubelet コンポーネントへのアクセスが必要です。

サーバーレス Kubernetes は基盤となるノードを公開しないため、Kubelet コンポーネントにアクセスできません。したがって、このエグゼキュータは互換性がありません。

ECI への Argo タスクのスケジューリング

ACK サーバーレスクラスターは、すべての Pod を自動的に ECI にスケジュールするため、追加の設定は不要です。ACK マネージドクラスターの場合は、Pod を ECI にスケジュールするように設定する必要があります。詳細については、「x86 ベースの仮想ノードへの Pod のスケジューリング」をご参照ください。

次の YAML の例は、スケジューリングにラベルを使用する方法を示しています:

  • ラベル alibabacloud.com/eci: "true" を追加します:このラベルは Pod を自動的に ECI にスケジュールします。

  • (オプション) {"schedulerName": "eci-scheduler"} を指定します:これは推奨されます。仮想ノードのアップグレードまたは変更中、アドミッション Webhook が一時的に利用できなくなる可能性があります。この設定により、この一時的な利用不可の間に Pod が通常のノードにスケジュールされるのを防ぎます。

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallelism-limit1-
spec:
  entrypoint: parallelism-limit1
  parallelism: 10
  podSpecPatch: '{"schedulerName": "eci-scheduler"}'  # Pod を ECI にスケジュールします。
  podMetadata:
    labels:
      alibabacloud.com/eci: "true"   # ラベルを使用して Pod を ECI にスケジュールします。
  templates:
  - name: parallelism-limit1
    steps:
    - - name: sleep
        template: sleep
        withSequence:
          start: "1"
          end: "10"
  - name: sleep
    container:
      image: alpine:latest
      command: ["sh", "-c", "sleep 30"]

Pod 作成成功率の向上

本番環境では、Argo ワークフローには多くの場合、複数のコンピュート Pod が関わります。単一の Pod の障害がワークフロー全体の障害を引き起こす可能性があります。ワークフローの成功率が低い場合、複数回のリランが必要になることがあり、実行効率に影響を与え、コストを増加させます。したがって、Pod 作成の成功率を向上させるための戦略を採用する必要があります:

  • Argo ワークフロー定義で:

    • 失敗したステップを自動的にリトライするように Argo リトライポリシーを設定します。詳細については、「リトライ」をご参照ください。

    • ワークフローの総実行時間を制限するために、ワークフロータイムアウトを設定します。詳細については、「タイムアウト」をご参照ください。

  • ECI Pod を作成する際に:

    • 単一ゾーンでの在庫不足による Pod 作成の失敗を防ぐために、マルチゾーンを設定します。詳細については、「マルチゾーンでの Pod のデプロイ」をご参照ください。

    • 特定のインスタンスタイプの在庫不足による作成失敗を避けるために、複数のインスタンス仕様を指定します。詳細については、「複数の仕様を指定して Pod を作成する」をご参照ください。

    • 特定のインスタンスタイプではなく、vCPU とメモリの要件を指定します。ECI は現在の在庫に基づいて、リクエストを自動的に利用可能なインスタンス仕様にマッチングします。

    • 2 vCPU および 4 GiB 以上のメモリを持つインスタンス仕様を使用します。これらは専用リソースを持つエンタープライズレベルのインスタンスであり、安定したパフォーマンスを保証します。

    • Pod エラー処理ポリシーを設定して、失敗時に Pod 作成をリトライするかどうかを定義します。詳細については、「Pod のエラー処理ポリシーの設定」をご参照ください。

以下は設定例です:

  1. eci-profile ConfigMap を編集して、マルチゾーンを設定します。

    kubectl edit -n kube-system cm eci-profile

    data セクションで、vSwitchIds に複数の vSwitch の ID を設定します:

    data:
      # ...other configurations...
      vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****  # 複数の vSwitch ID を指定してマルチゾーンを設定します。
      vpcId: vpc-2zeghwzptn5zii0w7****
      # ...other configurations...
  2. Pod を作成する際に、複数の戦略を使用して成功率を向上させます。

    • k8s.aliyun.com/eci-use-specs アノテーションを使用して、複数のインスタンス仕様を指定します。この例では、3 つの仕様がリストされています。ECI は、ecs.c6.largeecs.c5.large、そして 2-4Gi (2 vCPU、4 GiB メモリ) の順にマッチングを試みます。

    • k8s.aliyun.com/eci-schedule-strategy アノテーションを使用して、マルチゾーンスケジューリング戦略を設定します。この例では、設定されたゾーン全体に Pod をランダムにスケジュールする VSwitchRandom を使用します。

    • retryStrategy を設定して、Argo リトライポリシーを設定します。この例では、すべての失敗したステップをリトライする retryPolicy: "Always" を設定します。

    • k8s.aliyun.com/eci-fail-strategy アノテーションを使用して、Pod エラー処理ポリシーを設定します。この例では fail-fast を使用します。Pod の作成が失敗した場合、システムは即座にエラーを報告し、Pod のステータスは ProviderFailed になります。その後、上位のオーケストレーションシステムがリトライするか、Pod を通常のノードにスケジュールするかを決定できます。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: parallelism-limit1-
    spec:
      entrypoint: parallelism-limit1
      parallelism: 10
      podSpecPatch: '{"schedulerName": "eci-scheduler"}'
      podMetadata:
        labels:
          alibabacloud.com/eci: "true"
        annotations:
          k8s.aliyun.com/eci-use-specs: "ecs.c6.large,ecs.c5.large,2-4Gi"
          k8s.aliyun.com/eci-schedule-strategy: "VSwitchRandom"
          k8s.aliyun.com/eci-fail-strategy: "fail-fast"
      templates:
      - name: parallelism-limit1
        steps:
        - - name: sleep
            template: sleep
            withSequence:
              start: "1"
              end: "10"
      - name: sleep
        retryStrategy:
          limit: "3"
          retryPolicy: "Always"
        container:
          image: alpine:latest
          command: [sh, -c, "sleep 30"]

Pod コストの最適化

ECI は複数の課金方法をサポートしています。ワークロードに適した課金方法を選択することで、コンピューティングコストを大幅に削減できます。

コスト最適化の方法については、以下のトピックをご参照ください:

Pod 作成の高速化

Pod の起動時間は、多くの場合、イメージのプルに占められます。これは、イメージサイズとネットワーク速度に依存するプロセスです。Pod の作成を高速化するために、ECI はイメージキャッシュ機能を提供します。事前にイメージからイメージキャッシュを作成することで、そのキャッシュを使用する後続の Pod のダウンロード時間を短縮または排除できます。

イメージキャッシュには 2 種類あります:

  • 自動作成:この機能は ECI でデフォルトで有効になっています。ECI Pod を作成する際、完全一致するイメージキャッシュが見つからない場合、ECI は Pod のイメージから自動的にイメージキャッシュを作成します。

  • 手動作成:Custom Resource Definition (CRD) を使用して、手動でイメージキャッシュを作成できます。

    高同時実行性の Argo タスクを実行する前に、手動でイメージキャッシュを作成することを推奨します。イメージキャッシュが作成されたら、Pod 定義でそれを指定し、Pod のイメージプルポリシーを IfNotPresent に設定できます。これにより、Pod は起動時にイメージのプルステップをスキップでき、Pod の作成が高速化され、Argo タスクの実行時間が短縮され、運用コストが削減されます。詳細については、「ImageCache を使用して Pod の作成を高速化する」をご参照ください。

上記の例をすでに実行している場合、ECI は自動的にイメージキャッシュを作成しています。Elastic Container Instance コンソールにログインして、イメージキャッシュのステータスを確認できます。次の YAML を使用して、既存のキャッシュを活用し、Pod の起動速度をテストするワークフローを作成できます。

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallelism-limit1-
spec:
  entrypoint: parallelism-limit1
  parallelism: 100
  podSpecPatch: '{"schedulerName": "eci-scheduler"}'
  podMetadata:
    labels:
      alibabacloud.com/eci: "true"
    annotations:
      k8s.aliyun.com/eci-use-specs: "ecs.c6.large,ecs.c5.large,2-4Gi"
      k8s.aliyun.com/eci-schedule-strategy: "VSwitchRandom"
      k8s.aliyun.com/eci-fail-strategy: "fail-fast"
  templates:
  - name: parallelism-limit1
    steps:
    - - name: sleep
        template: sleep
        withSequence:
          start: "1"
          end: "100"
  - name: sleep
    retryStrategy:
      limit: "3"
      retryPolicy: "Always"
    container:
      imagePullPolicy: IfNotPresent
      image: alpine:latest
      command: [sh, -c, "sleep 30"]

ワークフローが作成された後、ECI Pod のイベントを確認して、マッチしたイメージキャッシュの ID を確認できます。イベントはまた、Pod の起動中にイメージのプルプロセスがスキップされたことも示しています。

Events:
  Type    Reason                  Age    From        Message
  ----    ------                  ---    ----        -------
  Normal  SuccessfulHitImageCache  2m22s  EciService  [eci.imagecache]Successfully hit image cache imc-2zeedp8bxor2kcxxx, eci will be scheduled with this image cache.
  Normal  Pulled                   2m12s  kubelet     Container image "registry.cn-hangzhou.aliyuncs.com/acs/argoexec:v3.3-0d060b7" already present on machine
  Normal  Created                  2m11s  kubelet     Created container init
  Normal  Started                  2m11s  kubelet     Started container init
  Normal  Pulled                   2m11s  kubelet     Container image "registry.cn-hangzhou.aliyuncs.com/acs/argoexec:v3.3-0d060b7" already present on machine
  Normal  Created                  2m11s  kubelet     Created container wait
  Normal  Started                  2m10s  kubelet     Started container wait
  Normal  Pulled                   2m10s  kubelet     Container image "alpine:latest" already present on machine
  Normal  Created                  2m10s  kubelet     Created container main
  Normal  Started                  2m10s  kubelet     Started container main

データロードの高速化

Argo は AI 推論で広く使用されており、タスクはしばしば大規模なデータセットにアクセスします。コンピューティングとストレージの分離アーキテクチャでは、データロードの効率がタスクの期間とコストに直接影響します。多くの Argo タスクからの同時データアクセスは、ストレージのボトルネックを生み出す可能性があります。たとえば、同時実行中の Argo タスクが OSS からデータをロードし、OSS バケットの帯域幅が飽和状態になると、各コンピュートノードはデータロード段階でブロックされます。これにより、タスクの期間とコンピューティングコストが増加し、効率が低下します。

データアクセラレーションサービスである Fluid は、この問題を解決します。バッチ計算を実行する前に、Fluid データセットを作成してプリロードできます。これにより、OSS からのデータが少数のキャッシュノードに事前にキャッシュされます。その後、同時実行の Argo タスクを開始できます。Argo タスクは、OSS から直接ではなく、キャッシュノードからデータを読み取ります。キャッシュノードは、OSS から利用可能な帯域幅を効果的に拡大し、コンピュートノードのデータロード効率を向上させます。このアプローチは、Argo タスクのパフォーマンスを向上させ、実行コストを削減します。Fluid の詳細については、「Fluid の概要」をご参照ください。

次の例では、Fluid を使用して OSS から 10 GB のテストファイルをロードし、100 の同時タスクでその MD5 ハッシュを計算する方法を示します。

  1. Fluid をデプロイします。

    1. ACK コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、ストア>Marketplaceを選択します。

    3. ack-fluid カードを見つけてクリックします。

    4. ack-fluid ページで、デプロイをクリックします。

    5. 表示されるパネルで、ターゲットクラスターを選択し、パラメーターを設定して、OK をクリックします。

      ack-fluid のデプロイが完了すると、リリース詳細ページにリダイレクトされます。Helm ページに戻ると、ack-fluid のステータスが Deployed になっていることが確認できます。また、kubectl コマンドを実行して、Fluid が正常にデプロイされたことを確認することもできます。

      ~$ kubectl get pod -n fluid-system
      NAME                                  READY   STATUS    RESTARTS   AGE
      dataset-controller-6f9967d766-pm22l   1/1     Running   0          5m18s
      fluid-webhook-5777b78c-8mt4h          1/1     Running   0          5m18s
  2. テストデータを準備します。

    Fluid をデプロイした後、Fluid データセットを使用してデータアクセスを高速化します。続行する前に、10 GB のテストファイルを OSS バケットにアップロードします。

    1. テストファイルを生成します。

      dd if=/dev/zero of=/test.dat bs=1G count=10
    2. テストファイルを OSS バケットにアップロードします。詳細については、「シンプルアップロード」をご参照ください。

  3. 高速化されたデータセットを作成します。

    1. Dataset および JindoRuntime リソースを作成します。

      kubectl -n argo apply -f dataset.yaml

      以下は dataset.yaml ファイルの例です。プレースホルダーの AccessKey と OSS バケット情報を実際の値に置き換えてください。

      apiVersion: v1
      kind: Secret
      metadata:
        name: access-key
      stringData:
        fs.oss.accessKeyId: ***************         # OSS バケットにアクセスする権限を持つ AccessKey ID。
        fs.oss.accessKeySecret: ******************  # OSS バケットにアクセスする権限を持つ AccessKey Secret。
      ---
      apiVersion: data.fluid.io/v1alpha1
      kind: Dataset
      metadata:
        name: serverless-data
      spec:
        mounts:
        - mountPoint: oss://oss-bucket-name/            # ご利用の OSS バケットへのパス。
          name: demo
          path: /
          options:
            fs.oss.endpoint: oss-cn-shanghai-internal.aliyuncs.com  # OSS バケットのエンドポイント。
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeySecret
      ---
      apiVersion: data.fluid.io/v1alpha1
      kind: JindoRuntime
      metadata:
        name: serverless-data
      spec:
        replicas: 10         # 作成する JindoRuntime キャッシュノードの数。
        podMetadata:
          annotations:
            k8s.aliyun.com/eci-use-specs: ecs.g6.2xlarge  # 適切なインスタンス仕様を指定します。
            k8s.aliyun.com/eci-image-cache: "true"
          labels:
            alibabacloud.com/eci: "true"
        worker:
          podMetadata:
            annotations:
              k8s.aliyun.com/eci-use-specs: ecs.g6.2xlarge # 適切なインスタンス仕様を指定します。
        tieredstore:
          levels:
            - mediumtype: MEM          # キャッシュ媒体タイプ。メモリには MEM を、ローカルディスクを持つインスタンスを指定する場合は LoadRaid0 を使用します。
              volumeType: emptyDir
              path: /local-storage     # キャッシュパス。
              quota: 12Gi              # 最大キャッシュ容量。
              high: "0.99"             # ストレージ容量の上限ウォーターマーク。
              low: "0.99"              # ストレージ容量の下限ウォーターマーク。
      説明

      この例では、ECI Pod のメモリをデータキャッシュノードとして使用します。各 ECI Pod は専用の VPC ネットワークインターフェイスを持っているため、その帯域幅は他の Pod の影響を受けません。

    2. 結果を表示します。

      • データセットのステータスを確認します。PHASEBound であれば、作成が成功したことを示します。

        kubectl -n argo get dataset

        想定される出力:

        $ kubectl -n argo get dataset
        NAME               UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
        serverless-data    10.00GiB         0.00B    24.00GiB         0.0%                Bound   92s
      • Pod 情報を確認します。データセットによって 10 個の JindoRuntime キャッシュノードが作成されたことがわかります。

        kubectl -n argo get pods

        想定される出力:

        ~$ kubectl -n argo get pods
        NAME                                READY   STATUS    RESTARTS   AGE
        ack-workflow-ddd86b88c-r8fcj        1/1     Running   0          100m
        argo-server-84d69d65dd-1f2hj        1/1     Running   0          100m
        serverless-data-jindofs-master-0    1/1     Running   0          10m
        serverless-data-jindofs-worker-0    1/1     Running   0          9m20s
        serverless-data-jindofs-worker-1    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-2    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-3    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-4    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-5    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-6    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-7    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-8    1/1     Running   0          9m19s
        serverless-data-jindofs-worker-9    1/1     Running   0          9m19s
  4. データをプリロードします。

    データセットの準備ができたら、DataLoad リソースを作成してデータのプリロードをトリガーします。

    1. DataLoad リソースを作成してデータのプリロードをトリガーします。

      kubectl -n argo apply -f dataload.yaml

      以下は dataload.yaml ファイルの例です:

      apiVersion: data.fluid.io/v1alpha1
      kind: DataLoad
      metadata:
        name: serverless-data-warmup
        namespace: argo
      spec:
        dataset:
          name: serverless-data
          namespace: argo
        loadMetadata: true
    2. DataLoad 操作の進捗を確認します。

      kubectl -n argo get dataload

      想定される出力は、テストファイルが 10 GB であっても、データプリロードプロセスが非常に高速であることを示しています。

      :~$ kubectl -n argo get dataload
      NAME                      DATASET          PHASE      AGE   DURATION
      serverless-data-warmup    serverless-data  Complete   30s   14s
  5. Argo ワークフローを実行します。

    データがプリロードされた後、同時実行の Argo タスクを実行できます。最良の結果を得るには、このアプローチをイメージキャッシュと組み合わせます。

    1. Argo ワークフロー設定ファイル argo-test.yaml を準備します。

      以下は argo-test.yaml ファイルの例です:

      apiVersion: argoproj.io/v1alpha1
      kind: Workflow
      metadata:
        generateName: parallelism-fluid-
      spec:
        entrypoint: parallelism-fluid
        parallelism: 100
        podSpecPatch: '{"terminationGracePeriodSeconds": 0, "schedulerName": "eci-scheduler"}'
        podMetadata:
          labels:
            alibabacloud.com/fluid-sidecar-target: eci
            alibabacloud.com/eci: "true"
          annotations:
            k8s.aliyun.com/eci-use-specs: 8-16Gi
        templates:
        - name: parallelism-fluid
          steps:
          - - name: domd5sum
              template: md5sum
              withSequence:
                start: "1"
                end: "100"
        - name: md5sum
          container:
            imagePullPolicy: IfNotPresent
            image: alpine:latest
            command: ["sh", "-c", "cp /data/test.dat /test.dat && md5sum test.dat"]
            volumeMounts:
            - name: data-vol
              mountPath: /data
          volumes:
          - name: data-vol
            persistentVolumeClaim:
              claimName: serverless-data
    2. ワークフローを作成します。

      argo -n argo submit argo-test.yaml
    3. ワークフローの実行結果を表示します。

      argo -n argo list

      想定される出力:

      xxx i:~$ argo -n argo list
      NAME                     STATUS    AGE   DURATION  PRIORITY  MESSAGE
      parallelism-fluid-56g2q  Running   8s    8s        0

      kubectl get pod -n argo --watch コマンドを使用して、Pod の実行進捗を監視できます。この例では、100 個の Argo タスクが約 2〜4 分で完了します。

      parallelism-fluid-56g2q-412240702    0/3     Completed   0          3m17s
      parallelism-fluid-56g2q-563802762    0/3     Completed   0          3m19s
      parallelism-fluid-56g2q-693297214    0/3     Completed   0          3m17s
      parallelism-fluid-56g2q-615226358    0/3     Completed   0          3m18s
      parallelism-fluid-56g2q-982629280    0/3     Completed   0          3m20s
      parallelism-fluid-56g2q-918428816    0/3     Completed   0          3m16s
      parallelism-fluid-56g2q-3815880026   0/3     Completed   0          3m18s
      parallelism-fluid-56g2q-2992875428   0/3     Completed   0          3m19s
      parallelism-fluid-56g2q-3800105418   0/3     Completed   0          3m19s
      parallelism-fluid-56g2q-1897482410   0/3     Completed   0          3m17s

      対照的に、データアクセラレーションなしで同じ Argo タスクを実行し、10 GB のテストファイルを OSS から直接ロードする場合、MD5 ハッシュの計算には約 14〜15 分かかります。

      parallelism-fluid-fdr2j-2392572892    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-1295033972    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-2462229879    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-4192350503    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-4157125527    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-4173654052    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-1270167245    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-1595813521    0/2    Completed    0    14m
      parallelism-fluid-fdr2j-1829788936    0/2    Completed    0    14m

      この比較から、Fluid がコンピューティング効率を向上させ、コストを大幅に削減することがわかります。