Kubernetes CronJob suspend 후 즉시 실행되는 원인과 해결 방법 & 노드 라벨 확인 방법

Kubernetes에서 CronJobsuspend: true로 설정했다가 다시 suspend: false로 변경하면, 스케줄 시간이 아닌데도 즉시 실행되는 경우가 있습니다. 이 현상의 주요 원인과 해결 방법을 정리하겠습니다. 또한, Kubernetes 노드(Node)의 라벨(Label) 확인 방법도 함께 소개합니다.


Kubernetes 노드 라벨 확인 방법

Kubernetes에서는 노드(Label)를 활용하여 워크로드를 특정 노드에 할당하거나, 스케줄링 정책을 적용할 수 있습니다. 노드의 라벨을 확인하는 방법은 다음과 같습니다.

1. 모든 노드의 라벨 확인

kubectl get nodes --show-labels

이 명령어는 클러스터 내 모든 노드의 라벨을 한눈에 확인할 수 있도록 출력합니다.


2. 특정 노드의 라벨 확인

kubectl get node <노드이름> --show-labels

예시:

kubectl get node my-node-1 --show-labels

3. 특정 라벨 값만 출력 (jsonpath 활용)

특정 노드에서 특정 라벨 키의 값을 확인하고 싶다면 jsonpath를 사용할 수 있습니다.

kubectl get node <노드이름> -o jsonpath='{.metadata.labels.<라벨키>}'

예시:

kubectl get node my-node-1 -o jsonpath='{.metadata.labels.kubernetes\.io/hostname}'

(.이 포함된 라벨 키는 \.처럼 이스케이프해야 합니다.)


4. 전체 라벨을 보기 쉽게 출력 (describe 활용)

kubectl describe node <노드이름> | grep Labels

이 명령어는 해당 노드의 Labels 부분만 필터링하여 출력합니다.


5. 특정 라벨을 가진 노드만 조회

kubectl get nodes -l <라벨키>=<라벨값>

예시:

kubectl get nodes -l env=production

이 명령어는 env=production 라벨이 설정된 노드만 출력합니다.


CronJob suspend 후 즉시 실행되는 원인

1. suspend 중에도 실행이 예약되었을 가능성

CronJobsuspend: true로 설정하면 새로운 실행이 스케줄되지 않지만, 이미 예약된 실행(Job) 이 있는 경우에는 보류되었다가 suspend: false로 변경할 때 즉시 실행될 수 있습니다.

확인 방법

kubectl get jobs --sort-by=.metadata.creationTimestamp

위 명령어를 실행하면 생성된 Job 목록을 시간 순으로 확인할 수 있습니다.
만약 suspend: true 설정 이전에 생성된 Job이 있었다면, suspend 해제 후 즉시 실행될 수 있습니다.

해결 방법

  • suspend 해제 전에 기존 Job을 삭제하면 방지할 수 있습니다.
kubectl delete job --all

2. suspend 해제 시 빠진 실행을 보충하려는 동작

Kubernetes의 CronJob 컨트롤러는 마지막 실행 시간을 확인하고 누락된 실행을 보충하기 위해 즉시 Job을 생성할 수 있습니다.

확인 방법

CronJob의 마지막 실행 시간을 확인하세요.

kubectl get cronjob <cronjob-name> -o jsonpath='{.status.lastScheduleTime}'

만약 suspend: true 동안 실행되지 못한 시간이 있다면, suspend: false 해제 시 이를 보충하기 위해 즉시 실행될 가능성이 있습니다.

해결 방법

  • startingDeadlineSeconds를 설정하여 일정 시간 이상 지난 실행은 무시할 수 있습니다.
spec:
startingDeadlineSeconds: 10

이렇게 하면 10초 이상 지연된 실행은 무시됩니다.


3. ConcurrencyPolicy 설정이 없는 경우

기본적으로 CronJobConcurrencyPolicy: Allow로 설정되어 있어, suspend 중에도 실행되어야 할 Job이 누적되었다가 한 번에 실행될 수 있습니다.

확인 방법

kubectl get cronjob <cronjob-name> -o yaml | grep concurrencyPolicy

만약 concurrencyPolicy: Forbid가 설정되어 있지 않다면, suspend 해제 후 여러 개의 Job이 동시에 실행될 수도 있습니다.

해결 방법

spec:
concurrencyPolicy: Forbid

이렇게 설정하면 새로운 Job이 기존 실행 중인 Job과 겹치지 않도록 방지할 수 있습니다.


4. missedSchedule 동작으로 인해 즉시 실행

Kubernetes의 CronJob 컨트롤러는 suspend 상태에서 놓친 스케줄을 추적하고 있으며, suspend: false로 해제할 때 누락된 실행을 복구하려고 시도할 수 있습니다.

해결 방법

  • 누락된 실행을 무시하고 싶다면, jobHistoryLimit0으로 설정하여 기존 Job을 바로 정리하는 것도 고려할 수 있습니다.
spec:
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0

결론

노드 라벨 확인

  • kubectl get nodes --show-labels → 모든 노드의 라벨 확인
  • kubectl get node <노드이름> --show-labels → 특정 노드의 라벨 확인
  • kubectl get node <노드이름> -o jsonpath='{.metadata.labels.<라벨키>}' → 특정 라벨 값 확인
  • kubectl describe node <노드이름> | grep Labels → 전체 라벨 정보 확인
  • kubectl get nodes -l <라벨키>=<라벨값> → 특정 라벨이 있는 노드만 조회

CronJob suspend 해제 후 즉시 실행 방지 방법

  1. 기존 Job 삭제sh복사kubectl delete job --all
  2. 이전 실행 무시 설정yaml복사spec: startingDeadlineSeconds: 10
  3. 중복 실행 방지yaml복사spec: concurrencyPolicy: Forbid
  4. Job 이력 저장 최소화yaml복사spec: successfulJobsHistoryLimit: 0 failedJobsHistoryLimit: 0

이 방법들을 적용하면 Kubernetes에서 예상치 못한 CronJob 실행과 노드 관리 작업을 보다 원활하게 수행할 수 있습니다. 🚀

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다