쿠버네티스 OOMKilled·Evicted 트러블슈팅: Node 장애까지 한 번에 정리
쿠버네티스 실전 트러블슈팅, OOMKilled · Evicted · Node 장애 대응 정리
앞선 글에서는 Pod가 뜨지 않을 때의 기본적인 확인 순서를 정리했다.
이번에는 운영 중 실제로 가장 자주 마주치는 조금 더 실전적인 에러들을 다룬다.
- Pod가 갑자기 재시작되며 OOMKilled가 찍힌다
- 아무 설정도 안 바꿨는데 Pod가 Evicted 상태가 된다
- 특정 Node에서만 문제가 반복된다
이런 케이스들은 단순한 설정 오류를 넘어서
리소스와 클러스터 상태를 함께 봐야 하는 문제다.
OOMKilled: 가장 흔한 메모리 관련 장애
OOMKilled는 이름 그대로다.
컨테이너가 메모리 limits를 초과해 강제로 종료된 상태
이 상태는 로그를 보지 않아도
kubectl describe pod에서 바로 확인할 수 있다.
Reason: OOMKilled
[이미지: OOMKilled 상태가 표시된 Pod describe 예시]
OOMKilled가 발생하는 대표적인 원인
1. 메모리 limits가 너무 작은 경우
가장 흔한 케이스다.
- requests는 적당히 설정
- limits를 과하게 작게 설정
특히 다음 상황에서 자주 발생한다.
- JVM 기반 애플리케이션
- 초기 로딩 시 메모리 사용량이 큰 서비스
- 캐시를 사용하는 애플리케이션
실제로 써보면
“평소에는 괜찮다가 특정 타이밍에만 죽는” 패턴이 많다.
2. 메모리 누수 또는 비정상 사용
limits를 충분히 줬는데도 OOMKilled가 난다면
애플리케이션 자체를 의심해야 한다.
- GC가 제대로 동작하지 않는 경우
- 특정 요청에서 메모리를 과도하게 사용하는 경우
이때는 단순히 limits를 늘리는 것보다
메모리 사용 패턴을 확인하는 게 먼저다.
Evicted: Node가 Pod를 쫓아내는 상황
Evicted는 Pod 자체의 문제가 아닐 수도 있다.
Node가 리소스 압박 상태가 되면서 Pod를 강제로 제거한 경우
대표적인 트리거는 다음과 같다.
- Node 메모리 부족
- 디스크 압박
- 임시 스토리지 부족
[이미지: Node 리소스 압박으로 Pod가 Evicted되는 흐름]
Evicted가 발생했을 때 확인 순서
1. Pod 이벤트 확인
kubectl describe pod <pod-name>
이벤트에 보통 이런 메시지가 나온다.
- The node was low on resource: memory
- The node had disk pressure
이 메시지를 보면
“Pod 설정 문제인지, Node 문제인지”가 갈린다.
2. 같은 Node의 다른 Pod 상태 확인
- 같은 Node에 있던 Pod들이 연쇄적으로 사라졌는지
- 특정 워크로드만 반복적으로 Evicted되는지
여러 Pod가 동시에 영향을 받았다면
거의 확실하게 Node 레벨 문제다.
Node 장애: 가장 범위가 큰 문제
Node 장애는
개별 Pod 트러블슈팅과 접근 방식이 다르다.
다음 징후가 보이면 Node를 의심해볼 필요가 있다.
- Node 상태가 NotReady
- 특정 Node에만 Pod 장애가 집중됨
- 네트워크 타임아웃이 반복됨
kubectl get nodes
여기서 상태가 비정상이라면
Pod 레벨에서 아무리 봐도 답이 안 나온다.
Node 장애 시 기본 대응 흐름
실무에서 많이 사용하는 접근은 다음과 같다.
- Node 상태 확인
- 해당 Node에 있는 Pod 목록 확인
- Pod 재스케줄링 여부 확인
- Node 격리 또는 재시작
쿠버네티스의 장점은
Node 하나가 문제가 생겨도
다른 Node로 Pod를 옮길 수 있다는 점이다.
다만, StatefulSet이나
Node에 의존적인 워크로드는
영향이 더 크게 나타날 수 있다.
트러블슈팅에서 자주 하는 실수
운영하면서 자주 보게 되는 패턴이다.
- OOMKilled인데 무작정 limits만 늘림
- Evicted인데 Pod 설정만 계속 수정함
- Node 문제인데 Pod 로그만 계속 봄
이런 경우는
문제를 “한 단계 위에서” 봐야 한다.
Pod → Node → Cluster
이 흐름을 왔다 갔다 할 수 있어야 한다.
장애를 줄이기 위한 사전 포인트
완벽한 예방은 어렵지만,
다음만 지켜도 장애 빈도가 꽤 줄어든다.
- 메모리 limits는 여유 있게
- Node 리소스 모니터링 필수
- Eviction 이벤트 알람 설정
- 특정 Node에 워크로드 쏠림 방지
실제로 운영해보면
트러블슈팅보다 사전 감지가 훨씬 중요하다는 걸 느끼게 된다.
정리하며
이번 글에서는 쿠버네티스 운영 중
가장 자주 마주치는 실전 트러블슈팅 케이스를 정리했다.
- OOMKilled는 대부분 메모리 문제다
- Evicted는 Node 리소스 압박 신호다
- Node 장애는 Pod만 봐서는 해결되지 않는다
다음 글에서는
이 트러블슈팅을 줄이기 위한 관점에서
쿠버네티스 운영 시 설계와 습관,
즉 “처음부터 덜 아프게 운영하는 방법”을 정리해볼 예정이다.