쿠버네티스 환경에서 복잡한 배치 작업, CI/CD 파이프라인, 데이터 처리 워크플로우를 안정적으로 운영하는 것은 여간 어려운 일이 아닙니다. 특히 예상치 못한 실패에 대한 대응, 재사용 가능한 템플릿 관리, 그리고 동시에 실행될 수 있는 작업 수 제어는 필수적인 요소죠.
오늘은 Argo Workflows의 핵심 고급 기능들인 Retry Strategy, WorkflowTemplateRef, 그리고 Semaphore에 대해 아주 깊이 있고 상세하게 파헤쳐 보겠습니다. 이 글을 통해 여러분의 워크플로우를 한 단계 더 '견고하고, 효율적이며, 관리하기 쉽게' 만들어 보세요! 🚀
안녕하세요! Argo Workflows는 컨테이너 기반 워크플로우를 쿠버네티스 위에서 실행할 수 있게 해주는 강력한 도구입니다. 하지만 실제 운영 환경에서는 단순한 작업 실행을 넘어, '실패에 강하고', '재사용 가능하며', '자원 효율적인' 워크플로우를 구축해야 합니다.
지금부터 10분 동안 이 세 가지 목표를 달성할 수 있는 Argo Workflows의 핵심 기능들을 자세히 살펴보겠습니다.

1. Retry Strategy: 실패에 강한 워크플로우 만들기 💪
네트워크 불안정, 일시적인 외부 서비스 오류 등 예상치 못한 이유로 태스크가 실패할 때, 무작정 워크플로우 전체를 재시작하는 것은 비효율적입니다. retryStrategy는 특정 조건에서 작업을 자동으로 재시도하여 워크플로우의 견고성을 높여줍니다.
✅ 주요 옵션
- limit: 최대 재시도 횟수.
- retryPolicy: Always (항상 재시도), OnError (컨테이너 에러 시), OnFailure (파드 실패 시).
- backoff: 재시도 간격. duration (초기 대기 시간), factor (다음 재시도 시 대기 시간 증가 배수), maxDuration (최대 대기 시간).
📝 코드 예시 및 설명
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: retry-example-
spec:
entrypoint: main
templates:
- name: main
steps:
- - name: flaky-task # 가끔 실패하는 태스크를 가정
template: unstable-operation
- name: unstable-operation
retryStrategy:
limit: 3 # 최대 3번 재시도
retryPolicy: OnError # 컨테이너가 에러 코드(0이 아닌)를 반환하면 재시도
backoff:
duration: "5s" # 첫 재시도 전 5초 대기
factor: 2 # 다음 대기 시간은 5s -> 10s -> 20s 로 증가
maxDuration: "1m" # 최대 1분까지 대기 (20s 이후에는 1분까지 대기)
container:
image: alpine:latest
command: [sh, -c]
args:
# 50% 확률로 실패하는 스크립트
- "echo 'Attempting operation...'; R=$((RANDOM % 2)); if [ $R -eq 0 ]; then echo 'Success!'; exit 0; else echo 'Failure!'; exit 1; fi"
2. WorkflowTemplateRef: 재사용 가능한 워크플로우 라이브러리 📚
반복되는 워크플로우 패턴이나 공통적으로 사용되는 태스크 그룹이 있다면, 이를 WorkflowTemplate으로 정의하고 다른 워크플로우에서 참조할 수 있습니다. 이는 코드 재사용성을 높이고 관리 복잡도를 줄여줍니다.
✅ 주요 특징
- 단일 정의, 여러 곳에서 사용: 한 번 정의된 템플릿은 여러 워크플로우에서 마치 함수처럼 호출될 수 있습니다.
- 파라미터 전달: 템플릿에 파라미터를 정의하여 호출 시 동적으로 값을 전달할 수 있습니다.
- Namespace-scoped 또는 Cluster-scoped: 템플릿을 특정 네임스페이스에서만 사용하거나, 클러스터 전체에서 사용하도록 설정할 수 있습니다.
📝 코드 예시 및 설명
① WorkflowTemplate 정의 (my-template.yaml)
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate # 일반 Workflow와는 다른 kind!
metadata:
name: common-build-template # 템플릿 이름
namespace: argo
spec:
entrypoint: build-and-test
templates:
- name: build-and-test
inputs:
parameters:
- name: git-url
- name: commit-id
container:
image: docker:dind # Docker-in-Docker 이미지 사용 예시
command: [sh, -c]
args:
- |
echo "Cloning {{inputs.parameters.git-url}} at {{inputs.parameters.commit-id}}"
# 실제 빌드/테스트 로직
echo "Build successful!"
② Workflow에서 WorkflowTemplate 참조 (my-workflow.yaml)
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: ci-pipeline-
spec:
entrypoint: run-build
templates:
- name: run-build
steps:
- - name: app-build
# WorkflowTemplate을 참조하는 방법
templateRef:
name: common-build-template # 참조할 WorkflowTemplate의 이름
template: build-and-test # 템플릿 내의 entrypoint
arguments:
parameters:
- name: git-url
value: https://github.com/my-org/my-app.git
- name: commit-id
value: a1b2c3d4e5
3. Semaphore: 자원 동시성 제어 🚦
Semaphore는 클러스터의 특정 자원(예: GPU, 특정 외부 API)이 제한적일 때, 동시에 해당 자원을 사용하는 워크플로우나 태스크의 수를 제어하는 기능입니다. 무한정 파드를 띄워 자원 고갈이나 외부 서비스 과부하를 막아줍니다.
✅ 주요 특징
- 클러스터 범위/네임스페이스 범위: ClusterWorkflowTemplate이나 Workflow 정의에서 semaphore 필드를 통해 설정합니다.
- 획득(Acquire) 및 해제(Release): 태스크가 시작될 때 Semaphore를 획득하고, 완료되면 해제합니다.
- 병목 현상 관리: 리소스가 부족할 때 태스크가 대기 상태로 전환되어 클러스터 안정성을 유지합니다.
📝 코드 예시 및 설명
① 클러스터 범위의 Semaphore 정의 (argocd-cm 또는 별도 ConfigMap)
apiVersion: v1
kind: ConfigMap
metadata:
name: my-semaphore-config
namespace: argo
data:
# 'gpu-access'라는 이름의 세마포어는 최대 2개의 워크플로우/태스크만 동시에 허용
semaphore.maxParallelism: "gpu-access:2"
② Workflow에서 Semaphore 사용
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: gpu-job-
spec:
entrypoint: main
templates:
- name: main
# 이 워크플로우 전체가 'gpu-access' 세마포어를 사용합니다.
semaphore:
# 위에서 정의한 ConfigMap의 이름과 키
configMap: my-semaphore-config
key: gpu-access
container:
image: my-gpu-image:latest
# 실제 GPU 자원을 사용하는 작업
command: [python, "run_gpu_task.py"]
resources:
limits:
nvidia.com/gpu: 1 # GPU 1개 요청
💡 주의: semaphore의 configMap은 Argo Workflows 컨트롤러가 접근할 수 있는 네임스페이스에 있어야 합니다.
4. 요약 및 실무 활용 가이드 📊
| 기능 | 주요 목적 | 언제 사용? |
| Retry Strategy | 일시적 실패로부터 복구 | 네트워크 오류, 외부 API 타임아웃 등 비결정적 실패 |
| WorkflowTemplateRef | 워크플로우 재사용성 증대 | 공통 빌드 로직, 테스트 스위트, 데이터 전처리 단계 |
| Semaphore | 제한된 자원 동시성 제어 | GPU, 고정된 외부 API 요청 수, DB 연결 수 등 |
🏁 마치며
Argo Workflows의 retryStrategy, WorkflowTemplateRef, Semaphore는 각각 실패에 대한 회복탄력성, 개발 효율성, 그리고 자원 관리 효율성을 극대화하는 핵심 기능들입니다. 이 기능들을 적재적소에 활용하면 여러분의 워크플로우는 훨씬 더 안정적이고, 유연하며, 비용 효율적으로 운영될 수 있을 것입니다.
이제 이 지식을 바탕으로 더욱 강력한 클라우드 네이티브 워크플로우를 구축해 보세요! 🛠️
'클라우드 > Argo' 카테고리의 다른 글
| 🏗️ GitOps 실전 활용 사례: 무엇을 할 수 있을까요? (0) | 2026.01.05 |
|---|---|
| 🏗️ GitOps란 무엇인가요? (정의와 탄생 배경) (0) | 2026.01.05 |
| 🛠️ Argo CD x Kustomize 마스터 가이드: 이미지 오버라이드와 버전 고정 기법 (0) | 2026.01.03 |
| 🛡️ Argo CD 안전 삭제의 수호자: Resources Finalizer 완벽 가이드 (0) | 2026.01.03 |
| 🚀 Argo Rollouts 배포 전략 완벽 가이드: 무중단 배포의 모든 것 (0) | 2026.01.03 |