쿠버네티스에서 일회성 또는 주기적인 작업을 실행할 때 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번 재시도 후 종료됨