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 등) 또는 파라미터로만 가능 (공유 파일시스템 없음)
  • CronWorkflowschedule은 기본적으로 UTC 기준이므로 timezone 명시 권장
  • 실패한 워크플로우는 자동 삭제되지 않으므로 ttlStrategy로 정리 필요
spec:
  ttlStrategy:
    secondsAfterCompletion: 86400    # 완료 후 24시간 뒤 삭제
    secondsAfterFailure: 604800      # 실패 후 7일 뒤 삭제