🐙
ArgoWorkflowsをローカル環境のClusterに構築する
ArgoWorkflowsをローカル環境のClusterに構築してみます。
ArgoWorkflows
ArgoWorkflowsとは
KubernetesのCRD。
Kubernetes上の並列ジョブや複数ジョブの依存関係をいい感じに管理してくれるワークフローエンジン。
Job/CronJobとの違い
Kubernetes上でジョブを実行できるワークロードリソースにJobやCronJobが存在する。
これらと比較してArgoWorkflowsが優れている点は例えば下記がありそう。
- 複数のジョブの依存関係をmanifestで明示的に管理できる
- ArgoCDと親和性が高くmanifestをGitOpsで管理できる
利用するCRD
- Workflow: ワークフローの定義と実行ステータスを保持する。WorkflowがPodを起動する。
- WorkflowTemplate: ワークフローをテンプレートとして定義する
- CronWorkflow: スケジュール実行したいワークフローを定義する
やること
- ArgoWorkflowsのインストール
- Workflowリソースを動かしてみる
- WorkflowTemplateリソースを動かしてみる
- 依存関係のある4つのジョブを動かしてみる
- ArgoCDでデプロイしてみる
準備すること
- DockerDesktop(https://www.docker.com/products/docker-desktop/)
- minikube(https://minikube.sigs.k8s.io/docs/start/)
環境
- 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://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
のパスを追加してみました。
ArgoCD上でWorkflowTemplateがデプロイされました。
ArgoWorkflowUIで確認するとWorkflowTemplate
が反映されました。
Discussion