์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์๋ 3๊ฐ์ง์ AutoScaler ๊ฐ ์์ต๋๋ค. HPA, VPA, CA ์ฃ .
๊ฐ๋จํ ์ค๋ช ํด๋ณด์๋ฉด,
- HPA : Horizontal Pod Autoscaler ์ ์ค์๋ง๋ก, ํ๋์ ๊ฐฏ์๋ฅผ ํ์ฅ/์ถ์ ํด์ค
- VPA : Vertical Pod Autoscaler ์ ์ค์๋ง๋ก, ํ๋์ ๊ฐฏ์๊ฐ ์๋ ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ํ์ฅ/์ถ์ ํด์ค
- CA : Cluster Autoscaler ์ ์ค์๋ง๋ก, ๋ ธ๋์ ๊ฐฏ์๋ฅผ ํ์ฅ/์ถ์ ํด์ค
HPA, VPA ๋ Metrics Server ๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ฉฐ, ๋ VPC ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ค์นํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ CA ๋ ๋ณดํต Karpenter ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ HPA ์ ๋ํด ๋ค๋ค๋ณด๊ณ ์ ํ๋๋ฐ, ์ฌ์ค HPA ๋ ์ด๋ ค์ด ๊ฐ๋ ์ด ํฌ๊ฒ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ ์ ์ค๋ช ํ๊ธฐ ๋ณด๋ค๋ HPA ๊ฐ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ํ๋ ๊ฐฏ์๋ฅผ ํ์ฅ/์ถ์ํ๋์ง ์๊ณ ๋ฆฌ์ฆ ๋์๋ฐฉ์์ ์ด์ ์ ๋ง์ถ๊ณ ์ ํฉ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋~
๊ฐ๋
ํ๋ฒ ๊ฐ๋จํ ๊ฐ๋ ์ ์ง๊ณ ๋์ด๊ฐ๋ณด์ฃ .
HPA ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ปดํฌ๋ํธ ์ค์ ํ๋์ธ ์ปจํธ๋กค๋ฌ ๋งค๋์ ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
HorizontalPodAutoscaler ๋งค๋ํ์คํธ์ ์ง์ ๋ ๋ฉํธ๋ฆญ์ ๋ํด ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ ์ ์ฃผ๊ธฐ์ ์ผ๋ก Metrics Server ์๊ฒ ์ง์ํฉ๋๋ค.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
namespace: hpa-example
spec:
maxReplicas: 10
minReplicas: 2
metrics:
- resource:
name: memory
target:
averageUtilization: 75
type: Utilization
type: Resource
- resource:
name: cpu
target:
averageUtilization: 75
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-example
Autoscaling API Version ์ alpha, beta, v1, v2 ๋ฑ ๋ค์ํ ๋ฒ์ ์ด ์์ผ๋ ์ฌ์ฉ์ ์ฃผ์ํ์๊ธฐ ๋ฐ๋๋๋ค.
๋ฉํธ๋ฆญ์ Metrics Sever ์์ ๊ฐ์ ธ์ค๊ณ , ์ฃผ๊ธฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 15์ด์ด๋ฉฐ, kube-controller-manager ์ --horizontal-pod-autoscaler-sync-period ํ๋ผ๋ฏธํฐ์ ์ํด ์ค์ ๋ฉ๋๋ค.
Metrics Server ๋ง๊ณ Prometheus Adapter ์ ๊ฐ์ ์ธ๋ถ ๋ฉํธ๋ฆญ ์๋ฒ์ ์ง์ ํ ์๋ ์์ต๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฅ/์ถ์ ๋ ๋ ์ ์ฉ๋๋ ๊ฐฏ์๋ ์๋์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ฆ ๋๋ค.
(autoscaling/v2 ๋ถํฐ ์ฑํ๋ behavior ๋ผ๋ ์ต์ ์ ์ฃผ๋ฉด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ ์ ์๋๋ฐ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค)
์ํ๋ ๋ ํ๋ฆฌ์นด ์ = ceil[ํ์ฌ ๋ ํ๋ฆฌ์นด ์ * ( ํ์ฌ ๋ฉํธ๋ฆญ ๊ฐ / ์ํ๋ ๋ฉํธ๋ฆญ ๊ฐ )]
์์๋ ์ ์ ๊ณต์๋ฌธ์์์ ๋งํ๋ฏ, ๋ฉํธ๋ฆญ ๊ฐ์ด ์ ํํ๊ฒ ๊ณ์ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ก๋ HPA ๊ฐ ์ค์ผ์ค๋ง๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ์ค์ต์ ํตํด์ ๋ ์์ธํ ์์๋ณด์ฃ !
ScaleUp ์ค์ต
์์ ์ ์ฌ์ฉ๋๋ ๋งค๋ํ์คํธ๋ ๊ณต์ ๋ฌธ์์ ์ฌ์ฉ๋๋ ๊ฒ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 300m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
autoscaling/v1 ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, v2 ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์์ ํ์ ์ผ ํฉ๋๋ค.
.containers[].resources ์ ๊ฐ์ ๋ช ์ํ์ง ์์ผ๋ฉด HPA ๋์ํ์ง ์์ผ๋ ๋ฐ๋์ ๋ช ์ํด์ค๋๋ค.
HPA ๋ .resources.requests ์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด์ฃ .
minReplicas ๋ฅผ 0 ์ผ๋ก ์ง์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐฐํฌ ํ ํ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์์ฑ๋ ํ๋์ ๋ถํ๋ฅผ ์ค๋๋ค.
$ kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
๋ถํ๋ฅผ ์ค ํ 10๋ถ ๋์ ๊ด์ฐฐ์ ํ ๊ฒฐ๊ณผ ์ ๋๋ค.
--horizontal-pod-autoscaler-sync-period ์ ๊ธฐ๋ณธ ๊ฐ์ด 15์ด ์ด๊ธฐ ๋๋ฌธ์ AGE ํ๋๋ฅผ ๋ณด๋ฉด ๋๋ต 15์ด๋ง๋ค ํ๊ฐ๊ฐ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ 4๊ฐ ์ด์์ ์์ฑ๋์ง ์๋ ๊ฑธ ๋ณด๋ ๋ช ๋ น์ด "while sleep 0.01; do wget -q -O- http://php-apache; done" ์ ์ฒ๋ฆฌํ๋๋ฐ 3๊ฐ์ ํ๋๋ง ์์ผ๋ฉด ์ถฉ๋ถํ๋จ ๊ฑธ ์ ์ ์์ต๋๋ค.
๋ ธ๋์ ๋ค๋ชจ๋ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๊ฐ ์ฆ๊ฐํ๊ธฐ ์ ์ ํ์ํ๊ณ ์๋๋ฐ, ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ ๋ง ๊ฐฏ์๊ฐ ์ฆ๊ฐ๋๋ ์ง๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์ํ๋ ๋ ํ๋ฆฌ์นด ์ = ceil[ํ์ฌ ๋ ํ๋ฆฌ์นด ์ * ( ํ์ฌ ๋ฉํธ๋ฆญ ๊ฐ / ์ํ๋ ๋ฉํธ๋ฆญ ๊ฐ )]
ceil ์ ์ฌ๋ฆผ์ ๋ปํฉ๋๋ค. ๋ฐ๋์ธ floor ๋ ๋ฒ๋ฆผ์ ๋ปํฉ๋๋ค. ceil ์ ์ฒ์ฅ์ด์ฌ์ ์ฌ๋ฆผ, floor ์ ๋ฐ๋ฅ์ด์ฌ์ ๋ฒ๋ฆผ์ผ๋ก ์ธ์ฐ๋ฉด ์ํท๊ฐ๋ฆฌ์ฃ .
์ฒซ๋ฒ์งธ ๋ ธ๋์ ๋ค๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋ค์ ํ๊ฐ(15์ด ๋ค) ๋ ๋ ํ๋ฆฌ์นด๊ฐ 2๊ฐ๋ก ๋์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋๋ฒ์งธ ๋ ธ๋์ ๋ค๋ชจ๋ 3๊ฐ๋ก ๋์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์์ ๋ฉํธ๋ฆญ ๊ฐ์ ํผ์ผํธ๋ก ํ๋๋ฐ, ์๋์ฒ๋ผ ๊ณ์ฐํด๋ ๊ฐ์ ๊ฐ์ด ๋์ต๋๋ค.
ํ๋๋ค์ ํ์ฌ ๋ฉํธ๋ฆญ ํ๊ท ๊ฐ / (ํ๋๋ค์ ํ๊ท request ๊ฐ * targetCPUUtilizationPercentage)
ScaleDown ์ค์ต
์ด๋ฒ์ ScaleDown ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฉํธ๋ฆญ ๊ฐ์ ์์๋ก ๋ณํ๋ ๋์ ํน์ฑ ๋๋ฌธ์ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๊ฐ ์์ฃผ ์๋์น ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์์ thrashing ๋๋ flapping ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด stabilization window (์์ ํ ์๋์ฐ) ๋ผ๋ ์๋ก์ด ๊ฐ๋ ์ด ๋ฑ์ฅํฉ๋๋ค.
HPA ๋ ์ค์ผ์ผ ๊ถ์ฅ ์ฌํญ์ ํ๊ฐ ์๊ฐ ๋๋ง๋ค window ์ ๊ธฐ๋กํ๋ฉฐ 5๋ถ(๊ธฐ๋ณธ๊ฐ)์ด ๋๋ ์์ ์ window ์์ ๊ฐ์ฅ ๋์ ์ซ์๋ฅผ ์ ํํด ์ค์ผ์ผ์ ์งํํฉ๋๋ค.
์ฌ๊ธฐ์ 5๋ถ์ --horizontal-pod-autoscaler-downscale-stabilization (๊ธฐ๋ณธ๊ฐ 5๋ถ) ์ ์ํด ์ค์ ๋๋ฉฐ, ๋ง์ฐฌ๊ฐ์ง๋ก kube-controller-manager ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ window ๋ ScaleDown ๋ ์ฌ์ฉ๋ฉ๋๋ค.
autoscailing/v2 ์ behavior ์ต์ ์ ํตํด ScaleUp ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ค๋ฃน๋๋ค.
์ด์ ๋ช ๋ น์ด "while sleep 0.01; do wget -q -O- http://php-apache; done" ๋ฅผ ์ค๋จํด๋ณด์ฃ .
๊ทธ๋ผ ์ต์ข ์ ์ผ๋ก ๋ค์ ํ๋์ ๊ฐฏ์๊ฐ 3๊ฐ -> 1๊ฐ๊ฐ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ์ด์ง ์ด์ํ ๋ถ๋ถ์ด ์์ผ์ค ๊ฒ๋๋ค. 3๊ฐ -> 2๊ฐ๊ฐ ๋๋ ๊ตฌ๊ฐ์ TARGETS ๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด 2๊ฐ ์๋ 1๊ฐ๊ฐ ๋์ผ ํฉ๋๋ค.
1์ด ์๋ ์ด์ ๋ ๋ฐ๋ก Sync Period ๋ง๋ค ๋ฐ๋ก๋ฐ๋ก ํ๊ฐ๊ฐ ๋ฐ์๋๋ ScaleUp ๊ณผ ๋ฌ๋ฆฌ ScaleDown ์ window ๋ฅผ ์ฐธ๊ณ ํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ window ๋ ์ฐ๋ฆฌ๊ฐ ์๋ ํ(Queue) ๋ก ์๊ฐํ๋ฉด ์ฝ์ต๋๋ค. ๋ฆฌ์คํธ์ด๋ฉฐ FIFO ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋์ฃ .
44๋ถ 15์ด๋ถํฐ ๋ช ๋ น์ด "while sleep 0.01; do wget -q -O- http://php-apache; done" ์ ์ค๋จํด์ ๋ถํ๋ฅผ ๋์์ต๋๋ค.
์ด๋ window ์๋ [3, 3, 3, .... 3, 3] ๋ง ์กด์ฌํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
15์ด๋ง๋ค ํ๊ฐ๋๊ณ 5๋ถ์ด๋ผ๋ stabilization ์ด๋ผ๋ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก window ์๋ ์ด 1๋ถ๋น 4๋ฒ ํ๊ฐ * 5๋ถ = 20 ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. 3์ ํ์ฌ์ ๋ ํ๋ฆฌ์นด ๊ฐฏ์์ ๋๋ค.
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ,3, 3, 3 ,3, 3, 3, 3]
2๋ฒ์งธ(44๋ถ 30์ด, 29%/50%)๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด ์ํ๋ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๊ฐ 2๊ฐ์ด๋ฏ๋ก, windows ์๋ 2 ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ FIFO ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์์ ์๋ 3 ์ด ๋น ์ง๊ฒ ๋์ฃ .
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ,3, 3, 3 ,3, 3, 3, 2]
ํ์ง๋ง HPA ๋ ๊ฐ์ฅ ๋์ ์๋ฅผ ๋ฐ๋ผ๋ณด๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ 3๊ฐ์ ๋๋ค.
3๋ฒ์งธ(44๋ถ 45์ด, 1%/50%) ์๋ HPA ์๊ณ ๋ฆฌ์ฆ์ ์ํด์ 1 ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์์ ์๋ 3 ์ด ๋ ๋น ์ง์ฃ .
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ,3, 3, 3 ,3, 3, 3, 2, 1]
4๋ฒ์งธ๋ถํฐ๋ ๊ฐ์๊ธฐ 5๋ถ์ ๊ฑด๋๋ด 49๋ถ 15์ด์ ๋ก๊ทธ๊ฐ ์ฐํ์ต๋๋ค. --horizontal-pod-autoscaler-downscale-stabilization ์ ๊ธฐ๋ณธ๊ฐ์ด 5๋ถ์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
๋ฑ 4๋ฒ์งธ(49๋ถ 15์ด, 1%/50%) ์๊ฐ๊น์ง๋ window ์ 3 ์ด ํ๋๋ง ์กด์ฌํ๊ณ ์์ ๊ฒ์ด๊ณ , ๋์์ 1 ์ด window ์ ๋ค์ด์์ผ ํฉ๋๋ค.
[3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
5๋ฒ์งธ(49๋ถ 30์ด, 1%/50%) ์ ๋ 1 ์ด ๋ค์ด์ฌ ๊ฒ์ด๊ณ , ์ด์ ๋ ์ด์ 3 ์ windows ์ ์๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ฅ ํฐ ์ซ์์ธ 2 ๋ฅผ HPA ๊ฐ ์ฑํํ๊ฒ ๋๊ณ , ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๊ฐ ๋๋์ด 2 ๋ก ๋ฉ๋๋ค.
[2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
6๋ฒ์งธ(49๋ถ 45์ด, 1%/50%) ์ ๋ 1 ์ด ๋ค์ด์ฌ ๊ฒ์ด๊ณ , ์ด์ ๋ ์ด์ 2 ๋ window ์ ์๊ฒ ๋ฉ๋๋ค.
window ์ ์ด์ 1๋ง ์กด์ฌํ๊ฒ ๋๊ณ , ์ต์ข ์ ์ผ๋ก ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ 1 ์ด ๋ฉ๋๋ค.
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
์ง๊ธ๊น์ง ์์๋ณธ ๋์์ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๊ฐ์ผ๋ก ์งํ๋ ๋์ ๋ฐฉ์์ด์๋๋ฐ, autoscaling/v2 ์ ์ถ๊ฐ๋ behavior ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค์คํ ํ ์ค์ผ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Behavior
behavior ํ๋๋ autoscaling/v2beta2 ๋ฒ์ ๋ถํฐ ์ ๊ณต๋์์ผ๋ฉฐ, ํ์ฌ autoscaling/v2 ๋ฅผ ํตํด ์์ ํ ๋ฒ์ ์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
behavior ํ๋๋ฅผ ํตํด ์ค์ผ์ผ์ ๋์๊ณผ ์ค์ผ์ผ๋ค์ด ๋์์ ๋ณ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋๋ถ์ ScaleDown ๋๋ง ์ ์ฉ๋๋ stabilization window ์ ์ด์ ScaleUp ๋๋ ์ฌ์ฉํ ์ ์์ด thrashing(flapping) ์ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋๋ก ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋๋ฐ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ Initializing ๋๋ง cpu ๊ฐ ํ์ด์ค๋ฅด๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ถ๋ถ์ ์ด๋ฏธ ์์๋์ด ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋๋ฐ ์์ด ์ ํ ๋ฌธ์ ๊ฐ ์๋๋ ๋ถ๋ถ์ด์ฃ . ํ์ง๋ง HPA ๋ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ค์ผ์ผ์ ์ ์งํํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ด ๋ stabilization window ์ ์ด์ฉํ๋ฉด ๋ถํ์ํ ์ค์ผ์ผ์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์์์ ์ฌ์ฉํ HPA ๋งค๋ํ์คํธ๋ ์๋์ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
maxReplicas: 10
minReplicas: 2
metrics:
- resource:
name: memory
target:
averageUtilization: 50
type: Utilization
type: Resource
- resource:
name: cpu
target:
averageUtilization: 50
type: Utilization
type: Resource
behavior:
scaleDown:
stabilizationWindowSeconds: 300
selectPolicy: Max
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
selectPolicy: Max
policies:
- type: Percent
value: 100
periodSeconds: 60
- type: Pods
value: 4
periodSeconds: 60
.behavior ์์ญ์ ์๋ ๊ฐ๋ค์ ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค.
๋ ๋ง์ ๊ฐ๋ค์ด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ!
.metrics ํ๋๋ v2 ๋ก ๋๋ฉด์ ์ฝ๊ฐ์ ๋ณํ๊ฐ ์์ง๋ง ์ค์ํ ๊ฑด behavior ์ ๋๋ค.
behavior:
scaleDown:
stabilizationWindowSeconds: 300
selectPolicy: Max
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleUp:
stabilizationWindowSeconds: 0
selectPolicy: Max
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
- scaleUp/scaleDown : ์ค์ผ์ผ์ /๋ค์ด์ ๋ํ ์ ์ด ๊ท์น์ ์ง์ ํฉ๋๋ค.
- stabilizationWindowSeconds : thrashing, flapping ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฏธ ์์ "ScaleDown ์ค์ต" ์น์ ์์ ํด๋น ๊ฐ๋ ์ ๋ค๋ฃจ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
(๊ธฐ๋ณธ๊ฐ ScaleUp : 0s ScaleDown : 300s) - selectPolicy : Min, Max, Disabled ์ด 3๊ฐ์ ๊ฐ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ ์ฑ
์์ ์ด๋ค ๊ฐ์ ์ ํํ ์ง ์ง์ ํฉ๋๋ค.
๋ง์ฝ Min ์ด๋ผ๋ฉด ๊ฐ์ฅ ์์ ์ซ์๋ฅผ ์ ํํ๊ฒ ๋ฉ๋๋ค.
(๊ธฐ๋ณธ๊ฐ Max) - policy : ์ค์ผ์ผ์
/์ค์ผ์ผ๋ค์ด์ ๊ท์ ํ๋ ์ ์ฑ
๋ชฉ๋ก์
๋๋ค.
- type : Pods, Percent ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ Pods ๋ฅผ ์ ํํ๋ฉด ๊ฐฏ์๋ก, Percent ๋ฅผ ์ ํํ๋ฉฐ ํผ์ผํธ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
- periodSeconds : ํ๊ฐ๋ฅผ ์งํํ๋ ์ฃผ๊ธฐ์ ๋๋ค. ํด๋น ์ ์ฑ ์ด true ์ธ์ง ํ๋ณํฉ๋๋ค.
- value : ์ค์ผ์ผ์ /๋ค์ด๋๋ ๊ฐ์ ์ง์ ํฉ๋๋ค. type ์ด Pods ๋ผ๋ฉด value ๋ '์ดํ' ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด ๊ฐ ํ๋๊ฐ ์ด๋ค๊ฑด์ง ์๊ธฐ๊ฐ ํ๋๋ ์์ ๋ฅผ ํตํด ์ค๋ช ํด๋๋ฆฌ์ฃ !
์์ ๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ณต์ ๊นํ์์ ์ ๊ณต๋๋ ์์ ๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ์๋ฌธ์ ๋ณด๊ณ ์ถ๋ค๋ฉด ํด๋น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๋ค๋ง, ๋ฌธ์์ ํ๋ฆฐ ๋ถ๋ถ์ด ์์ด์ ๋ง๊ฒ๋ ์์ ํ์ฌ์ ๊ธ์ ์์ฑํ์์ต๋๋ค.
๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ฒ Scale Up
behavior:
scaleUp:
policies:
- type: Percent
value: 900
periodSeconds: 60
60์ด๋ง๋ค Target ๋ฉํธ๋ฆญ ๊ฐ์ ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ํ์ฌ์ ๋ ํ๋ฆฌ์นด ๊ฐฏ์์ 900% ์ฆ๊ฐ๋ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ฅผ ๋ํฉ๋๋ค.
1 -> 10 -> 100 -> 1000
1๋ถ ๋ง๋ค ์์ ๊ฐ์ด ํ๋์ ๊ฐฏ์๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ maxReplicas ์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ScaleDown ์ ๋ช ์๋์ง ์์์ง๋ง ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ํฉ๋๋ค.
๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ฒ Scale Up ํ๊ณ , ์ ์ฐจ์ ์ผ๋ก Scale Down
behavior:
scaleUp:
policies:
- type: Percent
value: 900
periodSeconds: 60
scaleDown:
policies:
- type: Pods
value: 1
periodSeconds: 600 # (i.e., scale down one pod every 10 min)
Scale Up ๊ฒฝ์ฐ์๋ 60์ด๋ง๋ค Target ๋ฉํธ๋ฆญ ๊ฐ์ ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์์ 900% ์ฆ๊ฐ๋ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ฅผ ๋ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Target ๋ฉํธ๋ฆญ ๊ฐ์ ์ํด Scale Down ์ด ๋ ๋์๋ 10๋ถ๋ง๋ค ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ ํ๋์ฉ ๊ฐ์์ํต๋๋ค.
1000 -> 1000 -> 1000 -> … (7 more min) -> 999
(1๋ถ ์ง๋๊ณ ) (1๋ถ ์ง๋๊ณ ) (1๋ถ ์ง๋๊ณ ) (7๋ถ ์ง๋๊ณ ) (์ด 10๋ถ์ด ์ง๋๊ณ )
maxReplicas ๋ 1000 ๊ฐ๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
์ ์ฐจ์ ์ผ๋ก Scale Up
behavior:
scaleUp:
policies:
- type: Pods
value: 1
periodSeconds: 300
5๋ถ๋ง๋ค Target ๋ฉํธ๋ฆญ ๊ฐ์ ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ฅผ 1๊ฐ์ฉ ๋ํฉ๋๋ค.
1 -> 2 -> 3 -> 4
ScaleDown ์ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋ฆ ๋๋ค.
๊ธฐ๋ณธ ๊ฐ์ผ๋ก Scale Up ํ๊ณ , Scale Down์ ํ์ง์์
behavior:
scaleDown:
selectPolicy: Disabled
ScaleUp ์ ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋ฅด๊ณ ScaleDown ์ ์งํ๋์ง ์์ต๋๋ค.
Scale Down ์ ์์ ํ
behavior:
scaleDown:
stabilizationWindowSeconds: 600
selectPolicy: Max
policies:
- type: Pods
value: 5
periodSeconds: 60
๋ฌธ์์๋ periodSeconds: 600 ์ผ๋ก ๋์์๋๋ฐ ์คํ์ธ๊ฑฐ ๊ฐ์ต๋๋ค. ์ ํ ์ํฉ์ ๋ณด๋ฉด 60 ์ด ๋ง์ต๋๋ค.
60์ด๋ง๋ค Target ๋ฉํธ๋ฆญ ๊ฐ์ ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์์ 5๊ฐ ์ดํ๋ฅผ ๋บ๋๋ค. ๋จ ์์ ํ ์๊ฐ 10๋ถ(600์ด) ์ ๊ฐ์ง๋๋ค.
์์ ํ์ ๋์ฅ ๋ฐฉ์์ ์์์ ์ค๋ช ํ "Scale Down ์น์ " ๊ณผ ๋๊ฐ์ต๋๋ค.
ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ 10๊ฐ๋ผ๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
HPA ๊ฐ ์์ฑ๋ ๊ธฐ์ค์ผ๋ก 9๋ถ๊น์ง๋ ์ด๋ ํ ScaleDown ์ ์งํ๋์ง ์๊ณ , ๊ทธ์ window ์ ์ถ์ฒ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
# ๊ฐ ์ซ์๋ ์์์ ๋ฉํธ๋ฆญ ๊ฐ์ผ๋ก ๊ณ์ฐ๋ ๊ฒ์ผ๋ก, ํฐ ์๋ฏธ๋ ์์ต๋๋ค.
[10, 9, 8, 9, 9, 8, 9, 8, 9]
๊ทธ๋ฆฌ๊ณ 10๋ถ์ด ๋ ๋ 8 ์ด ์ถ๊ฐ๋ฉ๋๋ค. (8 ์ด๋ผ๋ ์ซ์๋ ์์์ ๊ฐ์ผ๋ก ํฐ ์๋ฏธ๋ ์์ต๋๋ค)
[10, 9, 8, 9, 9, 8, 9, 8, 9, 8]
60์ด๋ง๋ค ํ๊ฐ๋ฅผ ์งํํ๊ณ ์์ ํ ์๊ฐ์ด 600์ด์์ผ๋ฏ๋ก ์ด ์ฐฝ์๋ ์ต๋ 10๊ฐ์ ์ซ์๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
selectPolicy: Max ์ด๋ฏ๋ก ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ Pick ํด์ HPA ๋ 10 ๊ฐ๋ก ScaleDown ํ๋ ค๊ณ ์๋ํ์ง๋ง, ์ด์ฐจํผ ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๊ฐ 10๊ฐ์ด๋ฏ๋ก ๋ณํ๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ 11๋ถ์ 7 ์ด ์ถ๊ฐ๋๋ ค๊ณ ํฉ๋๋ค. FIFO ๋ฐฉ์์ฒ๋ผ ๊ฐ์ฅ ์์ ์๋ ์ซ์๊ฐ ๋น ์ง๊ณ , ๊ฐ์ฅ ๋ค์ 7 ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
[9, 8, 9, 9, 8, 9, 8, 9, 8, 7]
์ด๋ฒ window ์์ ๊ฐ์ฅ ํฐ ์ซ์๊ฐ 9 ์ด๋ฏ๋ก 10 -> 9 ๋ก ScaleDown ์ ํ๊ฒ ๋ฉ๋๋ค.
ScaleUp ์ ๋ฐ๋ก ๋ช ์๋ ๊ฒ์ด ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ๋์์ผ๋ก ๋ฐ๋ฆ ๋๋ค.
๋ถ์ ์ ์ธ ์๊ทธ๋๋ก ์ธํ ScaleUp ํผํ๊ธฐ
behavior:
scaleUp:
stabilizationWindowSeconds: 300
selectPolicy: Min
policies:
- type: Pods
value: 20
periodSeconds: 60
60์ด๋ง๋ค Target ๋ฉํธ๋ฆญ ๊ฐ์ ํ๊ฐํ๊ณ , ํ๊ฐ๊ฐ true ๋ผ๋ฉด ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์์ 20๊ฐ ์ดํ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋จ ์์ ํ ์๊ฐ 5๋ถ(300์ด) ์ ๊ฐ์ง๋๋ค.
๋ถ์ ์ ์ธ ์๊ทธ๋(false positive signals) ์ ์๋์ ๊ฐ์ด ์์ฃผ ์งง์ ์คํ์ดํฌ๋ฅผ ๋งํฉ๋๋ค.
ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ 2๊ฐ๋ผ๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
HPA ๊ฐ ์์ฑ๋ ๊ธฐ์ค์ผ๋ก 5๋ถ๊น์ง๋ ์ด๋ ํ ScaleDown ์ ์งํ๋์ง ์๊ณ , ๊ทธ์ window ์ ์ถ์ฒ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
60์ด๋ง๋ค ํ๊ฐ๋ฅผ ์งํํ๊ณ ์์ ํ ์๊ฐ์ด 300์ด์์ผ๋ฏ๋ก ์ด ์ฐฝ์๋ ์ต๋ 5๊ฐ์ ์ซ์๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์์ ์ซ์๊ฐ 2 ์ด๋ฏ๋ก ํ์ฌ ๋ ํ๋ฆฌ์นด ๊ฐฏ์๋ 2๊ฐ ์ ๋๋ค.
# ๊ฐ ์ซ์๋ ์์์ ๋ฉํธ๋ฆญ ๊ฐ์ผ๋ก ๊ณ์ฐ๋ ๊ฒ์ผ๋ก, ํฐ ์๋ฏธ๋ ์์ต๋๋ค.
[2, 3, 19, 10, 3]
6๋ถ์ด ๋ ๋ 4 ๋ผ๋ ๊ฐ์ด window ์ ๋ค์ด์ค๊ณ , ๊ฐ์ฅ ์์ ์๋ 2 ๋ ๋์ค๊ฒ ๋ฉ๋๋ค.
[3, 19, 10, 3, 4]
์ด๋ฒ window ์์ ๊ฐ์ฅ ์์ ์ซ์๊ฐ 3 ์ด๋ฏ๋ก 2 -> 3 ์ผ๋ก ScaleUp ์ ํ๊ฒ ๋ฉ๋๋ค.
behavior ์ ์ด์ฉํ๋ฉด ScaleUp/Down ์ ๋ํด ๋ ์ปค์คํ ํ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง๋ ๋จ์ํ ํ๋์ CPU ์ Memory ๋ก๋ง ๋ฉํธ๋ฆญ์ ๊ณ์ฐํ์ง๋ง KEDA ์ ๊ฐ์ ์คํ ์์ค๋ฅผ ์ด์ฉํ๋ฉด ๋ ๋ค์ํ๊ฒ ๋ฉํธ๋ฆญ์ ๊ณ์ฐํด์ HPA ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋์ ์ฌ๊ธฐ๊น์ง!