Kubernetes 이야기

Vertical Pod Autoscaler (VPA) 본문

Kubernetes/일반

Vertical Pod Autoscaler (VPA)

kmaster 2022. 4. 9. 17:37
반응형

Kubernetes에서는 3가지의 오토스케일을 사용하여 확장 처리를 할 수 있다.

 

  1. HPA ( Horizontal Pod Autoscaler ) : Pod를 수평적으로 확장한다. 즉, pod의 cpu나 mem 이 임계치 이상 사용하면 pod 개수를 늘리는 것이 HPA이다.
  2. CA ( Cluster Autoscaler ) : 클러스터의 노드 수를 조정한다. Cluster Autoscaler는 노드에 Pod를 실행할 리소스가 부족한 경우 노드를 자동으로 추가하거나 제거한다.
  3. VPA ( Verical Pod Autoscaler ) : Pod에 있는 컨테이너 리소스 요청 및 제한을 조정한다. 

이중 Kubernetes는 VPA (Vertical Pod Autoscaler)에 대해 알아보자.

https://www.kubecost.com/kubernetes-autoscaling/kubernetes-vpa/

 

Pod를 생성할 때 Pod가 사용할 CPU, Mem을 제한하는 것은 중요하다. 참고로 다음의 내용도 검토해야 한다.

https://kubernetes.io/ko/docs/tasks/configure-pod-container/quality-service-pod/

 

파드에 대한 서비스 품질(QoS) 구성

이 페이지는 특정 서비스 품질(QoS) 클래스를 할당하기 위해 어떻게 파드를 구성해야 하는지 보여준다. 쿠버네티스는 QoS 클래스를 사용하여 파드 스케줄링과 축출을 결정한다. 시작하기 전에 쿠

kubernetes.io

 

보통 다름과 같이 설정한다.

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  • 리소스가 너무 적게 설정되어 있으면 성능이 느려지거나 OOM오류 (메모리 부족)으로 Pod가 Down될 수 있다.
  • 리소스가 너무 크면 다른 Pod를 실행할 때 배포에 문제가 발생할 수 있습니다.

하지만, pod에서 사용해야 하는 cpu와 mem을 처음부터 올바르게 설정하는 것은 매우 어려운일이다.

VPA는 이를 위해 사용할 수 있는 resource이다.  VPA를 사용하면 아래의 장점이 있다.

 

  • CPU 및 메모리 할당에 사용해야 하는 올바른 값에 대해 알 수 있다.
  • 권장 값으로 배포를 업데이트 할 수 있다.

VPA의 구성요소

  • Recommender : 현재 및 과거 리소스 사용량을 모니터링하고 이를 기반으로 컨테이너의 CPU 및 메모리 요청 권장값을 제공한다.
  • Updater : 관리되는 포드 중 올바른 리소스가 설정되어 있는지 확인하고 그렇지 않은 경우 업데이트된 요청으로 컨트롤러에서 다시 생성할 수 있도록 종료한다.
  • Admission Plugin : 새 포드에 올바른 리소스 요청을 설정한다. (업데이터 활동으로 인해 컨트롤러에서 방금 생성하거나 다시 생성).

https://www.kubecost.com/kubernetes-autoscaling/kubernetes-vpa/

설치

전제조건

설치

# git clone https://github.com/kubernetes/autoscaler.git
# cd autoscaler/
# cd vertical-pod-autoscaler/
# ./hack/vpa-up.sh
...
unknown option -addext
req [options] <infile >outfile
...

위와 같이 오류가 발생하는 경우 버전을 0.8 branch를 이용하거나 openssl을 1.1.1 이상으로 update해야 한다.

 

openssl 을 update해보자

# wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
# tar xvfz openssl-1.1.1n.tar.gz
# cd openssl-1.1.1n
# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared
# make
# make install


# ln -s /usr/local/ssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
# ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# mv /usr/bin/openssl /usr/bin/openssl1.0.2k

# openssl version
OpenSSL 1.1.1n  15 Mar 2022

이제 다시 vpa 를 설치해 보자.

# ./hack/vpa-up.sh

설치가 완료되면 아래와 같은 Pod가 실행된다.

# kubectl --namespace=kube-system get pods|grep vpa
vpa-admission-controller-58cf99779c-jx9dz   1/1     Running   0          5h41m
vpa-recommender-678f4f6d4b-w9xvd            1/1     Running   0          5h41m
vpa-updater-64ddd67787-bkxbb                1/1     Running   0          5h41m

VPA 오류 여부는 아래와 같은 명령어로 확인가능하다.

# kubectl --namespace=kube-system logs [pod name]| grep -e '^E[0-9]\{4\}'

VPA 구성 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-app
  updatePolicy:
    updateMode: "Auto"

VPA의 작동모드는 아래와 같이 3가지가 있다.

  • "Auto": VPA는 포드 생성 시 리소스 요청을 할당하고 기본 업데이트 메커니즘을 사용하여 기존 포드에서 업데이트한다.  참고: VPA의 이 기능은 실험적이며 애플리케이션에 다운타임이 발생할 수 있다.
  • "Recreate": VPA는 포드 생성 시 리소스 요청을 할당할 뿐만 아니라 요청된 리소스가 새 권장 사항과 크게 다를 때 이를 제거하여 기존 포드에서 업데이트한다. (정의된 경우 포드 중단 예산 준수). 이 모드는 리소스 요청이 변경될 때마다 포드를 다시 시작해야 하는 경우에만 드물게 사용해야 한다.  참고: VPA의 이 기능은 실험적이며 애플리케이션에 다운타임이 발생할 수 있다.
  • "Initial": VPA는 포드 생성 시에만 리소스 요청을 할당하고 나중에 변경하지 않는다.
  • "Off": VPA는 포드의 리소스 요구 사항을 자동으로 변경하지 않는다. 권장 사항이 계산되고 VPA 개체에서 검사할 수 있다.

예제

apiVersion: "autoscaling.k8s.io/v1"
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"]
  updatePolicy:
    updateMode: "Off"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hamster
spec:
  selector:
    matchLabels:
      app: hamster
  replicas: 2
  template:
    metadata:
      labels:
        app: hamster
    spec:
      securityContext:
        runAsNonRoot: true
        runAsUser: 65534 # nobody
      containers:
        - name: hamster
          image: k8s.gcr.io/ubuntu-slim:0.1
          resources:
            requests:
              cpu: 100m
              memory: 50Mi
          command: ["/bin/sh"]
          args:
            - "-c"
            - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"

생성 후 VPA 상세정보를 조회해 보자.

# kubectl create -f test.yaml
verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa created
deployment.apps/hamster created

# kubectl get vpa
NAME          MODE   CPU    MEM       PROVIDED   AGE
hamster-vpa   Off    587m   262144k   True       93s

# kubectl describe vpa hamster-vpa
Name:         hamster-vpa
Namespace:    default
...
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     100m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi
Events:          <none>

위에서 target 값이 추천되는 resource 양이다. 

 

제한사항

  • VPA가 포드 리소스를 업데이트할 때마다 포드가 다시 생성되어 실행 중인 모든 컨테이너가 다시 시작된다.. 포드는 다른 노드에서 다시 생성될 수 있다.
  • 현재 CPU 또는 메모리 의 Horizontal Pod Autoscaler (HPA) 와 함께 Vertical Pod Autoscaler 를 사용 하면 안된다. 그러나 사용자 지정 및 외부 측정항목에서는 HPA 와 함께 VPA를 사용할 수 있다.
  • VPA 성능은 대규모 클러스터에서 테스트되지 않았다.
  • VPA 권장 사항은 사용 가능한 리소스(예: 노드 크기, 사용 가능한 크기, 사용 가능한 할당량)를 초과하여 포드가 보류 상태가 될 수 있다. 이 문제는 Cluster Autoscaler 와 함께 VPA를 사용하여 부분적으로 해결할 수 있다.

 

 

참고

https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler

 

GitHub - kubernetes/autoscaler: Autoscaling components for Kubernetes

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

github.com

https://www.kubecost.com/kubernetes-autoscaling/kubernetes-vpa/

 

The Guide To Kubernetes VPA by Example

Learn Kubernetes VPA’s functionality and limitations with demo examples and understand how to use it with other Kubernetes autoscaling methods.

www.kubecost.com

 

 

반응형

'Kubernetes > 일반' 카테고리의 다른 글

Kubernetes Cluster 설계  (0) 2022.04.10
Bare metal VS VM Kubernetes  (0) 2022.04.09
Service Account 권한 설정 및 kube config  (0) 2022.04.04
PodNodeSelector  (0) 2022.04.02
Pod 스케줄링  (0) 2022.04.02
Comments