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
참고자료
- eks 공식문서: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/vertical-pod-autoscaler.html
- devocean: https://devocean.sk.com/blog/techBoardDetail.do?ID=164786&boardType=techBlog&searchData=&page=&subIndex=%EC%B5%9C%EC%8B%A0+%EA%B8%B0%EC%88%A0+%EB%B8%94%EB%A1%9C%EA%B7%B8
- Goldilocks: https://devocean.sk.com/search/techBoardDetail.do?ID=163657
- https://www.linkedin.com/pulse/kubernetes-vpa-kubecost/
- https://www.stacksimplify.com/aws-eks/aws-eks-kubernetes-autoscaling/learn-to-master-vertical-pod-autoscaling-on-aws-eks/
- https://haereeroo.tistory.com/25
- https://www.jacobbaek.com/1491
이하공백
'연재 시리즈' 카테고리의 다른 글
EKS 스터디 - 6주차 1편 - 미흡한 kubelet 인증/인가 설정의 위험 (0) | 2023.05.27 |
---|---|
EKS 스터디 - 5주차 2편 - CPA (0) | 2023.05.21 |
EKS 스터디 - 4주차 3편 - AMP에 EKS메트릭 저장 (0) | 2023.05.14 |
EKS 스터디 - 4주차 2편 - pod로깅 (2) | 2023.05.07 |
EKS 스터디 - 4주차 1편 - 컨트롤 플레인 로깅 (0) | 2023.05.07 |