MSA/쿠버네티스

[Kubernetes] HPA 설정 커스터마이징(hpa behavior)

miracle21 2025. 8. 7. 17:24
반응형

HPA(Horizontal Pod Autoscale)

CPU나 메모리 사용률을 기준으로 자동으로 파드 수를 조절할 수 있게 해주는 기능.

 

 

autoscaling/v1 과 autoscaling/v2 가 있는데,

 

autoscaling/v1 는 기본적인 CPU와 메모리 사용률 기준으로만 세팅이 가능하고 별다른 커스텀이 불가능하다.

 

 

다양한 메트릭 종류 및 스케일 인/아웃의 속도, 빈도, 조건에 대한 세밀한 조정이 필요하다면 v2를 사용해야한다.

 

 

 

항목 autoscaling/v1 autoscaling/v2
지원 메트릭 종류 리소스 (CPU, 메모리) 리소스 (CPU, 메모리)
external 메트릭 (ALB 요청 수 등 클러스터 외부 메트릭)
object 메트릭 (클러스터 내부 메트릭)
여러 메트릭 동시 지원 X O

 

v2는 다양한 메트릭을 지원하지만, 기본으로 제공하는 CPU와 Memory 외에는

promethus나 datadog같은 메트릭 수집 도구가 있어야 사용 가능하다.

 

 

예를 들어, Datadog으로 AWS target group에 대한 request 수 대비 pod 스케일아웃/인을 하려면

timeseries 개수 대비 비용이 발생하므로 비용적인 측면도 고려해야한다.
(2개의 target group에 대한 request 수를 수집하려면 timeseries 가 2개로 계산됨)

 

 

 

기본 Scale In, Scale Out 동작 원리

아래와 같이 커스텀이 들어가지 않은 일반적인 HPA의 경우

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-test
  namespace: ns-test
spec:
  maxReplicas: 80
  minReplicas: 40
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  targetCPUUtilizationPercentage: 70
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-test
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

 

 

 

스케일인/아웃은 기본 동작을 따른다.

 


  scaleUp scaleDown
적용 대기 시간 없음 300초(5분)
감소/증가량 제한 없음 없음
평가 주기
약 15초 약 15초

 

 

1. Scale out

desiredReplicas(목표 파드 수) = 현재 파드 수 × 현재 리소스 사용률 ÷ 목표 사용률


예를 들어 현재 CPU 사용률이 150%고, CPU 사용률이 50%가 넘는 경우 스케일 아웃되도록 설정했다. 

현재 파드수가 5라면,

5 × 150 ÷ 50 = 15


15대로 증가하게 된다.

 

즉, 스케일아웃은 기본적으로 5분 동안의 desiredReplicas 중에서, 가장 큰 값으로 파드 수를 감소시킨다.
(예: 5분간 desiredReplicas 가 5~8개를 왔다갔다 한다면 그 중에서 가장 큰 값인 8대로 감소)



2. Scale in

desiredReplicas(목표 파드 수) = 현재 파드 수 × 현재 평균 리소스 사용률 ÷ 목표 사용률


예를 들어 현재 평균 CPU 사용률이 35%고, CPU 사용률 기준이 70%인 경우, 현재 파드수가 10이라면,

10 × 35 / 70 = 5


파드 5대로 줄어든다.

 
기본적으로 5분간 리소스가 지속적으로 낮아야 스케일인이 된다.

 

즉, 스케일인은 기본적으로 15초마다 메트릭을 확인해서 desiredReplicas 에 맞는 파드 수로 증가시킨다.
(예: 체크할 때 당시의 desiredReplicas 에 맞게 증가)

 

 

 

세부적인 설정 커스터마이징

v2 기준 behavior 필드로 스케일 업/다운의 속도를 제어할 수 있다



예를들어,

 

1. test-deployment 의 cpu 평균 사용률 70% 초과 시 스케일 아웃

2. test-deployment 의 memory 평균 사용률 70% 초과 시 스케일 아웃

 

하는 HPA가 있다.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 10
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70



여기서 스케일인/아웃 속도, 빈도, 조건에 대한 설정 추가를 할수있다(behavior 필드 추가).

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 10
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 300       # 5분간 리소스 초과를 유지해야 스케일업
      policies:
        - type: Percent
          value: 50                         # 한 번에 현재 파드 수의 50% 증가 가능
          periodSeconds: 60                 # 60초마다 한 번 적용
        - type: Pods
          value: 4                          # 한 번에 최대 4개 증가
          periodSeconds: 60                 # 60초마다 한 번 적용
      selectPolicy: Max                     # Percent와 Pods 중 더 큰 쪽 적용
    scaleDown:
      stabilizationWindowSeconds: 600       # 10분 동안 기준 이하 유지돼야 스케일인
      policies:
        - type: Percent
          value: 25                         # 한 번에 25% 이하로만 감소
          periodSeconds: 60                 # 60초에 한 번 평가



 

반응형