Kubernetes/Kubernetes Advanced

📌 [Job 심화편 #5] Job 로그 수집 전략: 실행 완료 후 로그 유실 방지하기

ygtoken 2025. 3. 25. 16:01
728x90

 

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 값도 함께 고려하여 로그 생존 시간을 확보하는 것이 중요합니다.

 

728x90