🦑
Argo Workflow入門
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
- 複数のタスクを定義できる
- ネストして記述することもでき、その場合には内側の処理は並行して実行される
- 以下の場合には
step2a
とstep2b
は並行して行われる -
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 にあるように、 WorkflowTemplates
の templates
を他の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