Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Low Level #11] Job 및 CronJob을 활용한 주기적 작업 실행

ygtoken 2025. 3. 16. 18:54
728x90

 

쿠버네티스에서 일회성 또는 주기적인 작업을 실행할 때 Job과 CronJob을 사용합니다.

Job은 한 번 실행되고 완료되는 작업, CronJob은 스케줄에 따라 반복 실행되는 작업을 정의할 수 있습니다.

이 글에서는 Job 및 CronJob을 활용하여 주기적 작업을 실행하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. Job을 활용한 일회성 작업 실행

2. CronJob을 활용한 주기적인 작업 실행

3. Job 및 CronJob의 실패 처리 및 재시도 전략 적용

 

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

 


1️⃣ Job을 활용한 일회성 작업 실행

 

❓ 문제 상황

 

운영팀에서 특정 데이터를 백업하는 일회성 작업을 실행해야 합니다.

이 작업은 한 번만 실행되며, 성공적으로 완료되면 더 이상 실행되지 않아야 합니다.

Job 이름: backup-job

컨테이너 이미지: busybox

실행할 작업: /bin/sh -c 'echo "백업 완료"'

 

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

 


🛠️ 해결 방법

 

1. Job을 생성하여 컨테이너가 한 번 실행된 후 종료되도록 설정합니다.

 

2. kubectl을 사용하여 Job이 정상적으로 실행되었는지 확인합니다.

 


✅ 정답 Manifest (Job 설정)

apiVersion: batch/v1
kind: Job
metadata:
  name: backup-job
spec:
  template:
    spec:
      containers:
      - name: backup-container
        image: busybox
        command: ["/bin/sh", "-c", "echo '백업 완료'"]
      restartPolicy: Never  # 재시작하지 않음

 

 


📌 적용 후 예상 결과 값

 

1. Job 실행 확인

kubectl get jobs

 

💡 예상 출력 값

NAME         COMPLETIONS   DURATION   AGE
backup-job   1/1           5s         5s

 

2. Job의 로그 확인

kubectl logs job/backup-job

 

💡 예상 출력 값

백업 완료

Job이 한 번 실행된 후 정상 종료됨

 


2️⃣ CronJob을 활용한 주기적인 작업 실행

 

❓ 문제 상황

 

운영팀에서 매일 자정마다 로그 정리 작업을 수행해야 합니다.

이 작업은 자동으로 실행되어야 하며, 실패 시 재시도를 수행해야 합니다.

CronJob 이름: log-cleanup-cronjob

실행 주기: 매일 자정 (00:00) 실행

실행할 작업: /bin/sh -c 'echo "로그 정리 완료"'

 

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

 


🛠️ 해결 방법

 

1. CronJob을 생성하여 일정한 주기로 작업이 실행되도록 설정합니다.

 

2. kubectl을 사용하여 CronJob의 실행 내역을 확인합니다.

 


✅ 정답 Manifest (CronJob 설정)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: log-cleanup-cronjob
spec:
  schedule: "0 0 * * *"  # 매일 자정 (UTC 기준)
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: log-cleanup-container
            image: busybox
            command: ["/bin/sh", "-c", "echo '로그 정리 완료'"]
          restartPolicy: Never

 

 


📌 적용 후 예상 결과 값

 

1. CronJob 실행 상태 확인

kubectl get cronjobs

 

💡 예상 출력 값

NAME                  SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
log-cleanup-cronjob   0 0 * * *   False     0        12h             5s

 

2. CronJob이 실행한 Job 확인

kubectl get jobs --selector=job-name=log-cleanup-cronjob

 

💡 예상 출력 값

NAME                          COMPLETIONS   DURATION   AGE
log-cleanup-cronjob-1638923   1/1           5s         5s

매일 자정마다 자동으로 실행됨

 


3️⃣ Job 및 CronJob의 실패 처리 및 재시도 전략 적용

 

❓ 문제 상황

 

운영팀에서 Job과 CronJob이 실패할 경우 재시도하도록 설정해야 합니다.

특정 작업이 실패했을 때 최대 3번까지 재시도하도록 설정해야 합니다.

Job 및 CronJob의 backoffLimit 값을 설정하여 재시도 횟수를 지정

 

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

 


🛠️ 해결 방법

 

1. Job 및 CronJob에서 backoffLimit 값을 설정하여 실패 시 재시도하도록 합니다.

 

2. kubectl을 사용하여 실패 후 재시도되는지 확인합니다.

 


✅ 정답 Manifest (Job 및 CronJob 실패 처리 설정)

 

🔹 Job에서 재시도 횟수 설정

apiVersion: batch/v1
kind: Job
metadata:
  name: retry-job
spec:
  backoffLimit: 3  # 최대 3번 재시도
  template:
    spec:
      containers:
      - name: fail-container
        image: busybox
        command: ["/bin/sh", "-c", "exit 1"]  # 의도적으로 실패하도록 설정
      restartPolicy: Never

 

🔹 CronJob에서 재시도 횟수 설정

apiVersion: batch/v1
kind: CronJob
metadata:
  name: retry-cronjob
spec:
  schedule: "*/5 * * * *"  # 5분마다 실행
  jobTemplate:
    spec:
      backoffLimit: 3  # 최대 3번 재시도
      template:
        spec:
          containers:
          - name: fail-container
            image: busybox
            command: ["/bin/sh", "-c", "exit 1"]
          restartPolicy: Never

 

 


📌 적용 후 예상 결과 값

 

1. Job이 실패 후 재시도하는지 확인

kubectl get jobs

 

💡 예상 출력 값

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

 

2. Job의 이벤트 로그 확인

kubectl describe job retry-job

 

💡 예상 출력 값

Events:
  Type     Reason         Age   From               Message
  ----     ------         ----  ----               -------
  Warning  BackoffLimitExceeded  1m    job-controller  Job has reached the specified backoff limit (3)

Job이 실패했을 때 최대 3번 재시도 후 종료됨

 

728x90