-
Horizontal Pod Autoscaler는 metric server를 통해 파드의 리소스를 감시하여 리소스가 부족한 경우 Controller의 replicas를 증가시켜 파드의 수를 늘린다.
-
위의 그림 처럼 Pod가 수평적으로 증가하는 것을 Scale Out, 수평적으로 감소하는 것을 Scale In 이라고 한다.
-
Pod를 증가시키기 때문에 기존의 트래픽이 분산되어 서비스를 더 안정적으로 유지할 수 있게 된다.
-
Replica의 수와 상관 없이 돌아갈 수 있는 Stateless 서비스에 적합하다.
-
트래픽이 급증하여 spike가 생기는 경우에 대응할 수 있다.
-
사용하는 매트릭과, 목표하는 매트릭을 계산하여 desire replica 수를 계산한다.
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
-
Pod가 시작하고 얼마 되지 않았을 때는 적절한 메트릭 값이 나오지 않을 수 있으므로, HPA에는 시작한 지 30초 이상 된 포드부터 매트릭이 적용된다.
--horizontal-pod-autoscaler-initial-readiness-delay
옵션을 사용하여 이 값을 직접 설정할 수 있다. -
예시
apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: k8s-autoscaler spec: maxReplicas: 10 minReplicas: 2 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: k8s-autoscaler metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 behavior: scaleDown: policies: - type: Pods value: 4 periodSeconds: 60 - type: Percent value: 10 periodSeconds: 60
- HorizontalPodAutoscaler API는 Pod 뿐만 아니라 각 컨테이너의 리소스도 스케일링의 조건으로 넣을 수 있도록 하는 설정을 제공한다.
...
type: ContainerResource
containerResource:
name: cpu
container: application
target:
type: Utilization
averageUtilization: 60
...
spec
의behavior
부분에 스케일링을 위한 정책을 설정할 수 있다.- 위에 정의된 policy부터 적용된다.
periodSeconds
는 특정 시간 안에 scale을 조정할 수 있는 최대, 최소값을 정의한다.- 아래 예시에서는 60초동안 최대 4개의 replica가 scale down 될 수 있고, 60초 동안 현재의 최대 10% 만큼 scale down될 수 있다.
...
behavior:
scaleDown:
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0 # 메트릭들이 계속 변동하여 오차가 발생하는 것을 조정하기 위해 사용하는 옵션
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
...
-
Vertical Pod Autoscaler는 파드의 리소스를 감시하여, 파드의 리소스가 부족한 경우 파드를 Restart하며 파드의 리소스 제한을 증가시킨다.
-
이처럼 파드의 리소스가 수직적으로 증가하는 것을 Scale Up, 감소하는 것을 Scale Down이라고 한다.
-
리소스 활용률을 최적화하고 비용을 절감할 수 있다.
-
컨테이너의 리소스 Request를 조정한다.
-
예시
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: k8s-autoscaler-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: k8s-autoscaler updatePolicy: updateMode: "Auto"
- HPA와 VPA는 보통 Kubernetes component에 있는 metric 서버가 제공하는 값을 받아 스케일링 여부를 결정하는데, 원한다면 다른 custom metric을 적용할 수 있다. (참고)
참고