쿠버네티스에서 Job과 CronJob은 일회성 또는 주기적인 작업을 자동으로 실행하는 데 필수적인 리소스입니다.
이번 글에서는 Job을 활용하여 특정 작업을 한 번 실행하는 방법과
CronJob을 사용하여 정해진 일정에 따라 작업을 실행하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ Job을 활용한 일회성 작업 실행
2️⃣ CronJob을 활용한 주기적 작업 실행
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Job을 활용한 일회성 작업 실행
❓ 문제 상황
운영팀에서 특정 데이터베이스 마이그레이션 스크립트를 한 번만 실행하는 작업을 수행해야 합니다.
이 작업은 성공적으로 완료되면 자동으로 종료되어야 합니다.
• Job의 이름은 db-migration-job이어야 합니다.
• postgres:latest 이미지를 사용하여 psql 명령어로 데이터베이스 마이그레이션을 실행해야 합니다.
• Job이 완료되면 자동으로 종료되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Job을 생성하여 특정 작업을 한 번만 실행하도록 설정해야 합니다.
• restartPolicy: Never를 설정하여 실패하지 않는 한 한 번만 실행
• completions: 1을 설정하여 단일 작업 수행
2. 데이터베이스 마이그레이션 명령어를 실행하는 컨테이너를 정의해야 합니다.
✅ 정답 Manifest (Job을 활용한 데이터베이스 마이그레이션 실행)
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration-job # Job 이름
spec:
completions: 1 # 한 번만 실행
backoffLimit: 2 # 실패 시 최대 2번 재시도
template:
spec:
containers:
- name: db-migration
image: postgres:latest # PostgreSQL 컨테이너 사용
command: ["psql", "-h", "db", "-U", "admin", "-d", "mydb", "-f", "/migrations/migrate.sql"]
restartPolicy: Never # 작업 완료 후 재시작하지 않음
📌 적용 후 예상 결과 값
1. Job 생성 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
db-migration-job 1/1 10s 5s
2. Job 로그 확인 (마이그레이션 수행 여부 체크)
kubectl logs job/db-migration-job
💡 예상 출력 값
Applying migration script...
Migration successful!
2️⃣ CronJob을 활용한 주기적 작업 실행
❓ 문제 상황
운영팀에서 매일 자정에 로그를 백업하는 작업을 자동으로 실행하는 요구사항이 생겼습니다.
이 작업은 정해진 일정에 맞춰 반복적으로 실행되어야 합니다.
• CronJob의 이름은 log-backup-cronjob이어야 합니다.
• busybox 이미지를 사용하여 /var/logs/ 디렉터리를 /backup/으로 복사해야 합니다.
• 매일 자정(0 0 * * *)에 실행되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. CronJob을 생성하여 주기적으로 실행되는 작업을 정의해야 합니다.
• schedule: "0 0 * * *"을 설정하여 매일 자정 실행
• restartPolicy: Never를 설정하여 작업이 끝나면 종료
2. 백업 작업을 수행하는 명령어를 실행하는 컨테이너를 정의해야 합니다.
✅ 정답 Manifest (CronJob을 활용한 로그 백업 실행)
apiVersion: batch/v1
kind: CronJob
metadata:
name: log-backup-cronjob # CronJob 이름
spec:
schedule: "0 0 * * *" # 매일 자정 실행 (UTC 기준)
jobTemplate:
spec:
template:
spec:
containers:
- name: log-backup
image: busybox # 간단한 백업 스크립트 실행
command: ["sh", "-c", "cp -r /var/logs/* /backup/"]
restartPolicy: Never # 작업 완료 후 재시작하지 않음
📌 적용 후 예상 결과 값
1. CronJob 생성 확인
kubectl get cronjobs
💡 예상 출력 값
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
log-backup-cronjob 0 0 * * * False 0 <none> 5s
2. CronJob 실행 이력 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
log-backup-cronjob-16273849 1/1 5s 0s
3. 백업 작업 로그 확인
kubectl logs job/log-backup-cronjob-16273849
💡 예상 출력 값
Backing up logs...
Backup completed successfully!