🦑

Argo Workflow入門

2021/02/20に公開

Argo Workflowを触ってみたので、調べたことを軽くまとめてみました。

概念

Argo Workflowを使う上で出てくる概念としてはざっくり以下です。詳細はCore Conceptsを参照ください。

Workflow

  • Kubernetes上で実行されるworkflowを定義する
  • workflowのstateを保管している

Workflowは静的な定義なだけでなく、定義のインスタンスでもある

Workflow Spec

実行されるworkflowは Workflow.spec で定義でき、以下のような感じ。

  • templates は関数のような感じで、実行される処理の内容がまとまっている。
  • entrypoint はworkflow実行時に一番最初に実行されるtemplateのことを意味する。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-world
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["hello world"]

ちなみにtemplateには以下のようにいくつかの種類がある(以下以外にもある)。

container

- コンテナイメージを直接指定する
...
- name: whalesay
container:
  image: docker/whalesay
  command: [cowsay]
  args: ["hello world"]

script

- containerに加えてスクリプト実行ができる
- name: gen-random-int
script:
  image: python:alpine:3.6
  command: [python]
  source: |
    import random
    i = random.randint(1, 100)
    print(i)

resource

- Kubernetesのリソースを直接実行できる
...
- name: k8s-owner-reference
  resource:
    action: create
    manifest: |
      apiVersion: v1
      kind: ConfigMap
      metadata:
        generateName: owner

steps

  • 複数のタスクを定義できる
  • ネストして記述することもでき、その場合には内側の処理は並行して実行される
  • 以下の場合には step2astep2b は並行して行われる
  • clauses to conditionally execute a stepにあるように、 when での制御もできるらしい。
...
- name: hello-world
  steps:
    - - name: step1
        template: prepare-data
    - - name: step2a
        template: run-data-parallel-1
    - - name: step2b
        template: run-data-parallel-2

RBAC

Argo Workflowからworkflowを実行する際にはKubernetes APIを利用するため、Kubernetesが提供しているServiceAccountを使ってRBACを経由してアクセスする。
workflow.spec.serviceAccountName に設定することで実行するworkflowに付与できるが、 省略した場合にはKubernetesが提供しているdefaultのServiceAccountが使用される。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: workflow-role
rules:
  - apiGroups:
      - ""
    resources:
      - pods
    verbs: ["get", "watch", "patch"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: workflow-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: workflow-rolebinding
subjects:
  - kind: ServiceAccount
    name: workflow-sa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: workflow-role
---
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: hello-whale
spec:
  entrypoint: whalesay
  serviceAccountName: workflow-sa # 実行するWorkflowに対して付与できる
  templates:
    - name: whalesay
      container:
        image: docker/whalesay
        command: [cowsay]
        args: ["hello world"]

WorkflowTemplates

WorkflowTemplatesは再利用可能なWorkflowを定義できる。
直接submitしたり他のWorkflowから参照したりできる、いわばライブラリーのようなものである。
Referencing other WorkflowTemplates にあるように、 WorkflowTemplatestemplates を他のWorkflowから参照できる(その際には templateRef を使用する)。

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: workflow-template-submittable
spec:
  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}}"]
---
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: workflow-template-hello-world-
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    steps:                              # You should only reference external "templates" in a "steps" or "dag" "template".
      - - name: call-whalesay-template
          templateRef:                  # You can reference a "template" from another "WorkflowTemplate" using this field
            name: workflow-template-1   # This is the name of the "WorkflowTemplate" CRD that contains the "template" you want
            template: whalesay-template # This is the name of the "template" you want to reference
          arguments:                    # You can pass in arguments as normal
            parameters:
            - name: message
              value: "hello world"

Argo Workflow v2.9以降では WorkflowTemplate から Workflow を作ることが出来るようになった。

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: workflow-template-hello-world-
spec:
  # entrypointとargumentsを渡しつつ`workflow-template-submittable`を呼び出す
  entrypoint: whalesay-template
  arguments:
    parameters:
      - name: message
        value: "from workflow"
  workflowTemplateRef:
    name: workflow-template-submittable
---
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: workflow-template-hello-world-
spec:
  # WorkflowTemplatesで定義したものをそのまま呼び出す
  workflowTemplateRef:
    name: workflow-template-submittable

参考

Discussion