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 |