Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.17] 🚀 Job & CronJob 편 #2 | 병렬 처리 및 재시도 전략 적용

ygtoken 2025. 3. 16. 14:35
728x90

 

쿠버네티스에서 Job은 일회성 작업을 실행하는 데 사용되지만, 여러 개의 작업을 병렬로 실행하거나 실패한 작업을 자동으로 재시도해야 하는 경우가 많습니다.

이번 글에서는 여러 개의 작업을 병렬로 실행하는 방법과 Job 실패 시 재시도(backoffLimit)를 설정하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 여러 개의 작업을 병렬로 실행하는 Job 설정

2️⃣ Job 실패 시 재시도(backoffLimit) 및 완료 보장 설정

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 여러 개의 작업을 병렬로 실행하는 Job 설정

 

❓ 문제 상황

 

운영팀에서 여러 개의 작업을 동시에 실행해야 하는 요구사항이 생겼습니다.

각 작업은 서로 독립적으로 실행되어야 하며, 병렬로 여러 개의 Pod을 생성하여 빠르게 처리해야 합니다.

Job의 이름은 parallel-job이어야 합니다.

한 번에 최대 3개의 작업을 병렬로 실행해야 합니다.

총 6개의 작업을 실행해야 하며, 모든 작업이 완료될 때까지 기다려야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Job의 parallelism 속성을 사용하여 병렬로 실행되는 작업 개수를 설정해야 합니다.

parallelism: 3을 설정하여 최대 3개의 작업이 동시에 실행되도록 설정

 

2. completions 속성을 사용하여 실행해야 할 작업 개수를 설정해야 합니다.

completions: 6을 설정하여 총 6개의 작업이 실행되도록 설정

 


✅ 정답 Manifest (병렬 실행 Job 설정)

apiVersion: batch/v1
kind: Job
metadata:
  name: parallel-job  # Job 이름
spec:
  completions: 6  # 총 6개의 작업 실행
  parallelism: 3  # 동시에 최대 3개의 작업을 실행
  template:
    spec:
      containers:
      - name: worker
        image: busybox  # 간단한 작업 수행
        command: ["sh", "-c", "echo Processing task; sleep 5"]
      restartPolicy: Never  # 작업 완료 후 재시작하지 않음

 

 


📌 적용 후 예상 결과 값

 

1. Job 생성 확인

kubectl get jobs

 

💡 예상 출력 값

NAME            COMPLETIONS   DURATION   AGE
parallel-job    6/6           30s        5s

 

2. Pod이 병렬로 실행되는지 확인

kubectl get pods --selector=job-name=parallel-job

 

💡 예상 출력 값

NAME                  READY   STATUS      RESTARTS   AGE
parallel-job-abc123   1/1     Running     0          5s
parallel-job-def456   1/1     Running     0          5s
parallel-job-ghi789   1/1     Running     0          5s

 

 


2️⃣ Job 실패 시 재시도(backoffLimit) 및 완료 보장 설정

 

❓ 문제 상황

 

운영팀에서 실패할 가능성이 있는 Job을 실행하면서, 일정 횟수만큼 재시도하도록 설정해야 하는 요구사항이 생겼습니다.

특정한 오류로 인해 Job이 실패할 경우 자동으로 재시도(backoffLimit)되도록 설정해야 합니다.

Job의 이름은 retry-job이어야 합니다.

Job이 실패하면 최대 3번까지 재시도해야 합니다.

3번 재시도 후에도 실패하면 Job이 종료되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Job의 backoffLimit 속성을 설정하여 실패한 경우 재시도 횟수를 제한해야 합니다.

backoffLimit: 3을 설정하여 최대 3번 재시도

 

2. 실패하는 Job을 시뮬레이션하기 위해 강제로 오류를 발생시키도록 설정할 수 있습니다.

 


✅ 정답 Manifest (재시도 설정이 적용된 Job)

apiVersion: batch/v1
kind: Job
metadata:
  name: retry-job  # Job 이름
spec:
  completions: 1  # 단일 작업 실행
  backoffLimit: 3  # 최대 3번 재시도
  template:
    spec:
      containers:
      - name: failing-task
        image: busybox  # 간단한 작업 수행
        command: ["sh", "-c", "echo Simulating failure; exit 1"]
      restartPolicy: Never  # 실패해도 자동 재시작하지 않음

 

 


📌 적용 후 예상 결과 값

1. Job 생성 확인

kubectl get jobs

 

💡 예상 출력 값

NAME         COMPLETIONS   DURATION   AGE
retry-job    0/1           5s         5s

 

2. Job 실행 로그 확인 (실패 여부 확인)

kubectl logs job/retry-job

 

💡 예상 출력 값

Simulating failure

 

3. Job이 재시도되는지 확인

kubectl describe job retry-job

 

💡 예상 출력 값

Events:
  Type     Reason         Age   From           Message
  ----     ------         ----  ----           -------
  Normal   Started        5s    job-controller  Started pod: retry-job-abc123
  Warning  Failed         6s    job-controller  Pod failed, restarting...
  Warning  BackOff        12s   job-controller  BackoffLimitExceeded: Job has reached the specified backoff limit

 

4. Job이 실패 후 종료되었는지 확인

kubectl get jobs

 

💡 예상 출력 값

NAME         COMPLETIONS   DURATION   AGE
retry-job    0/1           15s        5s  # 재시도 후에도 실패하여 종료됨
728x90