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