Kubernetes에서 CronJob
을 suspend: 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 중에도 실행이 예약되었을 가능성
CronJob
을 suspend: 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 설정이 없는 경우
기본적으로 CronJob
은 ConcurrencyPolicy: 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
로 해제할 때 누락된 실행을 복구하려고 시도할 수 있습니다.
해결 방법
- 누락된 실행을 무시하고 싶다면,
jobHistoryLimit
을0
으로 설정하여 기존 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 해제 후 즉시 실행 방지 방법
- 기존
Job
삭제sh복사kubectl delete job --all
- 이전 실행 무시 설정yaml복사
spec: startingDeadlineSeconds: 10
- 중복 실행 방지yaml복사
spec: concurrencyPolicy: Forbid
- Job 이력 저장 최소화yaml복사
spec: successfulJobsHistoryLimit: 0 failedJobsHistoryLimit: 0
이 방법들을 적용하면 Kubernetes에서 예상치 못한 CronJob
실행과 노드 관리 작업을 보다 원활하게 수행할 수 있습니다.