์๋ฒ ์ด์์์ ๊ฐ์ฅ ๋ฌด์์ด ์๊ฐ์ ์๊ณ ์์ด ํธ๋ํฝ์ด ๋ชฐ๋ฆด ๋์ ๋๋ค. ๋ฏธ๋ฆฌ ํ๋๋ฅผ ์๋ฉ ๋์๋๋ฉด ํ์์ ์์ ๋ญ๋น๊ณ , ๋๋ฌด ์ ๊ฒ ๋๋ฉด ํญํ์ด ํฐ์ง๋๋ค. HPA(Horizontal Pod Autoscaler) ๋ ์ด ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํด๊ฒฐํด์ค๋๋ค. CPU ์ฌ์ฉ๋ฅ ์ ๋ณด๋ค๊ฐ ์ผ์ ์์น๋ฅผ ๋์ผ๋ฉด ํ๋๋ฅผ ์๋์ผ๋ก ๋๋ฆฌ๊ณ , ํธ๋ํฝ์ด ๋น ์ง๋ฉด ๋ค์ ์ค์ ๋๋ค.
๐ฏ ์คํ ์๋๋ฆฌ์ค
- ํ์์: ํ๋ 1๊ฐ ์ ์ง (์์ ์ ์ฝ)
- ํญ์ฃผ ์: CPU ์ฌ์ฉ๋ฅ ์ด 50%๋ฅผ ๋์ผ๋ฉด ์ต๋ 10๊ฐ๊น์ง ์๋ ์ฆ๊ฐ
- ๊ฒ์ฆ: ๋ถํ ์์ฑ๊ธฐ๋ก ์๋ฒ๋ฅผ ๊ณต๊ฒฉํด์ ํ๋๊ฐ ๋์ด๋๋ ๊ฑธ ๋์ผ๋ก ํ์ธ
๐ ๏ธ ๊ตฌ์ฑ ๊ณผ์
Step 1: Metrics Server ์ค์น
์ฟ ๋ฒ๋คํฐ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์์งํ์ง ์์ต๋๋ค. HPA๊ฐ ์๋ํ๋ ค๋ฉด Metrics Server๊ฐ ํ์ํฉ๋๋ค.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# ๋ฒ ์ด๋ฉํ ํ๊ฒฝ์์ ์ธ์ฆ์ ์ค๋ฅ ํด๊ฒฐ ํจ์น
kubectl patch deployment metrics-server -n kube-system \
--type='json' \
-p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
# ๋์ ํ์ธ (์ ์ ํ)
kubectl top nodes
Step 2: ํ ์คํธ์ฉ ์ฑ ๋ฐฐํฌ
๊ตฌ๊ธ์ด HPA ํ
์คํธ์ฉ์ผ๋ก ๋ง๋ php-apache ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. requests ์ค์ ์ด ํ์์
๋๋ค. HPA๋ requests ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋ฅ ์ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค.
# php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
replicas: 1
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: "200m" # ๊ธฐ์ค์ : ์ด ๊ฐ์ 50%๋ฅผ ๋์ผ๋ฉด ์ค์ผ์ผ ์์
limits:
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
spec:
selector:
run: php-apache
ports:
- port: 80
kubectl apply -f php-apache.yaml
Step 3: HPA ๊ท์น ์ค์
kubectl autoscale deployment php-apache \
--cpu-percent=50 \ # CPU 50% ๋์ผ๋ฉด ์ค์ผ์ผ ์์
--min=1 \ # ์ต์ 1๊ฐ
--max=10 # ์ต๋ 10๊ฐ
# HPA ์ํ ํ์ธ
kubectl get hpa
๐ฅ ๋ถํ ํ ์คํธ โ ์๋ฒ ๊ณต๊ฒฉ ๊ฐ์
๋ณ๋ ํฐ๋ฏธ๋์์ busybox ํ๋๋ก ๋ฌดํ ๋ฃจํ ๊ณต๊ฒฉ์ ์์ํฉ๋๋ค.
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"
์ฝ 1๋ถ ํ HPA๋ฅผ ๊ด์ฐฐํฉ๋๋ค.
kubectl get hpa -w # -w ๋ก ์ค์๊ฐ ๋ณํ ๊ด์ฐฐ
๐ ์คํ ๊ฒฐ๊ณผ
| ์๊ฐ ๊ฒฝ๊ณผ | CPU ๋ถํ (TARGETS) | ํ๋ ๊ฐ์ (REPLICAS) | ์ํ |
|---|---|---|---|
| 0๋ถ (๋๊ธฐ) | 0% / 50% | 1๊ฐ | ํ์จ ๐ |
| 1๋ถ (๊ณต๊ฒฉ!) | 200% / 50% ๐จ | 1๊ฐ โ 4๊ฐ | ๊ธ๊ฒฉํ ํ์ฅ |
| 3๋ถ (์์ ) | 50% / 50% | 4~5๊ฐ | ๋ถ์ฐ ์ฒ๋ฆฌ ์ค ๐ค |
๐งฎ “์ ํํ 4๊ฐ๋ก ๋์ด๋ฌ์๊น?” โ HPA ๊ณ์ฐ ๊ณต์
HPA๋ ๊ฐ์ด ์๋๋ผ ์ ํํ ๋น๋ก์์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
$$\text{๋ชฉํ ํ๋ ์} = \lceil \text{ํ์ฌ ํ๋ ์} \times \frac{\text{ํ์ฌ ์ฌ์ฉ๋}}{\text{๋ชฉํ ์ฌ์ฉ๋}} \rceil$$
์ค์ ๊ฐ์ ๋์ ํ๋ฉด:
1๊ฐ ร (200% / 50%) = 4๊ฐ
ํ๋ 1๊ฐ๊ฐ ๋ชฉํ์น์ 4๋ฐฐ๋ก ํ๋๋๊น, ์ฌ๋(ํ๋)๋ 4๋ฐฐ ๋ฝ๋๋ค๋ ๊ณ์ฐ์ ๋๋ค. ์ค์ ๋ก ์ ํํ 4๊ฐ๊ฐ ์์ฑ๋์ต๋๋ค.
๐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ ์ฉํ ๋ ์ฃผ์ํ ์
ํด๋ผ์ฐ๋์ ๋ฌ๋ฆฌ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ ์์์ด ์์ฃผ ์ ์ต๋๋ค. HPA๊ฐ ๋๋ฌด ๊ณต๊ฒฉ์ ์ผ๋ก ๋๋ฆฌ๋ฉด ์คํ๋ ค ๋ ธ๋๊ฐ OOM(Out Of Memory)์ผ๋ก ์ฃฝ์ ์ ์์ต๋๋ค.
# ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ฉ ๋ณด์์ ์ธ HPA ์ค์
kubectl autoscale deployment myapp \
--cpu-percent=70 \ # ์๊ณ๊ฐ์ ๋์ฌ์ ๋ ๋ฏผ๊ฐํ๊ฒ
--min=1 \
--max=3 # ์ต๋๋ฅผ 3๊ฐ๋ก ์ ํ
์์ ์ฑ์ด ํ์ฅ์ฑ๋ณด๋ค ์ฐ์ ์ธ ํ๊ฒฝ์์ Fixed Replicas ๋ฐฉ์์ ์ฐ๋ ๊ฒ ๋์ ์๋ ์์ต๋๋ค.
โ ์ ๋ฆฌ
HPA๋ ์ฟ ๋ฒ๋คํฐ์ค์ ์๊ธฐ ์น์ (Self-healing) + ์๋ ํ์ฅ(Auto-scaling) ์ ํต์ฌ์ ๋๋ค. ์ฌ๋์ด 24์๊ฐ ๋ชจ๋ํฐ๋งํ์ง ์์๋ ์์คํ ์ด ์ค์ค๋ก ํธ๋ํฝ์ ๋์ํฉ๋๋ค.
K8s ์ค์ต ์๋ฆฌ์ฆ๋ ์ฌ๊ธฐ๊น์ง์
๋๋ค. kubeadm์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ง์ ๊ตฌ์ฑํ๋ ๊ฒ๋ถํฐ, Pod, Deployment, Service, Ingress, StatefulSet, RBAC, HPA๊น์ง โ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์ ์์ ์ธ ์ ์๋ ๊ธฐ๋ฐ์ ๋ค์ก์ต๋๋ค.