클라우드 타고 포트와 파도

문제 개요

최근 회사 운영 환경에서 pod가 갑자기 Evicted 상태로 종료되는 현상이 발생 했습니다.

에러 메시지를 보면 ephemeral-storage 부족이 원인이었는데, 실제 노드의 디스크 여유 공간은 충분히 있는 상황이라 이해하기 어려웠습니다.

 

  • 환경: Kubernetes v1.25.4
  • 로그 저장 방식: HostPath 마운트
The node was low on resource: ephemeral-storage.
Container ca-svr was using 13176Ki, which exceeds its request of 0.
Container ca-svr-filebeat was using 42096Ki, which exceeds its request of 0.

 

  • 노드 상태:
    • Node1: 77% 사용
    • Node2: 67% 사용
    • Node3: 71% 사용
      → 표면적으로는 여유 공간 충분

즉, 실제 자원은 넉넉한데 kubelet이 ephemeral-storage 부족으로 잘못 판단해 Eviction을 일으킨 상황이었습니다.

 

원인 분석 과정 

(1) Eviction 조건 확인

Kubernetes에서 Pod Eviction이 일어나는 기본 조건은 다음과 같습니다:

  • nodefs.available < 10% : 노드 디스크 여유 공간이 10% 미만
  • imagefs.available < 15% : 컨테이너 이미지 저장소 여유 공간이 15% 미만
  • memory.available : 메모리 부족
  • nodefs.inodesFree < 5% : inode 부족

실제 디스크 상황을 보면:

  • 전체 디스크 용량: 약 37GB
  • 사용량: 약 21.6GB → 실제 여유: 약 15.4GB
  • 하지만 삭제된 파일(약 1.3GB)이 여전히 프로세스에서 점유 중

즉, 삭제된 파일이 공간을 먹고 있는데 kubelet이 이를 반영하지 못해 계산이 꼬였을 가능성이 있었습니다.

 

(2) HostPath 사용 여부

문제의 Pod는 로그를 다음과 같이 HostPath로 저장하고 있었습니다:

volumes:
  - name: app-logs
    hostPath:
      path: /data/svr-logs

Kubernetes 공식 문서와 GitHub 이슈를 찾아보니,
HostPath는 kubelet이 관리하는 ephemeral-storage 계산 범위에 포함되지 않음이 확인되었습니다.

즉, kubelet은 /var/lib/kubelet, /var/lib/containerd, /var/log 같은 경로만 추적하는데, HostPath는 관리 대상이 아니므로

  • 용량을 제대로 계산하지 못하거나,
  • 삭제된 파일을 계속 잡고 있다고 잘못 판단해 Eviction을 발생시킬 수 있습니다.

 

(3) 삭제된 파일 점유 확인

실제로 lsof | grep deleted 명령어를 실행해 보니,
이미 삭제된 /var/log/messages-20250203 파일이 여전히 rsyslogd 프로세스에서 점유하고 있었습니다.

rsyslogd  936166 root  15w REG 252,0 1970689961 /var/log/messages-20250203 (deleted)

이 경우 kubelet은 해당 용량을 “여전히 사용 중”으로 판단하기 때문에, 디스크가 꽉 찬 것처럼 오판할 수 있습니다.

 

검증 테스트

1. HostPath 사용으로 인해 kubelet이 ephemeral-storage 사용량을 제대로 계산하지 못함

 

  • HostPath를 사용하는 Pod와 emptyDir를 사용하는 Pod를 각각 띄움
  • Pod 내부에서 지속적으로 로그 기록
  • kubelet이 ephemeral-storage 사용량을 추적하는지 비교

HostPath

 

 

  • Pod 내부에서는 로그 파일이 정상적으로 증가
  • 하지만 kubelet은 ephemeral-storage 사용량을 제대로 반영하지 않음 → 계산 오류 발생
kubectl exec -it test-hostpath -- tail -f /data/test-logs/ephemeral_log.txt

 

EmptyDir방식

 

  • ephemeral-storage 요청 값이 정상 반영됨
  • kubelet이 사용량을 정확히 추적
kubectl exec -it test-emptydir -- tail -f /var/log/ephemeral_log.txt

 

결론

HostPath 사용 시 ephemeral-storage 계산이 kubelet에 정상 반영되지 않아, 예상치 못한 Eviction 발생 가능성이 있음.

 

2.ephemeral-storage 요청 값이 없을 때 Eviction이 발생하는지 확인

 

  • Pod A : ephemeral-storage 요청 값 설정
  • Pod B : 요청 값 미설정
  • 두 Pod에서 모두 로그 생성 → Eviction 발생 여부 확인

ephemeral-storage 요청 값을 설정한 경우

  • kubelet이 리소스 사용량을 정상적으로 추적하며, 설정된 제한을 초과할 경우 Eviction이 발생.

 

 

 

ephemeral-storage 요청 값을 설정하지 않은 경우

  • kubelet이 ephemeral-storage 사용량을 명확하게 추적하지 못해,예상하지 못한 시점에 Eviction이 발생하거나Eviction이 발생하지 않음에도 디스크 사용량 부족 경고가 뜨는 문제 발생할수 있음.

결론
ephemeral-storage 요청 값이 없으면 kubelet 동작이 예측 불가 → 반드시 request/limit 설정 필요

 

3. 삭제된 파일 점유 문제

 

  • 오래된 로그 파일 삭제 후
  • lsof | grep deleted 실행 → 프로세스가 점유 중인지 확인

결과

rsyslogd 936166 root 15w REG 252,0 1970689961 /var/log/messages-20250203 (deleted)

 

 

  • 실제로는 파일이 삭제됐지만, 프로세스가 핸들을 쥐고 있어서 디스크 공간이 해제되지 않음
  • kubelet은 이 용량을 “여전히 사용 중”으로 계산

결론

삭제된 파일이 점유 중일 경우 kubelet 계산 오류 → ephemeral-storage 부족으로 잘못 판단, Eviction 발생

 

 

종합 정리

  • HostPath 문제 : kubelet 관리 범위 밖이라 ephemeral-storage 계산 불일치
  • request/limit 미설정 문제 : kubelet이 추적을 불완전하게 하여 Eviction 시점이 불규칙
  • 삭제된 파일 점유 문제 : 공간은 있어도 해제되지 않아 kubelet이 부족으로 인식

👉 따라서 안정적인 운영을 위해서는

  1. HostPath 대신 emptyDir + PVC 또는 로그 수집 시스템(ELK, Loki 등) 활용
  2. 모든 Pod에 ephemeral-storage request/limit 설정
  3. 정기적으로 lsof | grep deleted 확인하여 삭제된 파일 점유 여부 모니터링
    이 필수적임.

관련 링크 : https://github.com/kubernetes/website/issues/47122

https://kubernetes.io/docs/concepts/storage/volumes/#hostpath

https://kubernetes.io/ko/docs/concepts/configuration/manage-resources-containers/#ephemeral-storage-요청이-있는-파드의-스케줄링-방법

 

 

profile

클라우드 타고 포트와 파도

@cloudwave

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!