본문으로 건너뛰기

Kubernetes HorizontalPodAutoscaler 가이드

Control Plane 설정

  • kube-controller-manager
    • --horizontal-pod-autoscaler-sync-period 15s
      • metric을 업데이트하는 주기입니다.
    • --horizontal-pod-autoscaler-cpu-initialization-period 5m
    • --horizontal-pod-autoscaler-initial-readiness-delay 30s
    • --horizontal-pod-autoscaler-downscale-stabilization 5m
    • --horizontal-pod-autoscaler-tolerance 0.1

HorizontalPodAutoscaler

Specification

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
name: <name>
maxReplicas: 10
metrics: []
  • scaleTargetRef
    • 같은 Namespace에 존재하는 리소스여야 합니다.
    • apiVersion: <apiVersion>
    • kind: <kind>
    • name: <name>
  • minReplicas: 1
  • maxReplicas: <int>
  • metrics: []
    • type: Resource|ContainerResource|External|Object|Pods
    • resource
      • name: cpu|memory
      • target
        • type: Utilization|Value|AverageValue
    • containerResource
      • container: <containerName>
      • name: cpu|memory
      • target
        • type: Utilization|Value|AverageValue
    • external
    • object
    • pods
  • behavior
    • kubernetes/enhancements GitHub / Configurable scale up/down velocity for HPA
    • scaleUp|scaleDown
      • Default Behavior
      • stabilizationWindowSeconds: <seconds>
        • 주어진 시간 동안 제안된 desiredReplicas 중 가장 큰(down)/작은(up) 값을 적용합니다.
        • 0 ~ 3600 설정 가능합니다.
      • tolerance: <ratio>
        • 기본값은 0.1 입니다.
      • selectPolicy: Max
        • Max: 정책 중 가장 높은 수치를 적용합니다.
        • Min: 정책 중 가장 낮은 수치를 적용합니다.
        • Disabled: 정책을 적용하지 않습니다.
      • policies: []
        • type: Percent|Pods
          • Percent: 최대 currentReplicas * value / 100만큼 scale up/down 합니다.
          • Pods: 최대 value만큼 scale up/down 합니다.
        • value: <int>
        • periodSeconds: <seconds>
          • 정책이 선택되고 다음 정책이 선택되기까지의 시간입니다.
          • 1 ~ 1800 설정 가능합니다.

Algorithm

desiredReplicas := currentReplicas
ratio := currentMetricValue / desiredMetricValue

if math.Abs(ratio-1) > tolerance {
desiredReplicas = int32(math.Ceil(float64(currentReplicas) * ratio))
}

desiredReplicas와 recommendations에서 upStabilizationWindowSeconds와 downStabilizationWindowSeconds를 사용하여 upRecommendation과 downRecommendation을 구하고, desiredReplicas를 recommendations에 추가합니다.

desiredReplicas = currentReplicas
if desiredReplicas < upRecommendation {
desiredReplicas = upRecommendation
}
if desiredReplicas > downRecommendation {
desiredReplicas = downRecommendation
}

정책을 적용합니다.

if desiredReplicas > currentReplicas {
desiredReplicas = upPolicy(desiredReplicas)
} else if desiredReplicas < currentReplicas {
desiredReplicas = downPolicy(desiredReplicas)
}

Default Behavior

spec:
behavior:
scaleUp:
selectPolicy: Max
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 100
periodSeconds: 60
stabilizationWindowSeconds: 0
scaleDown:
policies:
- type: Percent
value: 100
periodSeconds: 60
stabilizationWindowSeconds: 300