본문 바로가기
클라우드/Argo

🏗️ Argo Workflows 심화 가이드: 실패 대응, 재사용, 동시성 제어 마스터하기

by gasbugs 2026. 1. 3.

쿠버네티스 환경에서 복잡한 배치 작업, 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 (최대 대기 시간).

📝 코드 예시 및 설명

YAML
 
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)

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)

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)

YAML
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-semaphore-config
  namespace: argo
data:
  # 'gpu-access'라는 이름의 세마포어는 최대 2개의 워크플로우/태스크만 동시에 허용
  semaphore.maxParallelism: "gpu-access:2" 

② Workflow에서 Semaphore 사용

YAML
 
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는 각각 실패에 대한 회복탄력성, 개발 효율성, 그리고 자원 관리 효율성을 극대화하는 핵심 기능들입니다. 이 기능들을 적재적소에 활용하면 여러분의 워크플로우는 훨씬 더 안정적이고, 유연하며, 비용 효율적으로 운영될 수 있을 것입니다.

이제 이 지식을 바탕으로 더욱 강력한 클라우드 네이티브 워크플로우를 구축해 보세요! 🛠️