Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.29] 4๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง #5 | Istio ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ ์ž๋™ ์Šค์ผ€์ผ๋ง (HPA)

ygtoken 2025. 3. 18. 12:10
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 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 ์š”์ฒญ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ํ™•์žฅ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์—ฌ, ๋” ์ •๊ตํ•œ ์˜คํ† ์Šค์ผ€์ผ๋ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

728x90