🐙

ArgoWorkflowsをローカル環境のClusterに構築する

2023/04/29に公開

ArgoWorkflowsをローカル環境のClusterに構築してみます。

ArgoWorkflows

ArgoWorkflowsとは

KubernetesのCRD。
Kubernetes上の並列ジョブや複数ジョブの依存関係をいい感じに管理してくれるワークフローエンジン。

Job/CronJobとの違い

Kubernetes上でジョブを実行できるワークロードリソースにJobやCronJobが存在する。
https://kubernetes.io/ja/docs/concepts/workloads/controllers/job/
https://kubernetes.io/ja/docs/concepts/workloads/controllers/cron-jobs/

これらと比較してArgoWorkflowsが優れている点は例えば下記がありそう。

  • 複数のジョブの依存関係をmanifestで明示的に管理できる
  • ArgoCDと親和性が高くmanifestをGitOpsで管理できる

利用するCRD

  • Workflow: ワークフローの定義と実行ステータスを保持する。WorkflowがPodを起動する。
  • WorkflowTemplate: ワークフローをテンプレートとして定義する
  • CronWorkflow: スケジュール実行したいワークフローを定義する

やること

  1. ArgoWorkflowsのインストール
  2. Workflowリソースを動かしてみる
  3. WorkflowTemplateリソースを動かしてみる
  4. 依存関係のある4つのジョブを動かしてみる
  5. ArgoCDでデプロイしてみる

準備すること

環境

  • macOS version: 12.6.1
  • minikube version: v1.30.1
  • kubectl version: v1.27.1

1. ArgoWorkflowsのインストール

kubectl create namespace argo
kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.7/install.yaml

kubectl patch deployment \
  argo-server \
  --namespace argo \
  --type='json' \
  -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [
  "server",
  "--auth-mode=server"
]}]'

kubectl -n argo port-forward deployment/argo-server 2746:2746

https://argoproj.github.io/argo-workflows/quick-start/

https://localhost:2746/にアクセスするとUIが表示されます。

2. Workflowリソースを動かしてみる

workflow.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: hello-world
spec:
  entrypoint: whalesay
  templates:
    - name: whalesay
      container:
        image: docker/whalesay
        command: [ cowsay ]
        args: [ "hello world" ]
        resources:
          limits:
            memory: 32Mi
            cpu: 100m
kubectl create -f workflow.yaml

Workflowが作成されました。

コンテナのログを見るとHelloWorldが出力されました。

3. WorkflowTemplateリソースを動かしてみる

workflow-template.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: workflow-template-submittable
spec:
  entrypoint: whalesay-template
  arguments:
    parameters:
      - name: message
        value: hello world
  templates:
    - name: whalesay-template
      inputs:
        parameters:
          - name: message
      container:
        image: docker/whalesay
        command: [cowsay]
        args: ["{{inputs.parameters.message}}"]

WorkflowTemplateが作成されました。

Submitした後コンテナのログを見るとHelloWorldが出力されました。

4. 依存関係のある3つのジョブを動かしてみる

workflow-template.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: workflow-template-steps
spec:
  entrypoint: create-file
  templates:
    - name: workflow-template-steps
      steps:
      - - name: create-file
          template: create-file
      - - name: write-file-A
          template: write-file
          arguments:
            parameters:
            - name: filename
              value: "A.txt"
            - name: filetext
              value: "This is A"
        - name: write-file-B
          template: write-file
          arguments:
            parameters:
            - name: filename
              value: "B.txt"
            - name: filetext
              value: "This is B"
      - - name: read-file
          template: read-file

    - name: create-file
      container:
        image: ubuntu:18.04
        command: [sh, -c]
        args: ["touch /var/log/A.txt; touch /var/log/B.txt;"]
        volumeMounts:
        - name: test-volume
          mountPath: /var/log
      volumes:
      - name: test-volume
        hostPath:
          path: /data

    - name: write-file
      inputs:
        parameters:
        - name: filename
        - name: filetext
      container:
        image: ubuntu:18.04
        command: [sh, -c]
        args: ["echo {{inputs.parameters.filetext}} >> /var/log/{{inputs.parameters.filename}}"]
        volumeMounts:
        - name: test-volume
          mountPath: /var/log
      volumes:
      - name: test-volume
        hostPath:
          path: /data

    - name: read-file
      container:
        image: ubuntu:18.04
        command: [sh, -c]
        args: ["cat `ls /var/log/A.txt`; cat `ls /var/log/B.txt`"]
        volumeMounts:
        - name: test-volume
          mountPath: /var/log
      volumes:
      - name: test-volume
        hostPath:
          path: /data

期待通りにWorkflowが実行されました。

ファイルの出力結果も期待通りです。

This is A
This is B

5. ArgoCDでデプロイしてみる

ArgoCDでWorkflowTemplateをデプロイします。
前回のApplicatonSetにWorkflowTemplateのパスを追加してみました。

https://zenn.dev/kassshi/articles/argocd-applicationset#applicationset

ArgoCD上でWorkflowTemplateがデプロイされました。

ArgoWorkflowUIで確認するとWorkflowTemplateが反映されました。

Discussion