1️⃣ 개요
Kubernetes에서 Job 리소스는 작업 완료 후 Pod이 자동으로 종료됩니다.
이로 인해, Job 실행 중 남긴 로그는 별도 처리 없이 유실될 수 있으며,
특히 Pod이 완료되거나 삭제되면 kubectl logs 명령으로도 확인할 수 없게 됩니다.
이 글에서는 Job 실행 로그를 안전하게 수집하고 보존하는 전략을 정리합니다.
2️⃣ Job 로그가 사라지는 이유
원인 | 설명 |
Pod 완료 시 종료 | Job은 성공 시 Pod을 종료함 |
TTL 설정 시 자동 삭제 | ttlSecondsAfterFinished 설정으로 일정 시간 후 Pod 삭제 |
로그 수집기 미연동 | 로그를 외부로 전송하지 않으면 로그는 노드 디스크에만 존재 |
kubectl logs 대상 없음 | 삭제된 Pod에 대해 로그 조회 불가 |
✅ Job은 일시적인 리소스이기 때문에 로그 보존을 위한 별도 설계가 필요합니다.
3️⃣ 로그 유실을 방지하는 3가지 방법
방법 | 설명 |
로그 수집기 연동 | Fluent Bit, Vector, Filebeat 등을 이용한 중앙 로그 수집 |
로그를 외부로 전송 | 로그를 S3, Kafka 등 외부 저장소로 직접 출력 |
로그를 PVC에 저장 | Job 컨테이너에서 파일로 로그를 기록하고 볼륨에 저장 |
4️⃣ 예제: 로그를 파일로 저장하고 로그 수집기로 전송하는 구조
apiVersion: batch/v1
kind: Job
metadata:
name: log-writing-job # Job 이름 정의
spec:
ttlSecondsAfterFinished: 600 # Job 완료 후 10분 후 리소스 자동 삭제
template:
spec:
restartPolicy: Never # 실패 시 재시작하지 않음
containers:
- name: log-writer
image: busybox
command:
- sh
- -c
- |
echo "🔍 작업 시작"; \
echo "로그 수집 테스트입니다" >> /var/log/my-job/output.log; \
sleep 5
volumeMounts:
- name: job-logs
mountPath: /var/log/my-job # 로그 저장 위치
volumes:
- name: job-logs
hostPath:
path: /var/log/jobs # 노드의 경로에 저장 (로그 수집기 탐색 가능)
📌 설명 요약
• echo 출력은 로그 파일로 저장됩니다.
• 로그 수집기는 /var/log/jobs 디렉터리를 탐색해 중앙 시스템으로 전송할 수 있습니다.
• Job 자체는 5초 후 종료되지만 로그는 파일로 남습니다.
5️⃣ 로그 수집기 연동 예시
로그 수집기 | 수집 대상 디렉터리 | 대상 시스템 |
Fluent Bit | /var/log/jobs/*.log | Elasticsearch, Loki |
Filebeat | /var/log/jobs/ | Logstash |
Vector | /var/log/jobs/ | S3, Kafka, Promtail |
✅ 로그 수집기는 일반적으로 호스트 디렉터리 기준으로 수집하므로, hostPath 사용이 적절합니다.
6️⃣ 로그 수명 연장: TTL 설정 유의사항
ttlSecondsAfterFinished: 0
• 이 값을 생략하거나 0으로 설정하면 Job은 자동 삭제되지 않습니다.
• 로그를 길게 보존하고 싶은 경우에는 TTL 값을 낮추지 않거나 제거해야 합니다.
7️⃣ 추가 팁: 로그를 직접 외부 전송하는 방식
# S3 CLI를 설치하고 다음과 같이 전송 가능
aws s3 cp /var/log/my-job/output.log s3://my-job-logs/output-$(date +%s).log
📌 Pod 내에서 외부 CLI를 설치해 직접 로그를 전송하는 방법도 있습니다.
🔥 8️⃣ 결론
✔ Job은 작업 완료 시 Pod을 삭제하거나 종료하기 때문에, 로그 유실 위험이 있습니다.
✔ 로그를 안전하게 수집하려면 파일 저장 + 로그 수집기 연동, 또는 외부 시스템 직접 전송 방식이 필요합니다.
✔ ttlSecondsAfterFinished 값도 함께 고려하여 로그 생존 시간을 확보하는 것이 중요합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Job 심화편 #7] Job의 CronJob 전환 전략: 반복성 여부에 따른 리소스 선택 기준 (0) | 2025.03.25 |
---|---|
📌 [Job 심화편 #6] Job 리소스의 컨트롤러 상태 분석: 완료되지 않은 Job의 정리 기준 (0) | 2025.03.25 |
📌 [Job 심화편 #4] Job의 completions, parallelism 조합을 통한 병렬 처리 패턴 구성 (0) | 2025.03.25 |
📌 [Job 심화편 #3] Job 실행 중 Node 장애 시 복구 시나리오 분석 (0) | 2025.03.25 |
📌 [Job 심화편 #2] Job에서 BackoffLimit과 ActiveDeadlineSeconds의 차이점과 조합 전략 (0) | 2025.03.22 |