[Retry, k8s] 33. 리소스 관리, 오토 스케일링 - HorizontalPodAutoscaler

Date:     Updated:

카테고리:

태그:


06. HorizontalPodAutoscaler


‘HorizontalPodAutoscaler(HPA)’는 디플로이먼트/레플리카셋/레플리케이션 컨트롤러의 레플리카 수를 CPU 부하 등에 따라 자동으로 스케일하는 리소스이다. (또 파드에 Resource Requests가 설정되어 있지 않은 경우에는 동작하지 않는다.)

‘HPA’는 30초에 한 번 꼴로 오토 스케일링 여부를 확인하며 “필요한 레플리카 수 = ceil(sum(파드의 현재 CPU 사용률)/targetAverageUtilization)” 수식에 필요한 레플리카 수를 계산한다.

스케일링 구분 조건식
스케일 아웃 조건식 avg(파드의 현재 CPU 사용률) / targetAverageUtilization > 1.1
스케일 인 조건식 avg(파드의 현재 CPU 사용률) / targetAverageUtilization < 0.9

CPU 사용률은 metrics-server(Heapster)에서 가져온 각 파드의 1분간 평균값을 사용하며, 최대 3분에 1회 스케일 아웃을 실행하고, 최대 5분에 1회 스케일 인을 실행함으로써 기동 시에만 CPU의 부하가 상승하는 메트릭 노이지 영향을 최소화할 수 있다.

# 예시 1) sample-hpa.yaml

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata: 
    name: sample-hpa
spec:
    scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-hpa-deployment
    # HPA에서는 스케일 조건과 최저 레플리카수/최고 레플리카 수를 지정한다.
    minReplicas: 1
    maxReplicas: 10
    metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50
# CLI로 HPA 생성
$ kubectl autoscale deployment sample-deployment --cpu-percent=50 --min=1 --max=10

HPA에서 사용 가능한 메트릭의 종류

종류 내용
Resource CPU/메모리 리소스
Object 쿠버네티스 Object 메트릭스 (예: 인그레스 hits/s)
Pods 파드 메트릭스 (예: 파드 커넥션 수)
External 쿠버네티스 외부의 메트릭스 (예: LB의 QPS, Cloud Pub/Sub에 쌓여 있는 메시지 수)


(1) HPA 스케일링 동작 설정

selectPolicy 선택 항목

종류 내용
Min 지정한 기간 동안 최소 변화량으로 제한을 설정
Max 지정한 기간 동안 최대 변화량으로 제한을 설정
Disabled 스케일링을 비활성화
# 예시 1) sample-hpa-behavisor.yaml

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata: 
    name: sample-hpa-behavisor
spec:
    scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-hpa-deployment
    minReplicas: 1
    maxReplicas: 10
    metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50
    behavisor:
        # 스케일 인
        scaleDown:
            stabilizationWindowSeconds: 300
            policies:
            - type: Percent
              value: 100
              periodSeconds: 15
        # 스케일 아웃
        scaleup:
            stabilizationWindowSeconds: 0
            policies:
            # '15초 동안 100% 증가(레플리카 수가 배가 된다.)', '15초 동안 네 개 파드 추가' 라는 두 개의 정책이 정의
            - type: Percent
              value: 100
              periodSeconds: 15
            - type: Pods
              value: 4
              periodSeconds: 15
            # 그중 최댓값이 선택
            # 즉, 레플리카 수가 두 개 파드 상태에서 12개 파드로 증가해야 한는 경우, 첫 스케일 아웃 시점에서 '100% 추가 (두 개 파드)' 또는 '네 개 파드 추가' 중 최댓값인 네 개 파드가 추가되고 총 여섯 개의 파드가 된다.
            # 그리고 나서 15초 후 '100% 추가(여섯 개 파드)' 또는 네 개 파드 추가 중 최댓값인 여섯 개 파드가 추가되고 총 12개의 파드가 된다. 
            # 반대로 Min은 여러 개의 정책 중 최솟값을 선택하게 된다.
            selectPolicy: Max

stabilizationWindowSeconds는 레플리카 수가 빈번하게 증감하는 것을 방지하고 트래픽 스파이크로 레플리카 수가 급감하거나 급증하는 것을 피라기 위한 설정이다.

stabilizationWindowSeconds에서 지정된 기간 동안 추천 레플리카 수를 바탕으로 레플리카 수를 결정하며 스케일 인의 경우에는 지정한 기간 동안 최댓값이 선택되고, 스케일 아웃인 경우에는 지정한 기간 동안 최솟값을 선택하게 된다.

stabilizationWindowSeconds가 0인 경우 바로 추천 레플리카 수로 변경한다 그래서 스케일 아웃인 겨웅에는 0으로 지정해 두는 것이 좋다.

KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기