Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.39] 6๋ถ€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… #4 | ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ ํ•ด๊ฒฐ

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ์„œ๋น„์Šค ๋ฉ”์‹œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ž˜๋ชป๋œ ์„ค์ • ๋˜๋Š” ๊ณผ๋„ํ•œ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ๋†’์€ ๋ ˆ์ดํ„ด์‹œ(Latency), ํŒจํ‚ท ์†์‹ค(Packet Loss), ์š”์ฒญ ํƒ€์ž„์•„์›ƒ(Request Timeout) ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ์˜ ์ฃผ์š” ์›์ธ, ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ• ๋ฐ ํ•ด๊ฒฐ์ฑ…์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Istio ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ €ํ•˜ ์›์ธ

 

๋ฌธ์ œ ์œ ํ˜• ์„ค๋ช…
๋†’์€ ๋ ˆ์ดํ„ด์‹œ (Latency ์ฆ๊ฐ€) ๊ณผ๋„ํ•œ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง, ์ž˜๋ชป๋œ ์„ค์ •์œผ๋กœ ์ธํ•ด ์‘๋‹ต ์‹œ๊ฐ„์ด ์ฆ๊ฐ€
ํŒจํ‚ท ์†์‹ค (Packet Loss) ๋„คํŠธ์›Œํฌ ํ˜ผ์žก ๋˜๋Š” Envoy Proxy์˜ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ํŒจํ‚ท ์†์‹ค ๋ฐœ์ƒ
ํƒ€์ž„์•„์›ƒ (Timeout ์˜ค๋ฅ˜ ๋ฐœ์ƒ) ์š”์ฒญ์ด ์‹œ๊ฐ„ ๋‚ด์— ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
CPU ์‚ฌ์šฉ๋Ÿ‰ ๊ณผ๋‹ค (๋†’์€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ) Envoy Proxy๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋จ
๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊น… (Logging Overhead) ๊ณผ๋„ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊น…์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜

๐Ÿ’ก Istio์˜ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, Envoy Proxy ๋ฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Istio ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•

โœ… 2.1 ํ˜„์žฌ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ์ ๊ฒ€

Istio์—์„œ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๋ ค๋ฉด Kiali, Prometheus, Jaeger ๋“ฑ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) Kiali๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„ ๋„คํŠธ์›Œํฌ ํ๋ฆ„ ํ™•์ธ

kubectl port-forward svc/kiali -n istio-system 20001:20001
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:20001์— ์ ‘์†ํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ํ๋ฆ„์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2) Prometheus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ(Latency) ๋ชจ๋‹ˆํ„ฐ๋ง

kubectl port-forward svc/prometheus -n istio-system 9090:9090
  • istio_request_duration_milliseconds ๋ฉ”ํŠธ๋ฆญ์„ ํ™•์ธํ•˜์—ฌ ์„œ๋น„์Šค ์‘๋‹ต ์†๋„๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3) Jaeger๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ํŠธ๋ ˆ์ด์‹ฑ ํ™•์ธ

kubectl port-forward svc/jaeger-query -n istio-system 16686:16686
  • http://localhost:16686์—์„œ ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„์„ ๋ถ„์„ํ•˜์—ฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก Kiali, Prometheus, Jaeger๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.2 Envoy Proxy์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, Envoy Proxy๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ์ธ์ง€ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kubectl top pod -n default

 

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME                        CPU(cores)   MEMORY(bytes)
my-app-56d7fbb85d-xyz12      50m          200Mi
istio-proxy                 500m         800Mi

๐Ÿ’ก istio-proxy์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์€ ๊ฒฝ์šฐ, ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 3. ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

โœ… 3.1 Connection Pool ๋ฐ Keepalive ์„ค์ • ์ตœ์ ํ™”

์ž˜๋ชป๋œ ๋„คํŠธ์›Œํฌ ์„ค์ •์œผ๋กœ ์ธํ•ด ๋ถˆํ•„์š”ํ•œ ์—ฐ๊ฒฐ์ด ์œ ์ง€๋˜๊ฑฐ๋‚˜, ๊ณผ๋„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์†Œ๋น„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Connection Pool ๋ฐ Keepalive ์„ค์ •์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™”๋œ DestinationRule ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 5  # HTTP ์š”์ฒญ ๋Œ€๊ธฐ์—ด์„ 5๊ฐœ๋กœ ์ œํ•œ
        maxRequestsPerConnection: 3  # ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์ฒ˜๋ฆฌํ•  ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜ ์ œํ•œ
      tcp:
        maxConnections: 50  # TCP ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ
    outlierDetection:
      consecutiveErrors: 3  # 3ํšŒ ์—ฐ์† ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ์—ฐ๊ฒฐ ํ•ด์ œ
      interval: 5s  # ์˜ค๋ฅ˜ ๊ฐ์ง€ ๊ฐ„๊ฒฉ
      baseEjectionTime: 10s  # ์—ฐ๊ฒฐ ํ•ด์ œ ํ›„ ์žฌ์‹œ๋„ ๋Œ€๊ธฐ ์‹œ๊ฐ„

๐Ÿ’ก Connection Pool ์„ค์ •์„ ์ตœ์ ํ™”ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 3.2 ํŠธ๋ž˜ํ”ฝ ์••์ถ•(Compression) ํ™œ์„ฑํ™”

Envoy Proxy์—์„œ ํŠธ๋ž˜ํ”ฝ ์••์ถ•์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Envoy ํ•„ํ„ฐ ์„ค์ • ์ถ”๊ฐ€

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: compression-filter
  namespace: istio-system
spec:
  configPatches:
    - applyTo: NETWORK_FILTER
      match:
        context: ANY
      patch:
        operation: ADD
        value:
          name: envoy.filters.http.compressor
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
            response_direction_config:
              common_config:
                enabled: true

๐Ÿ’ก ์••์ถ• ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 3.3 ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊น… ์ค„์ด๊ธฐ

๊ณผ๋„ํ•œ ๋กœ๊น…์€ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•„์š”ํ•œ ์š”์ฒญ๋งŒ ๋กœ๊น…ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ํ•„ํ„ฐ๋ง

apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: access-logs
  namespace: istio-system
spec:
  accessLogging:
    providers:
      - name: envoy
    filter:
      expression: 'response.code >= 400'  # HTTP 400 ์ด์ƒ ์—๋Ÿฌ ๋กœ๊ทธ๋งŒ ์ €์žฅ

๐Ÿ’ก ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์ค„์ด๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 3.4 HPA๋ฅผ ํ™œ์šฉํ•œ Envoy Proxy ์˜คํ† ์Šค์ผ€์ผ๋ง

๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด Envoy Proxy๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Horizontal Pod Autoscaler(HPA)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ํ™•์žฅ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Envoy Proxy HPA ์„ค์ •

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: istio-proxy-hpa
  namespace: istio-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: istio-proxy
  minReplicas: 2  # ์ตœ์†Œ 2๊ฐœ์˜ Envoy Proxy ์œ ์ง€
  maxReplicas: 5  # ์ตœ๋Œ€ 5๊ฐœ์˜ Envoy Proxy ํ™•์žฅ
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70  # CPU ์‚ฌ์šฉ๋Ÿ‰์ด 70%๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ž๋™ ํ™•์žฅ

๐Ÿ’ก HPA๋ฅผ ์ ์šฉํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ ๋ถ€ํ•˜์— ๋”ฐ๋ผ Envoy Proxy๊ฐ€ ์ž๋™ ํ™•์žฅ๋˜์–ด ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ €ํ•˜๋Š” Connection Pool, Keepalive ๋ฐ ํŠธ๋ž˜ํ”ฝ ์••์ถ•์„ ์ตœ์ ํ™”ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณผ๋„ํ•œ ๋กœ๊น…์€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • HPA๋ฅผ ํ™œ์šฉํ•˜์—ฌ Envoy Proxy๋ฅผ ์ž๋™ ํ™•์žฅํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Prometheus, Kiali ๋ฐ Jaeger๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90