쿠버네티스 리소스 관리 알아보기

작성자 김효상 수정일 2022-11-25 12:34

#kubernetes, #Requests, #Limits, #QoS, #스파클링소다4.0

들어가며

  • 스파클링소다를 이용하여 모델 개발 및 모델 서빙 시 노드(서버) 자원을 효율적인 관리를 위해 쿠버네티싀 환경에서의 CPU, Memory 리소스 관리 및 자원 요청 및 제한에 따른 파드 서비스 품질(QoS)에 대해 알아 보겠습니다.


리소스 단위

CPU 리소스 단위

CPU 리소스에 대한 제한 및 요청은 cpu 단위로 측정되며, 1 CPU 단위는 노드(서버)가 물리 호스트인지 혹은 물리 호스트 내에서 실행되는 가상 머신인지에 따라 1 물리 CPU 코어 또는 1 가상 코어에 해당합니다.


1core == 1000millicpu == 1000milicore == 1000m 와 같이 표현


메모리 리소스 단위

memory 에 대한 제한 및 요청은 바이트 단위로 측정되며 수량 접미사, 일반 정수, 고정 소수 숫자로 표현할 수 있습니다. 


128974848, 129e6, 129M, 128974848000m, 123Mi 와 같이 표현 할 수 있으며 모두 동일한 값을 의미


자세한 사항은 아래 사이트에서 확인 가능합니다.

https://kubernetes.io/ko/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu


리소스(자원) 요청 및 제한

파드가 리소스(자원)가 충분한 노드(서버)에서 실행 중일 때 컨테이너는 지정한 request 자원보다 더 많은 자원를 사용할 수 있도록 허용되지만 자원 limit 보다 더 많은 자원을 사용할 수는 없습니다


Requests

requests는 컨테이너가 생성될때 요청하는 리소스 양으로 스케줄러는 이 정보를 사용하여 파드가 배치될 노드를 결정하게 됩니다.  지정한 requests 양 보다 초과 사용해도 limits양을 넘지 않으면 문제가 되지 않지만, 노드에 이용 가능한 리소스가 부족한 경우에는 Pod 종료 후 다른 노드에 재배치 시도를 하게 됩니다.


Limits

limits는 리소스가 더 필요한 경우 추가로 사용 가능한 리소스 양으로 설정한 값보다 많은 리소스를 사용할 수 없습니다. 

limits량을 초과하게 되면 overcommitted되며, Memory의 경우 메모리 부족(out of memory, OOM)오류와 함께 초과 사용을 시도한 프로세스를 종료됩니다.


예: 파드2는 파드1이 생성 및 실행이 된 후 CPU의 자원이 부족하여 스케줄링이 되지 않고 Pending



서비스 품질(QoS)

파드 생성 될 때 파드에 다음의 QoS 클래스(우선 순위)가 할당 됩니다.

  • Guaranteed 
  • Bustable
  • BestEffort


Guaranteed

다음 조건을 충족할 경우 Guaranteed QoS 클래스가 부여 됩니다.

  • 파드 내 모든 컨테이너는 메모리 상한과 메모리 요청 양을 가지고 있어야 한다.
  • 파드 내 모든 컨테이너의 메모리 상한이 메모리 요청 양과 일치해야 한다.
  • 파드 내 모든 컨테이너는 CPU 상한과 CPU 요청 양을 가지고 있어야 한다.
  • 파드 내 모든 컨테이너의 CPU 상한이 CPU 요청 양과 일치해야 한다.

◪ requests와 limits를 동일하게 설정해서 pod의 최대 자원 사용량이 노드의 용량을 초과하지 않도록 pod를 배치합니다.

안정된 자원관리를 위한 시스템(예: 운영계 모델 서빙)에 권장합니다.


Bustable

다음의 경우 파드에 Burstable QoS 클래스가 부여 됩니다.

  • 파드가 Guaranteed QoS 클래스 기준을 만족하지 않는다.
  • 파드 내에서 최소한 하나의 컨테이너가 메모리 또는 CPU 요청량/상한을 가진다.

◪ 해당 시스템에 적절한 설정을 통해 효율적인 자원 사용이 가능합니다.

최소한의 자원 보장을 받지만 자원이 부족하면 Pod 성능저하 또는 Pod 배치가 안되거나 실행 중에 종료 될 수 있습니다.


BestEffort

파드의 컨테이너에 메모리 또는 CPU의 상한이나 요청 양이 없을 경우 BestEffort QoS 클래스가 부여 됩니다.


◪ Pod의 Requests, Limits량을 지정하지 않고, 가능한 많은 Pod를 노드에 배치합니다. 

자원이 부족하면 Pod 성능저하 또는 Pod 배치가 안되거나 실행 중에 종료 될 수 있습니다.



파드의 QoS 클래스는 아래 명령어로 확인 할 수 있습니다.

 kubectl get pod [pod-name] -o jsonpath={.status.qosClass} -n [namespace-name]

QoS는 어떻게 활용 될까요?

쿠버네티스에서는 자원이 부족할 때 QoS에 따라 어떤 파드의 컨테이너 애플리케이션을 종료할지 결정 됩니다. 가장 우선순위가 낮은 것은 BestEffort이며, 그 다음이 Burstable, 마지막이 Guranteed가 종료됩니다. Guranteed는 시스템이 메모리를 필요로 하는 경우에만 종료됩니다



마무리

  • 애플리케이션(예 모델 서비스) 운영 시 환경에 따라 자원의 소비량은 달라지기 때문에 현실적으로 명확하게 Guaranteed를 설정하기는 어렵습니다.
  • 그렇기 때문에  운영 중인 환경에서 Pod 구동시간, 평균 사용량, Peek 사용량 등을 모니터링하여 requests, limits 값에 대한 최적화 값을 찾는 노력을 통해 리소스 관리를 진행해야 합니다.

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300