1️⃣ 개요
Job은 일회성 작업 또는 배치 작업을 위한 중요한 리소스입니다.
하지만 Job 실행 중 해당 Pod이 올라간 노드가 장애(예: 전원 다운, 네트워크 단절) 상태가 되면, Job의 처리 흐름이 중단될 수 있습니다.
이 글에서는 Job이 노드 장애 상황에서 어떻게 반응하는지, 그리고
복구를 위해 어떤 설정을 적용해야 하는지에 대해 설명합니다.
2️⃣ 기본 동작 원리
조건 | Kubernetes의 기본 반응 |
Job Pod 실행 중 노드가 다운됨 | 해당 Pod이 Unknown 또는 Terminating 상태로 유지됨 |
Kubelet이 응답 불가 상태 | Pod이 삭제되지 않고 그대로 남음 |
일정 시간 경과 후 | Controller가 Pod을 새로 생성할 수 있음 (노드 상태 감지 후 재시도) |
✅ 이 과정은 빠르게 전환되지 않으며, 일부 설정이 없으면 Job이 진행되지 않고 멈춘 상태로 대기할 수 있습니다.
3️⃣ 문제 예시 상황
• Job이 실행되던 노드가 갑자기 전원 OFF됨
• Job Controller는 해당 Pod이 여전히 “실행 중”으로 간주
• 실제로는 실행되지 않음
• 새로운 Pod을 생성하지 못해 Job이 무기한 대기
4️⃣ 해결 전략 요약
전략 | 설명 |
activeDeadlineSeconds 설정 | 무한 대기 방지 (전체 실행 시간 제한) |
Pod 삭제 감시 | 노드 장애 감지 시 수동 또는 자동으로 해당 Pod 삭제 |
TTL 설정 | 완료 후 자원 정리 |
스케줄러에 taint 감지 기능 활용 | 장애 노드에 Pod 재스케줄 방지 |
5️⃣ 예제 Job: 노드 장애 감지를 위한 제한 포함
apiVersion: batch/v1
kind: Job
metadata:
name: resilient-job # Job 이름
spec:
backoffLimit: 2 # 실패 시 최대 2회 재시도 허용
activeDeadlineSeconds: 180 # 전체 실행 제한 시간 3분
template:
spec:
restartPolicy: OnFailure # Pod 실패 시 재시작 허용
containers:
- name: unstable-work
image: busybox
command:
- sh
- -c
- |
echo "작업 시작"; sleep 600 # 의도적으로 오래 걸리는 작업
📌 설명 요약
• sleep 600으로 인해 Job이 긴 시간 실행됩니다.
• 도중에 노드가 장애가 나면, activeDeadlineSeconds를 통해 무한 대기를 방지합니다.
6️⃣ 수동 복구 절차 예시
# Job에 연결된 Pod 확인
kubectl get pod -l job-name=resilient-job
# Pod 상태가 Unknown 또는 Terminating일 경우 강제 삭제
kubectl delete pod <pod-name> --force --grace-period=0
📌 수동 삭제 후, Job 컨트롤러는 새로운 Pod을 다시 생성하여 작업을 재시작합니다.
7️⃣ 자동화된 복구 설계 팁
구성 요소 | 설명 |
livenessProbe | Pod이 실제로 동작 중인지 감지하여 실패 처리 유도 가능 |
taint-based eviction | 노드 장애 감지 시 Pod 강제 제거 정책 활성화 |
cluster autoscaler | 비정상 노드 감지 시 자동 제거 및 재배치 가능 |
controller manager 설정 | --node-monitor-grace-period, --pod-eviction-timeout 설정 최적화 가능 |
🔥 8️⃣ 결론
✔ Job이 실행 중인 노드가 장애를 겪으면, 작업이 멈춘 채로 대기할 수 있습니다.
✔ activeDeadlineSeconds, 수동 Pod 정리, 스케줄러 감지 기능 등을 통해 이러한 상황을 복구할 수 있습니다.
✔ 장애 상황에서 자동 복구 흐름을 구축하려면 노드 헬스체크 정책과 Pod 재스케줄링에 대한 이해가 필요합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Job 심화편 #5] Job 로그 수집 전략: 실행 완료 후 로그 유실 방지하기 (0) | 2025.03.25 |
---|---|
📌 [Job 심화편 #4] Job의 completions, parallelism 조합을 통한 병렬 처리 패턴 구성 (0) | 2025.03.25 |
📌 [Job 심화편 #2] Job에서 BackoffLimit과 ActiveDeadlineSeconds의 차이점과 조합 전략 (0) | 2025.03.22 |
📌 [Job 심화편 #1] Job 리소스의 실행 보장 방식: Pod 실패 대비 전략과 재시도 설정 (0) | 2025.03.22 |
📌 [DaemonSet 심화편 #24] DaemonSet의 ReplicaSet과의 차이점 분석: 운영 구조와 스케줄링 비교 (0) | 2025.03.22 |