본문 바로가기
k8s

k8s autoscaling 3. vpa (Vertical Pod Autoscaler)

by 혜리루 2021. 2. 21.

1. 서론

vpa는 마지막 세번째 autoscaler입니다. vpa는 Vertical Pod Autoscaler의 약자인데요, 이름처럼 pod를 수직적으로 scaling합니다.

hpa가 수평적으로 pod의 개수를 늘렸다면 vpa는 수직적으로 pod의 크기를 조절하는 셈입니다.

vpa는 pod의 resource 사용량에 맞게 resource request를 조절해서 pod가 node에 스케쥴링될때 적절한 크기의 resouce를 할당받을 수 있도록 합니다.

 

vpa는 hpa와 마찬가지로 metric server를 통해 pod들의 resource 사용량을 관찰합니다. 이 resource사용량이 일정기준 이상으로 늘어나면 pod를 scale out하고, 그 반대일때는 scale in합니다.

2. vpa 설치하기

vpa역시 metric server를 통해 평균적인 사용량을 보고 scale 여부를 판단하기 때문에 metric server가 필요합니다.

metric server 설치방법은 hpa 포스트에 올려놓았습니다.

 

vpa는 현재 베타 기능이며 k8s 클러스터에서 기본적으로 제공하지는 않기때문에 vpa git repository에서 소스코드를 직접 다운로드해야합니다.

git clone https://github.com/kubernetes/autoscaler.git

 

소스를 다운로드 했다면 repository내에 vertical-pod-autoscaler 디렉토리에서 아래 script을 실행해줍니다.

~/autoscaler/vertical-pod-autoscaler
❯ ./hack/vpa-up.sh

놀랍게도 설치가 이게 끝입니다.

 

순조롭게 설치가 되던 중 저는 아래와 같은 오류가 떴는데요

ERROR: Failed to create CA certificate for self-signing. If the error is "unknown option -addext", update your openssl version or deploy VPA from the vpa-release-0.8 branch.

메시지대로 vpa-release-0.8 브랜치에서 작업을 했더니 문제가 해결되었습니다.

 

설치를 마쳤더니 이렇게 세가지 pod가 생성되었습니다.

 

vpa의 삭제 역시 아래처럼 간단하게 스크립트로 실행할 수 있습니다.

 

~/autoscaler/vertical-pod-autoscaler
❯ ./hack/vpa-down.sh

 

vpa 시스템을 설치한 후에는 실제 pod 참조하는 vpa를 직접 생성해야하는데요,

vpa 레포지토리 안에 예제 yaml파일이 존재합니다. 이 파일을 이용해서 vpa를 생성해보도록 하겠습니다.

 

kubectl create -f examples/hamster.yaml

 

yaml 파일을 살펴보면 아래와 같습니다.

먼저 target deployment를 명시해주고,

resourcePolicy 옵션을 통해서 vpa가 조정할 resource의 최소, 최대 크기를 지정할 수 있습니다.

apiVersion: "autoscaling.k8s.io/v1beta2"
kind: VerticalPodAutoscaler
metadata:
  name: hamster-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: hamster
  resourcePolicy:
    containerPolicies:
      - containerName: '*'
        minAllowed:
          cpu: 100m
          memory: 50Mi
        maxAllowed:
          cpu: 1
          memory: 500Mi
        controlledResources: ["cpu", "memory"]

커맨드를 통해 vpa를 생성하면 아래처럼 vpa가 뜬 것을 볼 수 있습니다.

 

 아래처럼 describe 명령어를 실행하면 vpa에 대한 자세한 정보가 나옵니다.

❯ kubectl describe vpa hamster-vpa

제일 아래쪽에 보면 vpa가 해당 pod에 추천하는 리소스의 크기를 확인할 수가 있습니다.

 

vpa는 이 값을 보고 pod의 리소스 크기를 수정합니다.

실제로 pod를 scaling하지는 않고 vpa가 추천해주는 리소스 크기만 확인 할 수도 있는데요,

이러한 경우에는 vpa 설정파일에 

  updatePolicy:
    updateMode: "Manual"

위와 같은 옵션을 주면 됩니다. ( 디폴트 설정은 "Auto"입니다. )

 

일반적으로 pod, (혹은 instance)에 어느정도의 리소스를 주어야할지 결정하는 일은 쉬운 일이 아니죠.

vpa의 recommender가 그 결정에 어느정도의 힌트가 될 수 있습니다. 이것에 대한 내용은 recommender에 대한 자세한 설명과 함께 다음 포스팅에서 작성해보도록 하겠습니다.

3. 구조

 

vpa을 설치하면 VerticalPodAutoscaler라는 custom resource가 설치됩니다.

그리고 k8s api안에 admission webhook을 등록합니다.

그리고 나서 특정한 pod가 vpa를 사용하도록 설정하면 앞서말한 hook이 VPA recommender가 추천하는 값에 따라서 pod template의 resource request를 수정합니다.

 

vpa에서 사용되는 3가지 개념을 한개씩 천천히 뜯어보도록 하겠습니다.

 

1) vpa admissin hook

먼저 admission hook이라는 친구가 뭔지 잘 몰라서 찾아보았습니다.

 

admission webhook이란?

admission webhook이란 admission controller를 구성하기 위한 기능 중 하나로 k8s api에 요청이 들어왔을때 그것과 관련된 유효성체크, 수정 등의 일련의 작업을 하는 http callback입니다.  admission webhook은  Mutating admission webhook, validating admission webhooks 이렇게 두가지로 나눠지는데요, Mutating admission webhook은 먼저 실행되어서 api서버로 보내지는 오브젝트를 알맞게 수정합니다. 수정이 완료된 후에는 validating admission webhooks이실행됩니다. 이때 요청의 유효성을 검사해서 요청을 실행할지, 거부할지 결정합니다.

 

vpa를 설치하게 되면 k8s cluster에 생성 요청되는 모든 pod는 vpa admission webhook을 거칩니다. 이 webhook은 VerticalPodAutoscaler가 해당pod혹은 pod의 부모(replicaset, deployment 등)을 참조하고 있는지 검사하고 만일 그렇다면 CPU, memory 크기를 수정합니다.

 

2) VPA recommender

vpa recommender는 metric-server에서 받아온 리소스 사용량 히스토리와 현재 리소스 사용량을 비교해서 각각의 pod에 알맞는 resource 크기를 추천해줍니다.

 

3) VPA updater

vpa update는 1분에 한번씩 정기적으로 돌면서 실행되고 있는 pod의 resource가 recommender

추천한 리소스 범위에 있는지 체크합니다. 만일 그렇지않다면 pod를 node에서 축출시켜 pod가 재시작되도록 만듭니다. 이때 1)에서 말한 VPA admission webhook이 pod가 시작되기 전 cpu와 memory를 새롭게 설정합니다.

위에서 말한 내용을 도식으로 그려보면 아래와 같습니다.

 

 

4. 알아두어야 할 것

 

1) 일반적으로 stateful service(redis같은 서비스처럼 상태를 계속 유지해야하는)를 위해 사용함.

2) vpa와 hpa는 양립 불가능하다. 둘이 보는 메트릭의 종류를 다르게 해서 scope를 분리하는 것이 좋다.
3) vpa가 scaling 될때는 pod가 재시작된다는 점을 주의할 것.

4) vpa는 resource limit이 아니라 resource request를 수정하지만, 초기에 설정한 request와 limit의 비율 또한 유지한다. 따라서 limit 역시 변경된다.

5) vpa는 정식 기능이 아니라 아직 베타 기능이며 쿠버네티스 1.11 버전 이상에서 작동한다.

 

 

 

 

출처:

medium.com/infrastructure-adventures/vertical-pod-autoscaler-deep-dive-limitations-and-real-world-examples-9195f8422724

 

Vertical Pod Autoscaler deep dive, limitations and real-world examples

Unfortunately, there’s a lack of good, useful examples on the Internet regarding how the Kubernetes Vertical Pod Autoscaler actually works.

medium.com

github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#contents

 

kubernetes/autoscaler

Autoscaling components for Kubernetes. Contribute to kubernetes/autoscaler development by creating an account on GitHub.

github.com

bcho.tistory.com/1349

 

쿠버네티스 #26 - 오토스케일러

#26 쿠버네티스 오토 스케일러 조대협 (http://bcho.tistory.com) 쿠버네티스에서는 리소스 부족을 처리하기 위해서, 오토 스케일러를 사용할 수 있다.. 쿠버네티스는 용도에 따라 몇가지 다른 오토스케

bcho.tistory.com

 

'k8s' 카테고리의 다른 글

k8s autoscaling 2. CA (Cluster Autoscaler)  (1) 2021.02.07
k8s autoscaling 1. hpa (Horizontal Autoscaler)  (0) 2021.02.05

댓글