쿠버네티스 노드 디스크 꽉 차면 Kubelet이 DiskPressure 걸어버리고 Pod 강제 퇴출 시작함 ㄷㄷ.
당황하지 말고 아래 순서로 빠르게 원인 잡고 용량 확보하면 됨.
1. 장애 노드 및 상태 확인
어느 노드가 찌들어있는지, 튕겨 나간 Pod 있는지 먼저 확인.
# 1. DiskPressure 발생 노드 확인
kubectl get nodes -o custom-columns=NAME:.metadata.name,DISK_PRESS:.status.conditions[?(@.type=="DiskPressure")].status
# 2. Evicted 상태 Pod 목록 확인
kubectl get pods -A | grep Evicted
2. Root Cause 탐색 (노드 디렉터리 스캔)
해당 노드 SSH 접속 후 /var 하위 대용량 디렉터리 빠르게 추적.
# /var 하위 용량 Top 5 탐색 (depth 2 스캔)
sudo du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -n 5
용량 폭발 3대 주범
- /var/log/pods : App stdout/stderr 로그 파일 누적 (가장 흔함)
- /var/lib/containerd : 안 쓰는 이미지(Dangling Image) 및 컨테이너 레이어 찌꺼기
- /var/lib/kubelet/pods : Pod 내 emptyDir 임시 볼륨 데이터 폭증
3. 긴급 용량 확보 (Runbook)
① 로그 파일 비우기 (rm 대신 truncate 사용)
rm으로 지우면 프로세스가 File Descriptor 잡고 있어서 디스크 용량 안 줄어듦. truncate로 0 Byte 초기화 필수.
# 500MB 이상 누적된 Pod 로그 파일 비우기
sudo find /var/log/pods/ -type f -name "*.log" -size +500M -exec truncate -s 0 {} \;
② Container Runtime 정리 (crictl)
containerd 환경에선 docker 대신 crictl로 Garbage Collection 수행함.
# 미사용 이미지 일괄 삭제
sudo crictl rmi --prune
# Exited 상태 컨테이너 삭제
sudo crictl rm $(sudo crictl ps -a -q --state Exited)
③ emptyDir 폭증 Pod 찾아서 재시작
/var/lib/kubelet/pods 용량이 크면 특정 Pod의 emptyDir이 원인임. Pod 삭제(재시작)해서 임시 볼륨 날려버림.
# 1. 가장 큰 Pod UID 디렉터리 확인
sudo du -ha /var/lib/kubelet/pods | sort -rh | head -n 2
# 2. UID로 Pod 찾아 강제 재시작 (emptyDir 초기화)
kubectl get pods -A -o wide | grep <확인한_UID>
kubectl delete pod <POD_NAME> -n <NAMESPACE> --grace-period=0 --force
4. 근본 대책 (재발 방지)
노드별 /etc/kubernetes/kubelet-config.yaml에 로그 롤링 및 자동 이미지 GC 설정 추가해두기.
YAML
# Kubelet 로그 파일 회전 설정
containerMaxLogSize: "50Mi"
containerMaxLogFiles: 5
# 디스크 80% 도달 시 미사용 이미지 자동 청소 (70%까지 확보)
imageGCHighThresholdPercent: 80
imageGCLowThresholdPercent: 70
'TIL' 카테고리의 다른 글
| Kubernetes Pod별 리소스 모니터링 구성 (0) | 2026.09.03 |
|---|---|
| Vite 외부 공격 요청을 보면서 정리한 보안 체크 5가지 (0) | 2026.08.31 |
| Docker 디스크 부족 시 확인 방법 (0) | 2026.08.26 |
| 다시 보는 Docker 기본 명령어 (0) | 2026.08.20 |
| Linkerd Canary 배포 (0) | 2026.08.17 |