DevOps & SRE/Docker & kubernetes

k8s HPA 동작 방식 및 이슈들 정리

seungh0 2023. 5. 16. 22:13
반응형

HPA (Horizontal Pod AutoScaling) 도입 배경


  • 운영하는 플랫폼이 버스트성으로 들어오는 트래픽들이 많고, 점점 많아질 예정이어서 이러한 버스트성 트래픽을 k8s 환경에서 효율적으로 대응하기 위해서 HPA을 검토하였음.

 

HPA (Horizontal Pod AutoScaling) 이란?


  • Workload Resource를 자동으로 업데이트 하며, 워크로드의 크기를 수요에 맞게 자동으로 스케일링하는 것을 목표로 함.
  • 즉 k8s에서 AutoScaling의 역할을 수행.

 

HPA 동작 방식


  • k8s는 HPA을 간헐적으로 실행되는 컨트롤 루프 형태로 구현했다.
    • 이 말은 지속적으로 모니터링해서 워크로드를 변경하지 않고, 주기(default 15초)별로 체크하는 형태.
    • 각 주기마다, Controller Manager는 각 HPA에 정의에 지정된 메트릭 지표에 대해서 리소스를 조회한다.
    • scaleTargetRef에 정의된 타겟 리소스를 찾은 후, 파드를 선택해서 메트릭 API로부터 메트릭을 수집하는 형태로 동작.

 

오토스케일링 기준 메트릭 종류


리소스 메트릭 지원

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60
  • ex) HPA 컨트롤러는 스케일링 대상에서 파드의 평균 사용률을 60%로 유지한다.

 

컨테이너 리소스 메트릭

type: ContainerResource
containerResource:
  name: cpu
  container: application
  target:
    type: Utilization
    averageUtilization: 60
  • ex) 모든 파드의 application 컨테이너에 있는 CPU의 평균 사용률이 60%가 되도록 대상을 조정

 

커스텀 메트릭

 

HPA 알고리즘

  • HPA 컨트롤러는 desired 메트릭 갑과 current 메트릭 값 사이의 비율로 작동함.

desiredReplicas = currentReplicas * ( currentMetricValue / desiredMetricValue )

  • ex) 현재 replicas: 10, cpu usages: 3.0인 상황에서 metrics 기준을 2.0인 경우 -> 10 * (3000 / 1000) = 15개
  • ex) 현재 replicas: 20, cpu usages: 1.0ms인 상황에서 metrics 기준을 2.0인 경우 -> 20 * (1.0 / 2.0) = 10개

 

Behavior


갑자기 너무 많은 파드가 scale-out 혹은 scale-in 되는 것을 방지하기 위해서 사용

behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15
      selectPolicy: Max
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
        - type: Pods
          value: 4
          periodSeconds: 15
        - type: Percent
          value: 100
          periodSeconds: 15
      selectPolicy: Max
  • scale-out: 4개 혹은 replicas의 100% 중 큰 수 초과로 15초 동안 scale-up이 되는 것을 방지.
  • scale-in: replicas의 100% 초과로 15초동안 scale-down이 되는 것을 방지.
  • stabilizationWindowSeconds
    • 스케일링에 사용되는 메트릭이 계속 변동할 때 레플리카 수의 흔들림을 제한하기 위해 사용됨.
    • behavior.scaleDown.stabilizationWindowSeconds: 300의 의미는 5분 동안 scale-down이 되기 위한 조건을 유지해야 scale-down을 해준다는 의미

 

HPA 도입하면서 발생한 이슈들


scale-out 시점에 예상보다 많은 replicas가 생기는 현상

  • HPA scale-out으로 인해 새로운 파드가 뜨면서, 초기에 CPU 사용률이 높아서, 해당 지표가 HPA에 영향을 줌 -> 예상보다 많은 Replicas로 scale-out 되는 현상이 발생함.

해결 방안

  • coolDownPeriodSeconds: 90
  • Pod 생성 초기에 Ready 상태가 된 후 설정한 시간(초)만큼 HPA 계산에서 제외되도록 하는 설정.
    • 대략 컨테이너의 애플리케이션이 안정화돼서 뜨는 시간 정도로 주면 괜찮아 보임.
  • cf) HPA 컨트롤러는 메트릭 기준이 되는 리소스는 READY 상태인 파드들을 기준으로 계산함.

 

Cold Start 이슈

  • scale-out 되어 신규로 생성된 파드에 대한 처음 요청들이 느리게 처리되는 현상. (HPA만의 문제는 아니지만, HPA 사용 시 특히 이슈가 될 수 있음)

해결 방안

  • 웜업 추가
    • warm-up 과정은 postStart 과정에서 처리하도록 하였음.
    • 혹은 readiness 과정에서 처리하고, readiness.initialDelaySeconds을 웜업을 할 수 있는 시간으로 충분히 늘리고 해당 시점에 웜업을 해도 좋을 거 같음.
    • → 그렇지만 애플리케이션이 뜨는 시간은 점점 늘어날 텐데, 해당 설정 값을 변경해 나가는 것은 귀찮아서, postStart 시점에 웜업을 수행하였음.

Pod Lifecycle

  • cf) k8s에서 postStart의 호출 이후, 성공 시 liveness Probe & readiness Probe가 수행됨.

 

 

반응형