← 아티클 목록

쿠버네티스 Pod Evicted — 노드 압박 원인과 복구 (kubectl)

2028-01-03#kubernetes#트러블슈팅#kubectl

kubectl get pods를 쳤을 때 STATUS가 Evicted인 Pod가 줄줄이 쌓여 있다면, 쿠버네티스가 노드 자원이 부족해서 Pod를 강제로 쫓아낸 것입니다. CrashLoopBackOff가 "컨테이너가 죽는" 문제라면, Evicted는 노드가 압박을 받아 kubelet이 Pod를 희생시킨 결과입니다. 원인은 Pod가 아니라 노드에 있습니다.

1단계 — 왜 쫓겨났는지 본다

Kubernetes
# 쫓겨난 Pod의 사유 확인
kubectl describe pod <pod> | grep -A3 -i evict

# 노드 압박 상태(Conditions) 확인
kubectl describe node <node> | grep -A6 Conditions

describe pod 출력의 Message: The node was low on resource: memory(또는 ephemeral-storage)가 핵심 단서입니다. 노드 쪽 Conditions에서 MemoryPressure, DiskPressureTrue인지 확인합니다.

2단계 — 압박 종류로 원인 좁히기

노드 Condition의미어디를 보나
MemoryPressure=True가용 메모리가 임계치 이하Pod requests/limits.memory 과소 설정
DiskPressure=True디스크 또는 inode 부족컨테이너 로그·이미지 누적, emptyDir 폭증
PIDPressure=True프로세스 ID 고갈좀비 프로세스, fork 폭주

kubelet은 압박이 생기면 우선순위가 낮은 Pod부터 내보냅니다. requests를 설정하지 않은 BestEffort Pod가 가장 먼저 희생됩니다.

원인과 해결

① 메모리 압박 — 노드 전체 메모리 요청 합이 실제 용량에 근접하면 kubelet이 임계치에서 Pod를 축출합니다. resources.requests.memory를 실제 사용량 기준으로 잡고, 핵심 워크로드는 requests == limits(Guaranteed QoS)로 보호합니다.

② 디스크 압박 — 대부분 컨테이너 로그와 미사용 이미지가 디스크를 채워서 생깁니다. kubectl describe nodeephemeral-storage 사용량을 보고, 노드에서 crictl rmi --prune으로 미사용 이미지를 정리합니다.

③ 우선순위 미설정 — 같은 노드에서 덜 중요한 Pod가 먼저 죽도록 PriorityClass를 부여해, 중요한 워크로드가 압박 시에도 살아남게 합니다.

정리 + 복구 체크리스트

Kubernetes
# 쌓인 Evicted Pod 한 번에 정리
kubectl get pods -A --field-selector=status.phase=Failed -o name \
  | xargs -r kubectl delete

# 노드 자원 사용량 확인 (metrics-server 필요)
kubectl top nodes
kubectl top pods -A --sort-by=memory

Evicted Pod 자체는 삭제해도 안전합니다. 중요한 건 노드 압박을 만든 원인을 없애는 것입니다. kubectl top으로 어떤 Pod가 자원을 먹는지 좁히고, requests를 손봐야 재발하지 않습니다.


노드 압박을 일부러 만들어 Pod가 축출되는 과정을 kubectl로 관찰하는 실습은 쿠버네티스 트랙에서 직접 해볼 수 있습니다 — 회원가입 없이 무료로.