Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.32] 5๋ถ€ ์šด์˜ ๋ฐ ์ตœ์ ํ™” #2 | Sidecar Proxy ์ตœ์ ํ™”: ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ค„์ด๊ธฐ ์ „๋žต

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์˜ Sidecar Proxy(Envoy)์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ๊ฐ Pod์— Envoy ํ”„๋ก์‹œ๋ฅผ Sidecar๋กœ ์ฃผ์ž…ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ,
์„œ๋น„์Šค๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก Sidecar๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Envoy Sidecar์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•, ์„ค์ • ์ตœ์ ํ™” ๋ฐ ์‹ค์ „ ์ ์šฉ ์‚ฌ๋ก€๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Sidecar Proxy(Envoy)์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ๋ถ„์„

โœ… 1.1 Sidecar Proxy์˜ ์—ญํ• 

Sidecar Proxy(Envoy)๋Š” Istio์˜ ๋ฐ์ดํ„ฐ ํ”Œ๋ ˆ์ธ์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
๊ฐ Pod์— ์ž๋™์œผ๋กœ ์ฃผ์ž…๋˜๋ฉฐ, ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ํ”„๋ก์‹œํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Envoy Sidecar๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…

1๏ธโƒฃ ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ํ”„๋ก์‹œ ์—ญํ•  ์ˆ˜ํ–‰ (L4/L7 ๋ผ์šฐํŒ…)
2๏ธโƒฃ mTLS ์•”ํ˜ธํ™” ๋ฐ ์ธ์ฆ (๋ณด์•ˆ ๊ฐ•ํ™”)
3๏ธโƒฃ ํŠธ๋ž˜ํ”ฝ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
4๏ธโƒฃ ์„œ๋น„์Šค ๊ฐ„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ (Load Balancing)

๐Ÿ’ก Sidecar Proxy๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ชจ๋“  Pod์— ์ฃผ์ž…๋˜๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


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

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ Sidecar Proxy(Envoy)์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl top pod -n default

 

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME                        CPU(cores)   MEMORY(bytes)
my-app-56d7fbb85d-xyz12      50m          200Mi
my-app-56d7fbb85d-xyz12      100m         350Mi  # istio-proxy (Sidecar)

๐Ÿ’ก Sidecar(istio-proxy)์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณผ๋„ํ•˜๋ฉด ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Sidecar Proxy ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

โœ… 2.1 ๋ถˆํ•„์š”ํ•œ Sidecar ์ž๋™ ์ฃผ์ž… ๋ฐฉ์ง€

๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— Sidecar๋ฅผ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋งŒ Sidecar๊ฐ€ ์ฃผ์ž…๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

โ‘  ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋งŒ Sidecar ์ž๋™ ์ฃผ์ž… ํ™œ์„ฑํ™”

kubectl label namespace default istio-injection=enabled
kubectl label namespace kube-system istio-injection=disabled

โ‘ก ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋งŒ Sidecar ์ฃผ์ž… ์ ์šฉ

์•„๋ž˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ Pod์— ํŠน์ • ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด Sidecar ์ฃผ์ž…์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  namespace: default
  annotations:
    sidecar.istio.io/inject: "false"  # Sidecar ์ž๋™ ์ฃผ์ž… ๋น„ํ™œ์„ฑํ™”
spec:
  containers:
    - name: app
      image: my-app:v1

๐Ÿ’ก ๋ถˆํ•„์š”ํ•œ ์„œ๋น„์Šค์— Sidecar๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.2 Envoy Proxy์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์„ค์ •

Sidecar Proxy(Envoy)์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  template:
    spec:
      containers:
        - name: my-app
          image: my-app:v1
        - name: istio-proxy
          resources:
            requests:
              cpu: "100m"   # ์ตœ์†Œ 100m CPU ์š”์ฒญ
              memory: "256Mi" # ์ตœ์†Œ 256Mi ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ
            limits:
              cpu: "500m"  # ์ตœ๋Œ€ 500m CPU ์ œํ•œ
              memory: "512Mi" # ์ตœ๋Œ€ 512Mi ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

์„ค๋ช…:

  • requests.cpu: "100m" → ์ตœ์†Œ 100m(0.1 CPU)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
  • limits.cpu: "500m" → ์ตœ๋Œ€ 500m(0.5 CPU)๊นŒ์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • requests.memory: "256Mi" → ์ตœ์†Œ 256Mi ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ
  • limits.memory: "512Mi" → ์ตœ๋Œ€ 512Mi ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

๐Ÿ’ก Sidecar์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ณผ๋„ํ•œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.3 ํ•„ํ„ฐ๋ง์„ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ ๋กœ๊น… ๋ฐ์ดํ„ฐ ์ค„์ด๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ Envoy Proxy๋Š” ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ,
๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ด์ƒ ์—๋Ÿฌ ๋กœ๊ทธ๋งŒ ์ €์žฅ

์„ค๋ช…:

  • filter.expression: 'response.code >= 400' → HTTP ์‘๋‹ต ์ฝ”๋“œ 400 ์ด์ƒ๋งŒ ๋กœ๊ทธ ์ €์žฅ

๐Ÿ’ก ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ๋กœ๊น…ํ•˜๋Š” ๋Œ€์‹ , ์—๋Ÿฌ ๋กœ๊ทธ๋งŒ ์ €์žฅํ•˜๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.4 Keepalive ์„ค์ •์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์—ฐ๊ฒฐ ์œ ์ง€ ๋ฐฉ์ง€

Envoy Proxy๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€๋งŒ,
๋ถˆํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ์ค„์ด๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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  # ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ ์ˆ˜ ์ œํ•œ
        maxRequestsPerConnection: 3  # ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋‹น ์ตœ๋Œ€ ์š”์ฒญ ๊ฐœ์ˆ˜ ์ œํ•œ
      tcp:
        maxConnections: 50  # ์ตœ๋Œ€ TCP ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ
    outlierDetection:
      consecutiveErrors: 3  # ์˜ค๋ฅ˜๊ฐ€ 3ํšŒ ๋ฐœ์ƒํ•˜๋ฉด ์—ฐ๊ฒฐ ํ•ด์ œ
      interval: 5s  # ์˜ค๋ฅ˜ ๊ฐ์ง€ ์ฃผ๊ธฐ
      baseEjectionTime: 10s  # ์—ฐ๊ฒฐ ํ•ด์ œ ํ›„ ์žฌ์‹œ๋„ ์‹œ๊ฐ„

์„ค๋ช…:

  • http1MaxPendingRequests: 5 → HTTP ์š”์ฒญ ๋Œ€๊ธฐ์—ด์„ 5๊ฐœ๋กœ ์ œํ•œ
  • maxRequestsPerConnection: 3 → ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์—์„œ ์ตœ๋Œ€ 3๊ฐœ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • tcp.maxConnections: 50 → ์ตœ๋Œ€ 50๊ฐœ์˜ TCP ์—ฐ๊ฒฐ ์œ ์ง€
  • consecutiveErrors: 3 → 3๋ฒˆ ์—ฐ์† ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์—ฐ๊ฒฐ ์ฐจ๋‹จ

๐Ÿ’ก Envoy์˜ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • ๋ชจ๋“  ์„œ๋น„์Šค์— Sidecar๋ฅผ ์ž๋™ ์ฃผ์ž…ํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ์„œ๋น„์Šค์—๋งŒ ์ฃผ์ž…ํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Envoy Proxy์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋กœ๊น…์„ ์ค„์ด๋ฉด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํšจ๊ณผ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Keepalive ์„ค์ •์„ ์กฐ์ •ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90