Argo Workflows
Argo Workflows란?
쿠버네티스에서 배치 잡과 데이터 파이프라인을 실행하는 워크플로우 엔진이다. 각 스텝을 쿠버네티스 파드로 실행하며, DAG(방향 비순환 그래프)나 순차 스텝으로 복잡한 작업 흐름을 정의할 수 있다.
Cron 스케줄로 주기적으로 실행하거나, 이벤트에 의해 트리거할 수도 있다.
핵심 리소스
| 리소스 | 설명 |
|---|---|
Workflow | 단발성 실행 단위 |
WorkflowTemplate | 재사용 가능한 워크플로우 템플릿 |
CronWorkflow | 주기적으로 실행되는 워크플로우 (cron 기반) |
기본 구조
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: my-workflow-
spec:
entrypoint: main # 시작 템플릿
templates:
- name: main
steps:
- - name: step1
template: do-something
- - name: step2
template: do-another-thing
- name: do-something
container:
image: alpine
command: [sh, -c]
args: ["echo hello"]각 스텝은 독립적인 파드로 실행된다.
실행 패턴
Steps (순차/병렬)
steps:
- - name: step-a # 첫 번째 그룹 (순차)
template: task-a
- - name: step-b1 # 두 번째 그룹 (병렬)
template: task-b
- name: step-b2
template: task-c
- - name: step-c # 세 번째 그룹 (앞 그룹 완료 후 실행)
template: task-d같은 그룹(- - 아래에 있는 것들)은 병렬 실행, 다른 그룹은 순차 실행.
DAG
- name: main
dag:
tasks:
- name: A
template: task-a
- name: B
template: task-b
dependencies: [A] # A 완료 후 실행
- name: C
template: task-c
dependencies: [A] # A 완료 후 실행 (B와 병렬)
- name: D
template: task-d
dependencies: [B, C] # B, C 모두 완료 후 실행WorkflowTemplate
반복 사용하는 워크플로우를 템플릿으로 정의해두고 재사용한다.
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: my-job-template
namespace: argo
spec:
templates:
- name: run-job
inputs:
parameters:
- name: job-name
container:
image: my-app:latest
command: [java, -jar, app.jar]
args: ["{{inputs.parameters.job-name}}"]CronWorkflow
apiVersion: argoproj.io/v1alpha1
kind: CronWorkflow
metadata:
name: daily-report
spec:
schedule: "0 21 * * *" # UTC 기준 cron
timezone: "Asia/Seoul"
concurrencyPolicy: Forbid # 이전 실행이 끝나지 않으면 새 실행 막음
workflowSpec:
entrypoint: main
templates:
- name: main
container:
image: my-app:latest
command: [java, -jar, app.jar, dailyReport]concurrencyPolicy:
Allow: 동시 실행 허용Forbid: 이전 실행 중이면 새 실행 건너뜀Replace: 이전 실행을 중단하고 새 실행 시작
파라미터와 아티팩트
스텝 간 값 전달
- name: producer
template: generate-value
- - name: consumer
template: use-value
arguments:
parameters:
- name: input
value: "{{steps.producer.outputs.parameters.result}}"아티팩트 (파일 전달)
outputs:
artifacts:
- name: result-file
path: /tmp/result.csv
s3:
bucket: my-bucket
key: "results/{{workflow.name}}.csv"자주 쓰는 명령어
# 워크플로우 목록
kubectl get workflows -n argo
# 워크플로우 상태 확인
kubectl get workflow my-workflow -n argo
# 로그 확인
kubectl logs my-workflow-pod -n argo -c main
# 수동 실행 (WorkflowTemplate 기반)
kubectl create -f - <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: manual-run-
namespace: argo
spec:
workflowTemplateRef:
name: my-job-template
EOF
# CronWorkflow 일시 중단
kubectl patch cronworkflow my-cron -n argo --type merge -p '{"spec":{"suspend":true}}'주의사항
- 각 스텝이 별도 파드로 실행되므로, 스텝이 많을수록 파드 생성 오버헤드가 있음
- 파드 간 데이터 공유는 아티팩트(S3 등) 또는 파라미터로만 가능 (공유 파일시스템 없음)
CronWorkflow의schedule은 기본적으로 UTC 기준이므로timezone명시 권장- 실패한 워크플로우는 자동 삭제되지 않으므로
ttlStrategy로 정리 필요
spec:
ttlStrategy:
secondsAfterCompletion: 86400 # 완료 후 24시간 뒤 삭제
secondsAfterFailure: 604800 # 실패 후 7일 뒤 삭제
댓글 (0)