쿠버네티스에서 CronJob은 정해진 일정에 따라 자동으로 작업을 실행하는 데 유용하지만, 실행 이력을 관리하고 스케줄을 최적화하는 것이 중요합니다.
이번 글에서는 CronJob 실행 이력을 모니터링하는 방법과 예약 스케줄을 최적화하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ CronJob 실행 이력 관리 및 모니터링
2️⃣ 시간대(timezone) 설정 및 예약 스케줄 최적화
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ CronJob 실행 이력 관리 및 모니터링
❓ 문제 상황
운영팀에서 CronJob이 정상적으로 실행되고 있는지 모니터링하고 실행 이력을 유지해야 하는 요구사항이 생겼습니다.
기본적으로 최근 실행된 Job 이력을 확인할 수 있어야 하며, 너무 많은 실행 이력이 남지 않도록 제한해야 합니다.
• CronJob의 이름은 monitoring-cronjob이어야 합니다.
• 최근 3개의 실행 이력만 유지하도록 설정해야 합니다.
• CronJob의 실행 주기는 매 5분마다 (*/5 * * * *) 실행되도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. CronJob의 successfulJobsHistoryLimit과 failedJobsHistoryLimit을 설정하여 실행 이력을 제한해야 합니다.
• successfulJobsHistoryLimit: 3을 설정하여 최근 3개의 성공한 Job 이력만 유지
• failedJobsHistoryLimit: 1을 설정하여 최근 1개의 실패한 Job 이력만 유지
2. kubectl get cronjobs와 kubectl get jobs 명령어를 사용하여 실행 이력을 모니터링해야 합니다.
✅ 정답 Manifest (CronJob 실행 이력 모니터링 설정)
apiVersion: batch/v1
kind: CronJob
metadata:
name: monitoring-cronjob # CronJob 이름
spec:
schedule: "*/5 * * * *" # 매 5분마다 실행
successfulJobsHistoryLimit: 3 # 최근 3개의 성공한 Job 이력만 유지
failedJobsHistoryLimit: 1 # 최근 1개의 실패한 Job 이력만 유지
jobTemplate:
spec:
template:
spec:
containers:
- name: monitor-task
image: busybox # 간단한 로그 출력
command: ["sh", "-c", "echo Running monitoring task"]
restartPolicy: Never # 작업 완료 후 재시작하지 않음
📌 적용 후 예상 결과 값
1. CronJob 생성 확인
kubectl get cronjobs
💡 예상 출력 값
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
monitoring-cronjob */5 * * * * False 0 2m ago 5s
2. 최근 실행된 Job 목록 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
monitoring-cronjob-16273849 1/1 10s 5m
monitoring-cronjob-29384756 1/1 9s 10m
monitoring-cronjob-37485932 1/1 11s 15m
3. CronJob 실행 로그 확인
kubectl logs job/monitoring-cronjob-16273849
💡 예상 출력 값
Running monitoring task
2️⃣ 시간대(timezone) 설정 및 예약 스케줄 최적화
❓ 문제 상황
운영팀에서 CronJob을 특정 시간대(KST, UTC+9)에 맞춰 실행해야 하는 요구사항이 생겼습니다.
또한 불필요한 리소스를 줄이기 위해 특정 시간대에는 Job을 실행하지 않도록 제한해야 합니다.
• CronJob의 이름은 scheduled-task-cronjob이어야 합니다.
• 실행 주기는 **매일 오전 9시(KST, UTC+9)**로 설정해야 합니다.
• 특정 시간대(timezone)에서만 실행되도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Timezone을 적용하려면 CronJob 컨테이너 내에서 시간대를 설정해야 합니다.
• 환경 변수 TZ를 설정하여 컨테이너 내부 시간대를 UTC+9(KST)로 설정
2. 특정 시간대에서만 실행되도록 Kubernetes의 스케줄을 UTC로 변환하여 적용해야 합니다.
• KST(UTC+9)에서 매일 오전 9시에 실행하려면, **UTC 기준으로 0 0 * * * (자정 UTC)**로 변환
✅ 정답 Manifest (시간대 적용 및 최적화된 CronJob 설정)
apiVersion: batch/v1
kind: CronJob
metadata:
name: scheduled-task-cronjob # CronJob 이름
spec:
schedule: "0 0 * * *" # UTC 기준 매일 자정 실행 (KST 오전 9시)
jobTemplate:
spec:
template:
spec:
containers:
- name: scheduled-task
image: busybox # 간단한 로그 출력
env:
- name: TZ
value: "Asia/Seoul" # KST (UTC+9) 시간대 설정
command: ["sh", "-c", "echo Running scheduled task"]
restartPolicy: Never # 작업 완료 후 재시작하지 않음
📌 적용 후 예상 결과 값
1. CronJob 생성 확인
kubectl get cronjobs
💡 예상 출력 값
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
scheduled-task-cronjob 0 0 * * * False 0 <none> 5s
2. Job이 지정된 시간에 실행되었는지 확인
kubectl get jobs
💡 예상 출력 값
NAME COMPLETIONS DURATION AGE
scheduled-task-cronjob-198374 1/1 5s 1m
3. CronJob 실행 로그 확인
kubectl logs job/scheduled-task-cronjob-198374
💡 예상 출력 값
Running scheduled task