쿠버네티스 파드 확장에 대한 이해 (HPA, VPA, KEDA)

💡
이 문서는 결함 주입(Fault Injection)을 통해 가설 및 검증 과정을 거쳤습니다.
A.
A.1. 기본 개념
파드의 스케일링을 위해서 사용되는 3가지 개념을 소개합니다.
용어 | 설명 |
---|---|
HPA | Horizontal Pod Autoscaler |
VPA | Vertical Pod Autoscaler |
KEDA | Kubernetes based Event Driven Autoscaler |
B. 실습 사례
B.0. 테스트 도구 설치
hey 설치하기
sudo apt update -y sudo apt install -y hey
B.1. HPA 기본
쿠버네티스의 HPA는 워크로드의 크기를 수요에 맞게 자동으로 스케일링 합니다.
kube-controller-manager는 일정 주기*마다 각 HPA에 맞는 스케일링을 합니다.
💡
[일정 주기*] --horizontal-pod-autoscaler-sync-period=15s (default)
HPA는 스케일링을 하기 위해서 매트릭에 의존하는데,
이 매트릭은 일반적으로 metrics-server에 의존하게 됩니다.
💡
metrics.k8s.io : 네이티브 쿠버네티스 매트릭 API custom.metrics.k8s.io : 사용자 정의 애플리케이션 매트릭 API external.metrics.k8s.io : 쿠버네티스 외부 시스템 매트릭 API
기본적으로 현재 매트릭(current)와 원하는 매트릭(desire)의 비율로 작동합니다.
kube-controller-manager는 조정 오차* + 비율이 1.0이면 이를 건너뜁니다.
💡
[조정 오차*] --horizontal-pod-autoscaler-tolerance=0.1 (default)
설명의 편의를 위해서 조정 오차가 0.0이라고 한다면,
원하는 매트릭이 200m인데 현재 매트릭이 400m이면 레플리카도 2배로 늘어납니다.
원하는 레플리카 수 = ceil[현재 레플리카 수 * ( 현재 메트릭 값 / 원하는 메트릭 값 )]
또한 HPA는 파드가 준비 되었는지 판단할 기능이 제공되지 않습니다.
따라서 일정 시간* 동안 준비되지 않음(not yet ready)로 갈음합니다.
💡
[일정 시간* 동안 준비되지 않음(not yet ready)로 갈음] --horizontal-pod-autoscaler-initial-readiness-delay=30s (default) 파드는 무조건 30초 정도는 시작되지 않음으로 갈음 --horizontal-pod-autoscaler-initialization-period=5m (default) 파드가 준비(ready)가 되어도 무조건 5분은 해당 매트릭을 사용하지 않음
때로 HPA는 급격한 파드 축소로 인한 서비스 장애를 유발하기도 합니다.
따라서 구성 가능한 창(Window)에서 가장 높은 권장사항*을 따르도록 구현됩니다.
💡
[구성 가능한 창에서 가장 높은 권장사항*] --horizontal-pod-autoscaler-downscale-stabilization=5m (default)
누락된 매트릭이 있는 파드,
준비되지 않은 파드(갈음*된 파드),
실행에 실패한 파드(삭제 중인 파드) 등은 원하는 매트릭(desire)의 0%를 소모한다고 판단하며, 결과적으로 현재 매트릭(current)에는 포함되지 않습니다.
Namespace, Service, Deployment, HPA 배포하기
kubectl apply -f https://raw.githubusercontent.com/unchaptered/onpremise-kubernetes/1e766cb23835572c39c062a9783ba2ae8fa87dfd/pod-autoscaler/1-hpa-basic.yaml
HPA, Service, Deploy, ReplicaSet, Pod 확인하기
kubectl get hpa,svc,deploy,rs,pod -n pod-autoscaler \ -o=custom-columns="TYPE:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name"
TYPE NAMESPACE NAME HorizontalPodAutoscaler pod-autoscaler hpa-01-basic Service pod-autoscaler hpa-01-basic Deployment pod-autoscaler hpa-01-basic ReplicaSet pod-autoscaler hpa-01-basic-6cd47c8df5 Pod pod-autoscaler hpa-01-basic-6cd47c8df5-fffvj Pod pod-autoscaler hpa-01-basic-6cd47c8df5-zpcfb
Prometheus, Grafana 대시보드 구성하기
dddd
B.2. HPA 확장 및 축소 정책
HPA scaleUp, Down의 기본동작 [B.2 -1]은 다음과 같습니다.
Option | scaleUp | scaleDown |
---|---|---|
stabilizationWindowsSeconds | 0 | 300 |
Percent (value | periodSeconds) | 100 | 15 | 100 | 15 |
Pod (value | periodSeconds) | 4 | 15 |
각 옵션에 대해서 selectPolicy를 선택할 수 있습니다.
Option | Description |
---|---|
Disable | 자동 크기 조정 정책을 비활성화 |
Min | 복수의 정책 중 가장 작은 값을 적용 |
Max | 복수의 정책 중 가장 큰 값을 적용 |
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-01-basic
spec:
replicas: 2
template:
spec:
containers:
- name: hpa-01-basic
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-01-basic
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-01-basic
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
behavior:
scaleUp:
stabilizationWindowsSeconds: 60
policies:
- type: Percent
value: 100
periodSeconds: 60
- type: Pods
value: 4
periodSeconds: 60
selectPolicy: Max
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 25
periodSeconds: 120
- type: Pods
value: 2
periodSeconds: 120
selectPolicy: Min
B.3. HPA 다양한 매트릭 유형
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
Container Resource Metric [B.3 - 2]
type: ContainerResource
containerResource:
name: cpu
container: application
target:
type: Utilization
averageUtilization: 60