리소스 부족 및 노드 장애 대응 가이드
이 문서는 EKS 클러스터 운영 중 CPU/Memory 리소스 부족으로 인해 Pod가 Pending 상태에 빠지거나, 노드 자체가 NotReady 상태가 되었을 때의 해결 방법을 다룹니다.
1. Pod가 Pending 상태에서 멈춰있을 때 (Insufficient CPU)
상황
배포를 진행했는데 kubectl get pods 확인 시 Pod 상태가 계속 Pending이며 실행되지 않음.
kubectl describe pod <pod-name> 명령어로 확인 시 아래 메시지가 뜸:
0/2 nodes are available: 1 Insufficient cpu...
원인
노드가 가진 CPU 용량보다 Pod들이 요구하는 requests의 총합이 더 커서 스케줄링할 자리가 없는 경우입니다. (예: t3.medium은 2 vCPU인데, 각 Pod가 0.25 vCPU씩 너무 많이 요청함)
해결 방법
Deployment YAML 파일에서 resources.requests 값을 줄여서 더 많은 Pod가 노드에 들어갈 수 있게 합니다.
-
YAML 파일 수정 (
backend-deployment-dev.yaml,frontend...,worker...)resources:
requests:
memory: "256Mi"
cpu: "100m" # 기존 250m -> 100m로 감소 (0.1 vCPU)
limits:
memory: "1Gi"
cpu: "1000m" -
변경 사항 적용
kubectl apply -f backend-vivid-ai/backend-deployment-dev.yaml
kubectl apply -f frontend-vivid-ai/frontend-deployment-dev.yaml
# ... 필요한 모든 배포 파일 적용 -
확인
- 기존 Pod가 종료되고(Terminating) 새 설정이 적용된 Pod가 실행(Running)되는지 확인합니다.
2. 노드가 NotReady 상태일 때 (인스턴스 장애)
상황
클러스터 용량이 부족하거나 네트워크 이슈가 있어 노드 상태를 확인해보니 NotReady 상태임.
kubectl get nodes
# NAME STATUS ROLES
# ip-10-12-79-186... NotReady <none> <-- 문제 발생
# ip-10-12-33-130... Ready <none>
해결 방법 (AWS EC2 종료를 통한 자동 복구)
문제가 있는 노드(EC2 인스턴스)를 강제로 종료하면, EKS Auto Scaling Group이 이를 감지하고 자동으로 건강한 새 인스턴스를 생성합니다.
-
문제 노드의 Instance ID 확인
kubectl describe node <node-name> | grep ProviderID
# 출력 예: aws:///ap-northeast-1d/i-049e136e87619bbaf또는 AWS EC2 콘솔에서 해당 Private IP를 가진 인스턴스를 찾습니다.
-
인스턴스 강제 종료 (Terminate)
# AWS CLI 사용 시
aws ec2 terminate-instances --instance-ids i-049e136e87619bbaf또는 AWS 웹 콘솔에서 해당 인스턴스 우클릭 -> Terminate instance (인스턴스 종료) 선택.
-
복구 확인
- 몇 분 후
kubectl get nodes를 입력하면 새로운 노드가 생성되어Ready상태로 목록에 나타납니다.
- 몇 분 후