Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #5: Job & CronJob (워크로드 리소스)

ygtoken 2025. 3. 5. 00:11
728x90

Kubernetes에서는 일반적인 애플리케이션 배포 외에도 **일회성 작업(배치 작업)**이 필요할 때가 있습니다.
이때 사용하는 리소스가 Job과 CronJob입니다.

이번 글에서는 Job과 CronJob의 개념, 차이점, 동작 방식, 그리고 실전 활용법을 정리해 보겠습니다.


🔹 Job이란?

Job은 한 번 실행된 후 완료되는 작업을 수행하는 Kubernetes 리소스입니다.
배포된 Pod는 작업이 끝나면 자동으로 종료됩니다.

✔️ 한 번만 실행되는 작업 수행
✔️ Pod 장애 발생 시 자동 재시작
✔️ 성공적으로 완료되면 종료됨

📌 Job 사용 사례

  • 데이터베이스 마이그레이션
  • 백업 및 데이터 스냅샷
  • 로그 분석 및 처리
  • 특정 이벤트 발생 시 실행해야 하는 작업

🔹 Job YAML 예제 (일회성 작업)

아래 Job은 10초 후 종료되는 Pod를 실행하는 예제입니다.

apiVersion: batch/v1  # Job 리소스의 API 버전
kind: Job  # Job 리소스를 생성
metadata:
  name: example-job  # Job의 이름
spec:
  completions: 1  # 총 1개의 작업(완료할 Pod 수)
  parallelism: 1  # 동시에 실행할 Pod 개수
  template:  # 실행할 Pod의 정의
    metadata:
      labels:
        app: example-job
    spec:
      restartPolicy: Never  # 실패 시 자동 재시작하지 않음
      containers:
        - name: job-container
          image: busybox  # BusyBox 컨테이너 사용
          command: ["sh", "-c", "echo Hello, Kubernetes! && sleep 10"]  # 10초 후 종료

📌 주요 필드 설명

필드 설명

completions: 1 완료해야 하는 작업 개수 (1이면 1번 실행)
parallelism: 1 동시에 실행할 Pod 개수
restartPolicy: Never 실패해도 자동 재시작하지 않음
command 컨테이너에서 실행할 명령어 (10초 후 종료)

🔹 Job 배포 및 실행 확인

kubectl apply -f job.yaml
kubectl get jobs
kubectl get pods

💡 Job은 실행이 완료되면 Pod가 자동으로 종료됩니다.

📌 실행 로그 확인

kubectl logs <pod-name>

출력 예시:

Hello, Kubernetes!

🔹 Job 병렬 실행 (Parallelism & Completions)

여러 개의 작업을 병렬로 실행하려면 parallelism과 completions 값을 조정합니다.

spec:
  completions: 5  # 총 5개의 작업 수행
  parallelism: 2  # 동시에 2개씩 실행

💡 최대 2개씩 실행되며, 총 5개의 Pod가 순차적으로 실행됩니다.


🔹 CronJob이란?

CronJob은 Job을 정해진 일정에 따라 반복 실행하는 리소스입니다.
리눅스의 cron 명령어와 동일한 방식으로 작동합니다.

✔️ 정해진 시간에 Job 실행
✔️ 스케줄링(예약 실행) 가능
✔️ 이전 Job이 실패해도 다음 실행에 영향 없음

📌 CronJob 사용 사례

  • 매일 자정에 로그 백업 실행
  • 매 5분마다 특정 데이터 업데이트
  • 매주 월요일 오전 9시에 시스템 점검

🔹 CronJob YAML 예제 (5분마다 실행)

apiVersion: batch/v1  # CronJob 리소스의 API 버전
kind: CronJob  # CronJob 리소스를 생성
metadata:
  name: example-cronjob  # CronJob의 이름
spec:
  schedule: "*/5 * * * *"  # 매 5분마다 실행
  jobTemplate:  # 실행될 Job의 정의
    spec:
      template:
        metadata:
          labels:
            app: example-cronjob
        spec:
          restartPolicy: Never  # 실패 시 자동 재시작 안 함
          containers:
            - name: cronjob-container
              image: busybox  # BusyBox 컨테이너 사용
              command: ["sh", "-c", "echo Running CronJob! && date"]  # 현재 시간 출력

📌 주요 필드 설명

필드 설명

schedule 실행 주기를 설정 (cron 형식)
jobTemplate 실행할 Job의 템플릿
restartPolicy: Never 실패해도 자동 재시작하지 않음

🔹 Cron 표현식 정리

표현식 실행 주기

"*/5 * * * *" 매 5분마다 실행
"0 0 * * *" 매일 자정 (00:00) 실행
"0 9 * * 1" 매주 월요일 오전 9시 실행
"0 12 1 * *" 매월 1일 정오 실행

💡 Cron 표현식 테스트 사이트를 활용하면 쉽게 확인할 수 있습니다.


🔹 CronJob 배포 및 실행 확인

kubectl apply -f cronjob.yaml
kubectl get cronjob
kubectl get jobs
kubectl get pods

💡 5분마다 새로운 Job이 자동으로 생성됩니다.

📌 실행 로그 확인

kubectl logs <pod-name>

출력 예시:

Running CronJob!
Tue Mar 4 12:00:00 UTC 2025

🔹 CronJob 삭제 및 Job 정리

kubectl delete cronjob example-cronjob
kubectl get jobs  # 기존에 실행된 Job은 남아 있음
kubectl delete jobs --all  # 실행된 모든 Job 삭제

💡 CronJob을 삭제해도 실행된 Job은 남아 있으므로, 필요하면 수동으로 삭제해야 합니다.


🚀 마무리

Job과 CronJob은 Kubernetes에서 일회성 및 반복 작업을 수행하는 핵심 리소스입니다.

 

✔️ Job은 한 번 실행 후 종료
✔️ CronJob은 스케줄에 따라 반복 실행

728x90