본문 바로가기

K8S

쿠버네티스 pod status evicted

반응형

Kubernetes에서 Evicted는 파드가 애플리케이션 오류로 종료된 것이 아니라, 노드가 리소스 부족 상태가 되어 kubelet이 파드를 강제로 내보낸 상태입니다.

즉, 파드 자체 문제라기보다 보통 노드 리소스 압박 때문에 발생합니다.

Evicted가 의미하는 것

파드 상태가 이렇게 보입니다.

kubectl get pods -n <namespace>
NAME                 READY   STATUS    RESTARTS
my-app-xxxxx         0/1     Evicted   0
my-app-yyyyy         1/1     Running   0
 

Evicted 된 파드는 다시 Running으로 돌아오지 않습니다.
Deployment, ReplicaSet 등이 관리 중이면 Kubernetes가 새 파드를 다시 띄우기 때문에 Evicted 파드 + 새 Running 파드가 같이 보일 수 있습니다.

주요 원인

가장 흔한 원인은 아래 세 가지입니다.

원인설명
ephemeral-storage 부족 노드 디스크, 컨테이너 로그, /tmp, 캐시, emptyDir 사용량 증가
Memory 부족 노드 메모리 압박으로 우선순위가 낮은 파드가 축출됨
PID 부족 노드에서 생성 가능한 프로세스 수 부족

실무에서는 특히 ephemeral-storage 부족이 매우 흔합니다.

원인 확인 방법

먼저 Evicted 된 파드를 describe 합니다.

kubectl describe pod <evicted-pod-name> -n <namespace>
 

아래 부분을 봅니다.

Reason: Evicted
Message: The node was low on resource: ephemeral-storage.
 

또는:

Message: The node was low on resource: memory.
 

파드가 어느 노드에서 Evicted 되었는지도 확인합니다.

kubectl get pod <evicted-pod-name> -n <namespace> -o wide
 

그다음 해당 노드 상태를 봅니다.

kubectl describe node <node-name>
 

여기서 아래 항목을 확인합니다.

MemoryPressure
DiskPressure
PIDPressure
 

Evicted 파드는 삭제해도 되나?

새 파드가 정상적으로 떠 있고 서비스가 문제없다면 Evicted 파드는 삭제해도 됩니다.

kubectl delete pod <evicted-pod-name> -n <namespace>
 

Failed 상태 파드를 한 번에 정리하려면:

kubectl delete pod -n <namespace> --field-selector=status.phase=Failed
 

다만 이건 증상 정리일 뿐이고, 원인을 해결하지 않으면 다시 Evicted가 발생할 수 있습니다.

재발 방지 방법

1. 리소스 requests / limits 설정

특히 memory와 ephemeral-storage를 명시하는 것이 좋습니다.

resources:
  requests:
    cpu: "100m"
    memory: "256Mi"
    ephemeral-storage: "512Mi"
  limits:
    memory: "512Mi"
    ephemeral-storage: "1Gi"
 

requests는 스케줄링 기준이고, limits는 사용 상한입니다.

2. 로그 과다 확인

컨테이너 로그가 너무 많이 쌓이면 노드 디스크 압박이 생길 수 있습니다.

kubectl logs <pod-name> -n <namespace> --tail=100
 

노드 접근이 가능하면:

df -h
 

컨테이너 런타임 로그, 이미지 캐시, 오래된 컨테이너 정리도 필요할 수 있습니다.

3. emptyDir / tmp 사용량 확인

애플리케이션이 /tmp, 캐시 디렉터리, 업로드 임시 파일을 많이 쓰는 경우 ephemeral-storage를 많이 잡아먹습니다.

emptyDir를 쓰고 있다면 sizeLimit을 줄 수 있습니다.

volumes:
  - name: tmp
    emptyDir:
      sizeLimit: 1Gi
 

4. 노드 용량 확보 또는 증설

노드가 계속 DiskPressure 또는 MemoryPressure 상태라면 파드만 수정해서는 부족할 수 있습니다.

확인:

kubectl top node
kubectl top pod -A
 

필요하면 노드 디스크 정리, 노드 증설, 오토스케일링 설정을 봐야 합니다.

정리

Evicted 처리 순서는 이렇게 보면 됩니다.

# 1. Evicted 파드 확인
kubectl get pods -n <namespace> -o wide

# 2. 원인 확인
kubectl describe pod <evicted-pod-name> -n <namespace>

# 3. 새 파드 정상 여부 확인
kubectl get pods -n <namespace>
kubectl logs <new-pod-name> -n <namespace> --tail=100

# 4. Evicted 파드 삭제
kubectl delete pod <evicted-pod-name> -n <namespace>

# 5. 노드 Pressure 확인
kubectl describe node <node-name>
kubectl top node
 

핵심은 Evicted 파드는 죽은 파드라 삭제해도 되지만, 반드시 describe pod의 Message를 보고 원인을 잡아야 한다는 점입니다.

반응형

'K8S' 카테고리의 다른 글

EKS IaC - Terraform Moudle  (1) 2024.04.28
EKS CICD - ArgoCD & RollOut  (1) 2024.04.21
EKS CICD - Jenkins Pipeline  (1) 2024.04.21
EKS CICD - Docker, Jenkins  (0) 2024.04.20
EKS Security - 3  (0) 2024.04.14