연재 시리즈

EKS 스터디 - 5주차 1편 - VPA

악분 2023. 5. 21. 00:11
반응형

VPA란?

VPA(Vertical Pod Autoscaler)는 pod resources.request을 최대한 최적값으로 수정합니다. 수정된 request값이 기존 값보다 위 또는 아래 범위에 속하므로 Vertical라고 표현합니다.

 

pod마다 resource.request를 최적값으로 설정하면, 쿠버네티스 노드 자원 효율성이 좋아집니다. pod가 스케쥴링될 때 pod resources.request만큼 노드에 자원이 있어야 합니다. VPA를 설정하면 쿠버네티스 노드 cpu와 메모리를 최대한 확보할 수 있으므로 자원 효율성이 증가합니다. 

 

주의사항

  • VPA는 HPA와 같이 사용할 수 없습니다.
  • VPA는 pod자원을 최적값으로 수정하기 위해 pod를 재실행(기존 pod를 종료하고 새로운 pod실행)합니다.

 

아키텍처

저는 기능관점에서 아키텍처를 3가지로 해석했습니다.

  • VPA가 실행되고 있는 pod의 resources.request를 최적값으로 수정하는 로직
  • 최적값을 계산하는 로직
  • VPA CRD

 

pod에 최적값을 수정하는 로직

VPA는 Admission controller을 사용하여 pod resources.request를 수정합니다. 기존 pod를 종료시키면 쿠버네티스 controller(예: deployment controller)가 pod를 다시 생성합니다. 이 때, VPA Admission controller가 mutant webhook으로 pod request를 최적값으로 수정합니다.

 

최적 값을 계산하는 로직

계산 로직은 몰라서 devocean로그 설명을 이해한 것을 간단하게 설명하겠습니다.

 

저는 최적값 계산로직을 pod 최근 자원 사용량을 기준으로 마진(여유값) 추가한 것으로 이해했습니다. pod 최근 자원 사용량은 Metrics server 활용합니다.

 

VPA CRD

VPA CRD VPA 적용할 pod 계산로직 설정합니다.

 

아래 예제는 hamster deployment 실행되는 pod VPA 설정합니다. 그리고 pod 자원 최적값을 계산할 최소/최대값을 설정합니다.

 

모듈

VPA Auto scalar 3가지 모듈로 구성됩니다.

 

모듈은 지금까지 설명한 pod최적값 계산, pod resources.request값을 수정합니다.

 

설치방법

VPA는 Metrics server가 필요합니다. 저는 helm chart로 Metrics server를 설치했습니다.

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install --version 3.10.0 metrics-server metrics-server/metrics-server

 

VPA controller EKS에서 제공한 스크립트를 실행하여 설치합니다.

git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
./hack/vpa-up.sh

 

설치가 되었다면 VPA 3 모듈이 실행되어야 합니다.

 

예제

예제는 EKS 공식예제 사용합니다. pod 실행되면 2~3 뒤에 pod resource.reqeust VPA 의해 수정되는 예제입니다.

 

예제는 kubectl apply 배포할 있습니다.

git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
kubectl apply -f examples/hamster.yaml

 

예제를 배포하면 VPA리소스가 생성됩니다. VPA리소스를 조회하면 VPA 계산한 pod최적값이 보입니다. 아래 예제는 cpu 537MB, 메모리 262MB 최적값이 계산되었습니다.

 

3 뒤에 VPA 최적값을 pod 적용하기 위해 pod 종료시킵니다. EKS예제로 배포된 pod 2개이므로 2 pod 종료됩니다. VPA Admission controller pod 생성될 resource.request 최적값으로 수정합니다.

kubectl get events --sort-by=".metadata.creationTimestamp"

 

생성된 pod resources.request VPA 계산한 최적값입니다.

 

VPA 적용된 pod 디버깅시 주의해야 합니다. VPA resource 수정했기 때문에, pod resource정의와 pod 정의한 상위 resource정의가 일치하지 않습니다.

 

제거방법

VPA제거는 VPA생성할 때처럼, 스크립트를 실행합니다.

./hack/vpa-down.sh

 

참고자료

이하공백

반응형