개발 창고/Server

Kubernetes CronJob 완전 정복 : 정해진 스케줄에 반복 실행되는 작업을 안정적으로 관리하는 방법

Royzero 2025. 8. 7. 22:00
반응형

목차

  1. CronJob이란?
  2. CronJob이 필요한 이유
  3. 기본 구조와 동작 방식
  4. Job vs CronJob 비교
  5. 기본 YAML 구성 예제
  6. 스케줄 표현식(Cron 식) 이해하기
  7. 실행 이력 관리(JobHistoryLimit)
  8. ConcurrencyPolicy & RestartPolicy
  9. 실전 사용 시나리오
  10. 운영 시 주의사항 및 팁
  11. 자주 묻는 질문 (FAQ)
  12. 요약 정리

1. CronJob이란?

Kubernetes CronJob정해진 일정에 따라 Job을 자동으로 실행하도록 설계된 컨트롤러입니다.
리눅스 crontab처럼, 특정 작업을 주기적으로 자동 실행하며 백업, 로그 정리, 데이터 수집 등에 활용됩니다.


2. 왜 CronJob이 필요한가?

일회성 실행 이후 자동으로 종료되는 Job과 달리, 반복적인 작업을 자동으로 수행해야 하는 경우에 유용합니다:

  • 매일 자정 DB 백업
  • 매시간 로그 압축 및 업로드
  • 정리 작업, 통계 집계, 알림 발송 등

표준 Job을 매번 수동 실행하면 번거롭고 실수 가능성이 높으며 자동 관리도 어렵습니다.


3. CronJob의 주요 구성과 동작

CronJob은 다음 단계를 자동으로 수행합니다:

  1. schedule에 정의된 시간에 Job 생성
  2. 정의된 Job이 실행되고 완료되면 삭제 여부 결정
  3. 과거 실행 이력을 successfulJobsHistoryLimit, failedJobsHistoryLimit 필드로 관리

4. Job vs CronJob 비교

항목 Job CronJob
실행 종류 단발성 작업 정기 반복 작업
실행 조건 수동 실행 schedule(스케줄)에 따라 자동 생성
이력 관리 별도 설정 없음 성공/실패 이력 자동 관리
사용자 시나리오 마이그레이션, 수동 처리 백업, 로그 정리, 스케줄링된 배치 처리

5. CronJob 기본 YAML 예제

apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: my-backup-image:latest
            command: ["/bin/sh", "-c", "echo Backup started; sleep 30; echo Backup completed"]
          restartPolicy: OnFailure
  successfulJobsHistoryLimit: 7
  failedJobsHistoryLimit: 3
  concurrencyPolicy: "Forbid"

6. Cron 식 (schedule) 표현 이해

  • * * * * *: 분, 시, 일, 월, 요일 순서로 표현
  • 0 0 * * *: 매일 자정 실행
  • */15 * * * *: 15분 단위로 실행
  • 0 6 * * MON: 매주 월요일 오전 6시 실행

중요: 리눅스 cron 형식과 동일하므로 관리 도구 없이 바로 이해 가능


7. 실행 이력 관리

  • successfulJobsHistoryLimit: 성공한 Job의 이력 보존 수
  • failedJobsHistoryLimit: 실패한 Job의 이력 보존 수

이력관리는 디스크 과부하 방지 및 상황 추적에 매우 중요합니다.


8. ConcurrencyPolicy & RestartPolicy

  • concurrencyPolicy: "Allow" | "Forbid" | "Replace"

    • "Allow": 이전 Job이 실행 중이더라도 동시에 실행 가능
    • "Forbid": 이전 Job이 실행 중일 경우 새로운 Job 생성 금지
    • "Replace": 이전 Job 중단 후 새로운 Job 시작
  • restartPolicy: "OnFailure" 또는 "Never"

적용 예시:

concurrencyPolicy: "Forbid"
restartPolicy: OnFailure

9. 실전 사용 시나리오

  1. 일일 DB 스냅샷: 백업 파일 및 S3 업로드
  2. 로그 압축 & 전송: 자동 압축 후 로그 서버 전송
  3. 데이터 통계 집계: 배치 방식으로 통계 계산
  4. 자동 리소스 정리: 오래된 로그/오브젝트 삭제

각 스크립트는 컨테이너 내부에서 실행되며 CronJob이 자동 트리거합니다.


10. 운영 중 주의사항 및 팁

  • 시간대(Timezone)에 주의: 클러스터 노드가 UTC 기반일 수 있음
  • 로깅: kubectl logs <pod>로 실행 결과 확인
  • 리소스 조절: Job 실행 시 CPU/메모리 리소스 지정 권장
  • 장애 대응: CronJob 실패 시 관리자 알림 설정

11. 자주 묻는 질문 (FAQ)

Q1. CronJob이 실패하면 자동으로 재시작되나요?
→ RestartPolicy와 concurrencyPolicy에 따라 자동 재실행 또는 무시 가능

Q2. CronJob에서 Job이 중첩 실행되면 어떻게 되나요?
Forbid: 겹치는 Job 생성 금지, Replace: 중단하고 다시 시작, Allow: 겹침 허용

Q3. CronJob의 Job 이력을 모두 지우려면?
successfulJobsHistoryLimit, failedJobsHistoryLimit 값을 0으로 설정하거나, kubectl delete jobs --all.


12. 요약 정리

항목 설명
목적 정해진 스케줄에 따라 자동 Job 실행
설정 필수 항목 schedule, jobTemplate, 정책 관련 필드
운영 팁 시간대, 리소스 명시, 이력 관리 등
장애 대응 전략 실패 이력 확인, 컨커런시 정책 활용
반응형