안녕하세요! 오늘은 Argo Workflows의 핵심 설계 철학인 DAG와 Steps, 그리고 워크플로우 간 데이터를 주고받는 핵심 수단인 Artifact에 대해 아주 깊이 있게 다뤄보겠습니다. 🚀
이 글을 다 읽고 나면 복잡한 파이프라인을 어떤 구조로 설계해야 할지, 그리고 이전 단계의 결과물을 어떻게 다음 단계로 안전하게 전달할지 완벽하게 이해하시게 될 겁니다.
Argo Workflows에서 작업을 배치하는 방법은 크게 두 가지입니다. 바로 Steps(순차적)와 DAG(의존성 기반)입니다. 비슷해 보이지만 사용 사례와 데이터 참조 방식에서 큰 차이가 있습니다.

1. Steps: 순차적인 단계별 실행 🪜
Steps는 말 그대로 작업을 '단계별'로 나열하는 방식입니다.
✅ 어떤 경우에 사용하나요?
- 작업의 흐름이 위에서 아래로 명확하게 흐를 때.
- 여러 작업을 동시에 실행(병렬)하거나, 특정 그룹이 끝난 후 다음 그룹으로 넘어가야 할 때.
- 구조가 단순하고 직관적인 파이프라인을 설계할 때.
📝 코드 예시 및 설명 (Steps)
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: steps-example-
spec:
entrypoint: main
templates:
- name: main
steps:
- - name: step1 # 첫 번째 단계 (병렬 그룹 1)
template: echo
arguments: {parameters: [{name: message, value: "Step 1"}]}
- - name: step2-a # 두 번째 단계 (병렬 실행 A)
template: echo
arguments: {parameters: [{name: message, value: "Step 2-A"}]}
- name: step2-b # 두 번째 단계 (병렬 실행 B)
template: echo
arguments: {parameters: [{name: message, value: "Step 2-B"}]}
- name: echo
inputs:
parameters: [{name: message}]
container:
image: alpine:latest
command: [echo, "{{inputs.parameters.message}}"]
2. DAG: 복잡한 의존성 기반 실행 🕸️
DAG(Directed Acyclic Graph)는 작업 간의 **'의존성'**을 명시적으로 정의합니다.
✅ 어떤 경우에 사용하나요?
- 작업들이 복잡하게 얽혀 있어 순서대로 나열하기 어려울 때.
- 특정 작업이 여러 개의 이전 작업 결과에 의존할 때.
- 효율적인 병렬 처리가 극도로 중요할 때 (의존성이 없는 작업은 즉시 실행됨).
📝 코드 예시 및 설명 (DAG)
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-example-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: A
template: echo
- name: B
depends: "A" # A가 성공해야 실행
template: echo
- name: C
depends: "A" # A가 성공해야 실행 (B와 병렬)
template: echo
- name: D
depends: "B && C" # B와 C가 모두 성공해야 실행
template: echo
- name: echo
container:
image: alpine:latest
command: [echo, "Running task"]
3. 이전 결과(Output)를 가져오는 방식의 차이 🔄
두 방식은 변수를 참조하는 문법(Variable Scope)이 다릅니다. 이 부분을 틀리면 워크플로우가 실행되지 않으니 주의하세요!
① Steps에서 참조하기
steps.<STEP_NAME>.outputs.parameters.<PARAM_NAME> 형식을 사용합니다.
- 예: {{steps.generate-id.outputs.parameters.id}}
② DAG에서 참조하기
tasks.<TASK_NAME>.outputs.parameters.<PARAM_NAME> 형식을 사용합니다.
- 예: {{tasks.generate-id.outputs.parameters.id}}
💡 핵심 차이: 참조하는 접두어가 steps냐 tasks냐의 차이입니다. 구조에 맞는 올바른 키워드를 사용해야 합니다.
4. Artifact: 대용량 데이터 전달의 핵심 📦
Parameter가 짧은 문자열이나 숫자를 전달한다면, Artifact는 파일, 디렉토리, 대용량 데이터를 전달할 때 사용합니다. (S3, GCS, Minio 등 외부 저장소가 필요합니다.)
✅ Artifact의 특징
- Input/Output: 한 단계에서 파일을 생성(outputs.artifacts)하고 다음 단계에서 이를 입력(inputs.artifacts)으로 받습니다.
- 영속성: 파드가 삭제되어도 외부 저장소에 데이터가 남으므로 나중에 결과를 확인할 수 있습니다.
📝 실전 코드: Artifact 전달하기
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: artifact-passing-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: generate-file
template: producer
- name: consume-file
depends: "generate-file"
template: consumer
arguments:
artifacts:
# 이전 task의 출력을 입력으로 연결
- name: input-file
from: "{{tasks.generate-file.outputs.artifacts.result-file}}"
- name: producer # 파일을 만드는 템플릿
container:
image: alpine:latest
command: [sh, -c]
args: ["echo 'important data' > /tmp/out.txt"]
outputs:
artifacts:
- name: result-file # 이 이름으로 아티팩트 생성
path: /tmp/out.txt # 컨테이너 내 실제 경로
- name: consumer # 파일을 받는 템플릿
inputs:
artifacts:
- name: input-file # 입력 아티팩트 정의
path: /tmp/in.txt # 컨테이너 내 어디에 배치할지
container:
image: alpine:latest
command: [cat, /tmp/in.txt]
5. 요약 및 선택 가이드 📊
| 구분 | Steps | DAG |
| 철학 | 순차적 흐름 (Sequential) | 의존성 네트워크 (Dependency) |
| 가독성 | 단순한 흐름에 유리 | 복잡한 관계 파악에 유리 |
| 변수 참조 | {{steps.NAME.outputs...}} | {{tasks.NAME.outputs...}} |
| 병렬 처리 | 리스트의 리스트([ [A, B] ])로 정의 | depends가 없으면 자동 병렬 실행 |
어떤 것을 선택해야 할까요?
- 흐름이 단순하다면 Steps를 선택하여 직관성을 높이세요.
- 작업 간의 선후 관계가 복잡하고, 비선형적인 파이프라인이라면 DAG가 정답입니다.
- 데이터가 파일 형태라면 주저 말고 Artifact를 구성하세요.
Argo Workflows의 강력함은 이러한 구조적 유연성에서 나옵니다. 여러분의 비즈니스 로직에 가장 적합한 구조를 설계해 보세요! 🛠️
'클라우드 > Argo' 카테고리의 다른 글
| 🛡️ Argo CD 안전 삭제의 수호자: Resources Finalizer 완벽 가이드 (0) | 2026.01.03 |
|---|---|
| 🚀 Argo Rollouts 배포 전략 완벽 가이드: 무중단 배포의 모든 것 (0) | 2026.01.03 |
| 🐙 Argo CD 마스터 가이드: AppProject의 함정과 4가지 핵심 기능 파헤치기 (0) | 2026.01.03 |
| 🧹 Argo Workflows 리소스 정리 마스터: ttlStrategy vs podGC 완벽 분석 (0) | 2026.01.03 |
| 🔄 ArgoCD Replace 기능 완벽 가이드: Patch가 안 될 때의 필살기 (0) | 2026.01.03 |