Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.16] 🚀 Job & CronJob 편 #1 | 일회성 작업과 주기적 작업 실행

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

 

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