문제 개요
최근 회사 운영 환경에서 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이 부족으로 인식
👉 따라서 안정적인 운영을 위해서는
- HostPath 대신 emptyDir + PVC 또는 로그 수집 시스템(ELK, Loki 등) 활용
- 모든 Pod에 ephemeral-storage request/limit 설정
- 정기적으로 lsof | grep deleted 확인하여 삭제된 파일 점유 여부 모니터링
이 필수적임.
관련 링크 : https://github.com/kubernetes/website/issues/47122
https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
'DevOps & Infra > Kubernetes' 카테고리의 다른 글
| [k8s] cronjob 기반 pod 자동 재시작 및 slack 알림 제어 구현 (2) | 2025.10.06 |
|---|---|
| [k8s] MySQL Operator 재설치 시 기존 Persistent Volume 재사용 방법 및 문제 해결 (2) | 2025.07.14 |
