Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.37] 6๋ถ€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… #2 | Envoy Proxy ์„ค์ • ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ Envoy Proxy์˜ ์„ค์ • ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Envoy Proxy๋Š” Istio ๋ฐ์ดํ„ฐ ํ”Œ๋ ˆ์ธ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ,
์ž˜๋ชป๋œ ์„ค์ •์ด ์ ์šฉ๋˜๋ฉด ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ์žฅ์• , ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ์˜ค๋ฅ˜, ๋†’์€ ์ง€์—ฐ ์‹œ๊ฐ„ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


๐Ÿ”น 1. Envoy Proxy์˜ ์ฃผ์š” ์˜ค๋ฅ˜ ์œ ํ˜•

 

์˜ค๋ฅ˜ ์œ ํ˜• ์„ค๋ช…
503 ์˜ค๋ฅ˜ (Service Unavailable) Envoy๊ฐ€ ๋Œ€์ƒ ์„œ๋น„์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
404 ์˜ค๋ฅ˜ (Not Found) Envoy๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ VirtualService ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
Envoy ์„ค์ • ๋ฐ˜์˜ ์‹คํŒจ Istio ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(istiod)๊ณผ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐœ์ƒ
์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ (Timeout) Envoy๊ฐ€ ๋Œ€์ƒ ์„œ๋น„์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
๋†’์€ ๋ ˆ์ดํ„ด์‹œ (High Latency) Envoy ์„ค์ •์ด ๋น„ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ

๐Ÿ’ก Envoy์˜ ์„ค์ • ์˜ค๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Envoy Proxy ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•

โœ… 2.1 VirtualService ๋ฐ DestinationRule ์„ค์ • ํ™•์ธ

Envoy Proxy๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ผ์šฐํŒ…ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, VirtualService์™€ DestinationRule ์„ค์ •์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

VirtualService ์„ค์ • ํ™•์ธ

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
  namespace: default
spec:
  hosts:
    - my-service.default.svc.cluster.local  # ์ด VirtualService๊ฐ€ ์ ์šฉ๋  ์„œ๋น„์Šค
  http:
    - match:
        - uri:
            prefix: /api/v1  # /api/v1 ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
      route:
        - destination:
            host: my-service  # ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ ๋Œ€์ƒ ์„œ๋น„์Šค
            subset: v1  # DestinationRule์—์„œ ์ •์˜ํ•œ v1 ์„œ๋ธŒ์…‹์œผ๋กœ ์ „๋‹ฌ

๐Ÿ”น ํ™•์ธํ•  ์‚ฌํ•ญ:

  • hosts์— ์˜ฌ๋ฐ”๋ฅธ ์„œ๋น„์Šค ์ด๋ฆ„์ด ์žˆ๋Š”์ง€ ํ™•์ธ
  • match.uri.prefix๊ฐ€ ์š”์ฒญ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
  • destination.host๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์„œ๋น„์Šค์ธ์ง€ ์ ๊ฒ€

DestinationRule ์„ค์ • ํ™•์ธ

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local  # ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•  ์„œ๋น„์Šค
  subsets:
    - name: v1  # VirtualService์—์„œ ์ฐธ์กฐํ•  ์„œ๋ธŒ์…‹ v1
      labels:
        version: v1  # version=v1 ๋ ˆ์ด๋ธ”์ด ๋ถ™์€ Pod์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ
    - name: v2  # ์ถ”๊ฐ€ ์„œ๋ธŒ์…‹ v2 (ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
      labels:
        version: v2  # version=v2 ๋ ˆ์ด๋ธ”์ด ๋ถ™์€ Pod์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ

๐Ÿ”น ํ™•์ธํ•  ์‚ฌํ•ญ:

  • host๊ฐ€ VirtualService์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
  • subsets์˜ name์ด VirtualService์—์„œ ์ฐธ์กฐํ•˜๋Š” subset๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
  • labels.version์ด ์‹ค์ œ Pod์˜ ๋ ˆ์ด๋ธ”๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ

โœ… 2.2 Envoy Proxy์˜ ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ

Envoy Proxy๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods -n default | grep istio-proxy

 

์ถœ๋ ฅ ์˜ˆ์ œ:

my-app-xyz123   2/2     Running   0     5m

๐Ÿ’ก 2/2 Running ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ , Proxy๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โœ… 2.3 Envoy Proxy์˜ ๋„คํŠธ์›Œํฌ ํ๋ฆ„ ํ™•์ธ

Envoy Proxy์˜ ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

istioctl proxy-status

 

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME                                    CDS        LDS        EDS        RDS        VERSION
my-app-123456-abc.default               SYNCED     SYNCED    SYNCED     SYNCED     1.17.0

๐Ÿ’ก SYNCED ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(istiod)๊ณผ ์ •์ƒ์ ์œผ๋กœ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 3. Envoy Proxy ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‹ค์ „ ์˜ˆ์ œ

โœ… 3.1 503 ์˜ค๋ฅ˜ (Service Unavailable) ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • DestinationRule์—์„œ ์„œ๋ธŒ์…‹ ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
  • Pod์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ

์˜ฌ๋ฐ”๋ฅธ DestinationRule ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  subsets:
    - name: v1
      labels:
        version: v1  # version=v1 ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ Pod๋งŒ ์„ ํƒ

์˜ฌ๋ฐ”๋ฅธ Pod ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ

kubectl get pods -l version=v1 -n default

 

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME            READY   STATUS    RESTARTS   AGE
my-service-v1   1/1     Running   0          5m

โœ… 3.2 404 ์˜ค๋ฅ˜ (Not Found) ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • VirtualService์˜ prefix ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
  • Envoy Proxy์˜ ๋ผ์šฐํŒ… ์ •๋ณด ํ™•์ธ

์˜ฌ๋ฐ”๋ฅธ VirtualService ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
  namespace: default
spec:
  hosts:
    - my-service.default.svc.cluster.local
  http:
    - match:
        - uri:
            prefix: /api/v1  # /api/v1 ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌ
      route:
        - destination:
            host: my-service
            subset: v1

Envoy Proxy์˜ ๋ผ์šฐํŒ… ์ •๋ณด ํ™•์ธ

istioctl proxy-config routes <pod-name> -n default

 

์ถœ๋ ฅ ์˜ˆ์ œ:

prefix: /api/v1
cluster: outbound|80||my-service.default.svc.cluster.local

โœ… 3.3 ๋„คํŠธ์›Œํฌ ์ง€์—ฐ(Latency) ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

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

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


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Envoy Proxy ์„ค์ • ์˜ค๋ฅ˜๋Š” ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์†ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 503 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DestinationRule๊ณผ ๋Œ€์ƒ Pod์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 404 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด VirtualService์˜ prefix ์„ค์ •์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Connection Pool ๋ฐ Keepalive ์„ค์ •์„ ์ตœ์ ํ™”ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90