훈훈훈

Kubernetes :: HPA(Horizontal Pod Autoscaler) 정리 본문

인프라/Kubernetes

Kubernetes :: HPA(Horizontal Pod Autoscaler) 정리

훈훈훈 2020. 8. 23. 00:47

해당 내용은 공식문서, 쿠버네티스 인 액션 책을 참고 하였습니다.

 

 

HPA(Horizontal Pod Autoscaler)

-  파드를 수평적으로 오토스케일링함, Scale Out(파드 수 증가) 

-  컨트롤러가 주기적으로 Metric을 수집 후, 조건에 부합하면 HPA 리소스에 설정되어 있는 레플리카 수 계산

 

HPA 동작과정

 

Metric 수집 과정

-   kubelet 자체에 내장된 cAdvisor 에이전트에서 실행되는 개별 컨테이너 및 노드 전체 리소스 사용 데이터 수집

-  cAdvisor 에이전트로 부터 수집된 데이터를 바탕으로 전체 클러스터에 대한 리소스 연산은 Metirc Server 혹은 힙스터에서 진행

-  HPA는 Metric Server 혹은 힙스터의 API 호출을 통해 메트릭 수집

 *  최근에는 힙스터 보다는 Metirc Server 사용 선호  

 

 

예제 코드

-  Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-server-deployment
  labels:
    app: spring-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-server
  template:
    metadata:
      labels:
        app: spring-server
    spec:
      restartPolicy: Always
      containers:
        - name: spring
          image: test/test-exam:0.1
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          resource:
            - request:
                cpu: 100m

위 코드는 Spring 서버에 대한 디플로이먼트 템플릿이다.

초기 레플리카 수를 3으로 지정하였으며, 파드당 100밀리코어를 사용할 수 있게 하였다. (limit x)

 

 

-  Horizontal Pod Autoscaler

apiVersion: apps/v1
kind: HorizontalPodAutoscaler
metadata:
  name: spring-server-hpa
  labels:
    app: spring-server
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: spring-server-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 30
status:
  currentMetrics: []
  currentReplicas: 3
  desiredReplicas: 0

위 코드를 보면 CPU 사용률을 30%로 설정하였으며, 최대(최소) 레플리카 수를 각각 5개, 1개로 설정하였다.

HPA 오브젝트는 클러스터 내 모든 파드의 CPU 사용률 메트릭을 수집 및 평균을 계산 후 30%를 초과하면 레플리카를 증가 시킬 것 이다.

 

 

위에서 설명한 것 이외에도 메모리 및 사용자 정의 메트릭(Custom Metric)을 수집하여 오토스케일링을 할 수 있다.

메모리의 경우 기본적으로 Resource Metric API로 제공되며, 위에서 작성한 코드에서 CPU를 Memory로 교체하면 바로 사용할 수 있다.

 

사용자 정의 메트릭의 경우 별도 메트릭을 정의해야하며, 많이 쓰이는 방법으로는 Prometheus adapter를 사용하여 API를 만드는 방법이 있다. 사용자 정의 메트릭의 경우 추후 다시 정리해보려고 한다.

 

사용자 정의 메트릭에 대한 자세한 설명은 아래 블로그 참고 바란다.

https://learnk8s.io/autoscaling-apps-kubernetes

 

How to autoscale apps on Kubernetes with custom metrics

Deploying an app to production with a static configuration is not optimal. Traffic patterns can change quickly and the app should be able to adapt to them. Kubernetes provides excellent support for autoscaling applications in the form of the Horizontal Pod

learnk8s.io

https://levelup.gitconnected.com/building-kubernetes-apps-with-custom-scaling-a-gentle-introduction-a332d7ebc795

 

Building Kubernetes Apps with Custom Scaling: A Gentle Introduction

A simple tutorial about using Prometheus and Kubernetes to scale an application based directly on user interaction

levelup.gitconnected.com

https://medium.com/@tkdgy0801/eks-autoscaling-%ED%95%98%EA%B8%B0-part-1-horizontal-pod-autoscaler-with-custom-metrics-2274566463f9 

 

EKS AutoScaling 하기 Part 1 — Horizontal Pod Autoscaler With Custom Metrics

Horizontally autoscale Kubernetes deployments on custom metrics

medium.com

 

 

Comments