๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ ๋ฉํธ๋ฆญ์ ํ์ฉํ์ฌ Kubernetes์ HPA(Horizontal Pod Autoscaler)๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Istio๋ ์๋น์ค ๋ฉ์ ๋ด๋ถ์ ํธ๋ํฝ ๋ฐ์ดํฐ ๋ฐ ์ฑ๋ฅ ์งํ๋ฅผ Prometheus๋ฅผ ํตํด ์์งํ๋ฉฐ,
์ด ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ฉด Pod์ ๋ถํ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅ(Scaling)ํ๋ HPA๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ Istio ๋ฉํธ๋ฆญ์ ํ์ฉํ HPA ์ค์ ๋ฐฉ๋ฒ, ์ค์ ์์ ๋ฐ ์ค์ผ์ผ๋ง ์ ๋ต์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Kubernetes HPA(Horizontal Pod Autoscaler)๋?
โ 1.1 HPA ๊ฐ๋
HPA(Horizontal Pod Autoscaler)๋ Kubernetes์์ Pod์ ๋ถํ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅ(Scale-out) ๋ฐ ์ถ์(Scale-in)ํ๋ ๊ธฐ๋ฅ์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ๋์ํ์ง๋ง, ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ(Custom Metrics)์ ํ์ฉํ ์๋ ์์ต๋๋ค.
HPA์ ์ฃผ์ ๊ธฐ๋ฅ
- Pod์ ๋ถํ(ํธ๋ํฝ ์ฆ๊ฐ)์ ๋ฐ๋ผ ์๋ ํ์ฅ(Scale-out) ์ํ
- ๋ถํ๊ฐ ์ค์ด๋ค๋ฉด ์๋ ์ถ์(Scale-in)๋ก ๋ฆฌ์์ค ์ ์ฝ
- Prometheus ๋ฐ Custom Metrics API์ ์ฐ๋ํ์ฌ ๋ค์ํ ๊ธฐ์ค์ผ๋ก ํ์ฅ ๊ฐ๋ฅ
๐ก Istio์ Prometheus ๋ฉํธ๋ฆญ์ ํ์ฉํ๋ฉด, ํธ๋ํฝ ๊ธฐ๋ฐ์ผ๋ก HPA๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
๐น 2. Istio์์ HPA๋ฅผ ์ํ ๋ฉํธ๋ฆญ ์์ง
โ 2.1 Prometheus์์ Istio ๋ฉํธ๋ฆญ ํ์ธํ๊ธฐ
Istio๋ ๊ธฐ๋ณธ์ ์ผ๋ก Prometheus๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ์๋น์ค ๋ฉํธ๋ฆญ์ ์์งํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฉํธ๋ฆญ์ ํ์ฉํ์ฌ HPA๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
๋ฉํธ๋ฆญ | ์ค๋ช |
istio_requests_total | ์ด๋น ์์ฒญ ์ |
istio_request_duration_milliseconds | ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ(์ง์ฐ ์๊ฐ) |
istio_tcp_sent_bytes_total | TCP ํธ๋ํฝ ์ ์ก๋ |
istio_tcp_received_bytes_total | TCP ํธ๋ํฝ ์์ ๋ |
โ 2.2 Prometheus์์ ํน์ ์๋น์ค์ ํธ๋ํฝ ์กฐํ
Prometheus์์ ํน์ ์๋น์ค์ ํธ๋ํฝ ๋ฉํธ๋ฆญ์ ํ์ธํ๋ ค๋ฉด ๋ค์ PromQL ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
rate(istio_requests_total{destination_service="my-service.default.svc.cluster.local"}[1m])
์ถ๋ ฅ ์์ :
my-service.default.svc.cluster.local | 75.3 req/sec
๐ก ์ ๊ฒฐ๊ณผ๋ my-service๊ฐ ์ด๋น 75.3๊ฐ์ ์์ฒญ์ ๋ฐ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
๐น 3. Istio ๋ฉํธ๋ฆญ ๊ธฐ๋ฐ HPA ์ค์
โ 3.1 Kubernetes Metrics Server ์ค์น
HPA๋ ๊ธฐ๋ณธ์ ์ผ๋ก Kubernetes Metrics Server๋ฅผ ํ์๋ก ํฉ๋๋ค.
Metrics Server๊ฐ ์ค์น๋์ง ์์๋ค๋ฉด, ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์ค์นํฉ๋๋ค.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
์ค์น ํ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํฉ๋๋ค.
kubectl get deployment metrics-server -n kube-system
์ถ๋ ฅ ์์ :
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 2m
โ 3.2 HPA๋ฅผ ์ํ Prometheus Adapter ์ค์น
Kubernetes์์ Prometheus ๋ฉํธ๋ฆญ์ HPA์ ๊ธฐ์ค์ผ๋ก ํ์ฉํ๋ ค๋ฉด kube-prometheus-adapter๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus-adapter prometheus-community/prometheus-adapter -n monitoring
์ค์น ํ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํฉ๋๋ค.
kubectl get pods -n monitoring | grep prometheus-adapter
์ถ๋ ฅ ์์ :
prometheus-adapter-xyz123 1/1 Running 0 1m
โ 3.3 HPA๋ฅผ ์ํ Custom Metrics ์ ์
prometheus-adapter๋ฅผ ํตํด Istio์ ํธ๋ํฝ ๋ฉํธ๋ฆญ์ HPA์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-service-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-service
minReplicas: 2 # ์ต์ 2๊ฐ์ Pod ์ ์ง
maxReplicas: 10 # ์ต๋ 10๊ฐ์ Pod๊น์ง ํ์ฅ ๊ฐ๋ฅ
metrics:
- type: Object
object:
metric:
name: istio_requests_total # Istio์ ์ด๋น ์์ฒญ ์๋ฅผ ๊ธฐ์ค์ผ๋ก HPA ์ ์ฉ
describedObject:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
name: my-service
target:
type: AverageValue
value: 50 # ์ด๋น 50๊ฐ์ ์์ฒญ์ด ๋ฐ์ํ๋ฉด Pod ์๋ ํ์ฅ
์ค๋ช :
- minReplicas: 2, maxReplicas: 10 → ์ต์ 2๊ฐ, ์ต๋ 10๊ฐ์ Pod์ผ๋ก ์๋ ์กฐ์
- metric.name: istio_requests_total → Istio์ ์ด๋น ์์ฒญ ์(requests per second)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ผ์ผ๋ง
- target.value: 50 → ์ด๋น ์์ฒญ ์๊ฐ 50์ ๋์ผ๋ฉด Pod์ ์๋ ํ์ฅ
๐ก ํน์ ์๋น์ค์ ์์ฒญ๋์ด ์ฆ๊ฐํ๋ฉด HPA๊ฐ ์๋์ผ๋ก Pod์ ์ถ๊ฐ ์์ฑํ์ฌ ๋ถํ๋ฅผ ๋ถ์ฐํฉ๋๋ค.
โ 3.4 HPA ์ ์ฉ ํ ํ์ธํ๊ธฐ
HPA๊ฐ ์ ์์ ์ผ๋ก ์ ์ฉ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get hpa -n default
์ถ๋ ฅ ์์ :
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-service-hpa Deployment/my-service 35/50 2 10 3 5m
๐ก ํ์ฌ 35/50์ผ๋ก, ์ด๋น ์์ฒญ ์๊ฐ 35์ด๋ฏ๋ก ์์ง ํ์ฅ ์กฐ๊ฑด(50)์ ์ถฉ์กฑํ์ง ์์ Pod ์๋ 3๊ฐ์ ๋๋ค.
๐น 4. Istio ๋ฉํธ๋ฆญ ๊ธฐ๋ฐ HPA ์ค์ ์ ์ฉ ์ฌ๋ก
โ 4.1 ํน์ API ํธ๋ํฝ์ ๋ฐ๋ฅธ ํ์ฅ ์ ์ฉ
API ์๋ํฌ์ธํธ๋ณ๋ก ํธ๋ํฝ์ด ๋ค๋ฅด๋ค๋ฉด, ํน์ API ์์ฒญ๋์ ๊ธฐ์ค์ผ๋ก ์ค์ผ์ผ๋งํ ์๋ ์์ต๋๋ค.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: api-scaling
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-api-service
minReplicas: 2
maxReplicas: 20
metrics:
- type: Object
object:
metric:
name: istio_requests_total
describedObject:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
name: my-api-service
target:
type: AverageValue
value: 100
๐ก ํน์ API์ ํธ๋ํฝ์ด ์ด๋น 100 ์์ฒญ์ ๋์ผ๋ฉด Pod์ด ์๋ ํ์ฅ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- Kubernetes HPA(Horizontal Pod Autoscaler)๋ Pod์ ๋ถํ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅ/์ถ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฅํ์ง๋ง, Istio์ ํธ๋ํฝ ๋ฉํธ๋ฆญ์ ํ์ฉํ์ฌ ๋์ฑ ํจ๊ณผ์ ์ธ HPA๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- Prometheus Adapter๋ฅผ ์ค์นํ๋ฉด Istio์ istio_requests_total ๊ฐ์ ๋ฉํธ๋ฆญ์ HPA์ ๊ธฐ์ค์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- ํน์ ์๋น์ค ๋๋ ํน์ API ์์ฒญ๋์ ๊ธฐ์ค์ผ๋ก ํ์ฅ ์กฐ๊ฑด์ ์ค์ ํ์ฌ, ๋ ์ ๊ตํ ์คํ ์ค์ผ์ผ๋ง์ ์ ์ฉํ ์ ์์ต๋๋ค.