Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.18] 🚀 Job & CronJob 편 #3 | CronJob 실행 모니터링 및 예약 스케줄 최적화

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

 

쿠버네티스에서 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
728x90