Skip to main content

리소스 부족 및 노드 장애 대응 가이드

이 문서는 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가 노드에 들어갈 수 있게 합니다.

  1. YAML 파일 수정 (backend-deployment-dev.yaml, frontend..., worker...)

    resources:
    requests:
    memory: "256Mi"
    cpu: "100m" # 기존 250m -> 100m로 감소 (0.1 vCPU)
    limits:
    memory: "1Gi"
    cpu: "1000m"
  2. 변경 사항 적용

    kubectl apply -f backend-vivid-ai/backend-deployment-dev.yaml
    kubectl apply -f frontend-vivid-ai/frontend-deployment-dev.yaml
    # ... 필요한 모든 배포 파일 적용
  3. 확인

    • 기존 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이 이를 감지하고 자동으로 건강한 새 인스턴스를 생성합니다.

  1. 문제 노드의 Instance ID 확인

    kubectl describe node <node-name> | grep ProviderID
    # 출력 예: aws:///ap-northeast-1d/i-049e136e87619bbaf

    또는 AWS EC2 콘솔에서 해당 Private IP를 가진 인스턴스를 찾습니다.

  2. 인스턴스 강제 종료 (Terminate)

    # AWS CLI 사용 시
    aws ec2 terminate-instances --instance-ids i-049e136e87619bbaf

    또는 AWS 웹 콘솔에서 해당 인스턴스 우클릭 -> Terminate instance (인스턴스 종료) 선택.

  3. 복구 확인

    • 몇 분 후 kubectl get nodes를 입력하면 새로운 노드가 생성되어 Ready 상태로 목록에 나타납니다.