Skip to content

resource

TL;DR

  • requests는 최소 보장 리소스, limits는 최대 허용 리소스를 의미함.
  • requests 값을 기준으로 파드가 스케줄링되며, limits 초과 시 throttling 또는 OOM 발생함.
  • 실사용량을 모니터링하여 적절한 값을 설정하는 것이 중요함.

requests와 limits 개념

  • requests: 파드가 최소한으로 필요한 CPU 및 메모리 양을 설정함.
  • limits: 파드가 사용할 수 있는 최대 CPU 및 메모리 양을 설정함.
  • CPU requests 부족 시: 스케줄링되지 않음.
  • CPU limits 초과 시: throttling 발생하여 성능 저하됨.
  • 메모리 limits 초과 시: OOMKill 발생하여 파드가 종료됨.

requests와 limits 설정 방법

  • CPU 단위:
    • m (milliCPU, 1000m = 1 vCPU)
    • 예: cpu: "500m" → 0.5 vCPU 사용 요청
  • 메모리 단위:
    • Mi (Mebibyte), Gi (Gibibyte) 등
    • 예: memory: "1Gi" → 1GiB 메모리 요청
resources:
  requests:
    cpu: "500m"    # 0.5 vCPU 요청
    memory: "1Gi"  # 1GiB 메모리 요청
  limits:
    cpu: "1000m"   # 1 vCPU 제한
    memory: "2Gi"  # 2GiB 메모리 제한

설정 가이드라인

  • requests는 평균 사용량, limits는 최대 사용량에 맞춤.
  • CPU limits 값이 너무 낮으면 throttling 발생 → CPU-intensive한 애플리케이션에서 성능 저하.
  • 메모리 limits 값이 너무 낮으면 OOM 발생 → 파드가 강제 종료됨.
  • requests와 limits 비율을 1:2 또는 1:4로 설정하여 여유 확보.
  • HPA (Horizontal Pod Autoscaler)와 조합하여 동적 확장 고려.

Throttling이란?

  • CPU limits 값을 초과하면 발생하는 제어 기법.
  • OS 커널이 CPU 사용을 제한하여 성능 저하를 유발함.
  • CPU 사용량이 limits에 도달하면 프로세스가 일정 시간 대기해야 함.
  • kubectl top pod 명령어로 확인 가능.
kubectl top pod --namespace=my-namespace

모니터링 및 최적화 방법

  • kubectl로 현재 리소스 사용량 확인:
kubectl describe pod my-pod
kubectl top pod --namespace=my-namespace
  • Prometheus + Grafana를 활용한 모니터링:
    • kube_pod_container_resource_requests_cpu_cores
    • kube_pod_container_resource_limits_cpu_cores
  • OOMKill 발생 로그 확인:
kubectl get events --sort-by=.metadata.creationTimestamp

결론

  • requestslimits 값을 현실적인 기준으로 설정해야 성능 저하를 방지할 수 있음.
  • CPU limits가 너무 낮으면 throttling, 메모리 limits가 너무 낮으면 OOM 발생 가능.
  • 실시간 모니터링과 자동 확장을 활용하여 리소스를 최적화할 것.