Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.15] 2๋ถ€ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ #9 | Istio์—์„œ TCP, gRPC ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio๋ฅผ ํ™œ์šฉํ•˜์—ฌ TCP ๋ฐ gRPC ํŠธ๋ž˜ํ”ฝ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ HTTP ํŠธ๋ž˜ํ”ฝ ์™ธ์—๋„ TCP ๋ฐ gRPC ํ†ต์‹ ์„ ์ œ์–ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ์ด๋Ÿฌํ•œ ํŠธ๋ž˜ํ”ฝ์„ VirtualService, DestinationRule, Gateway๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” TCP ๋ฐ gRPC ํŠธ๋ž˜ํ”ฝ์˜ ๊ฐœ๋…, Istio์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•,
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ YAML ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. TCP ๋ฐ gRPC ํŠธ๋ž˜ํ”ฝ ๊ฐœ๋…

โœ… 1.1 TCP ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ๋ž€?

TCP ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ, ์›๊ฒฉ ์„œ๋น„์Šค ๋“ฑ)์€ HTTP ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ์„ธ์…˜์„ ์œ ์ง€ํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ TCP ํŠธ๋ž˜ํ”ฝ๋„ Istio์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ํƒ€์ž„์•„์›ƒ, ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Istio์—์„œ TCP ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ

  • TCP ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
  • TLS๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ํ†ต์‹  ์ง€์›
  • TCP ๊ธฐ๋ฐ˜์˜ ์„œ๋น„์Šค(์˜ˆ: Redis, MySQL, Kafka)์™€์˜ ํ†ตํ•ฉ ๊ฐ€๋Šฅ

โœ… 1.2 gRPC ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ๋ž€?

**gRPC(Google Remote Procedure Call)**๋Š” HTTP/2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ณ ์„ฑ๋Šฅ RPC(Remote Procedure Call) ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
Istio๋Š” gRPC ํŠธ๋ž˜ํ”ฝ์„ HTTP์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
์„ธ๋ฐ€ํ•œ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด, ๋ฆฌํŠธ๋ผ์ด, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ๋ณด์•ˆ ๊ธฐ๋Šฅ ๋“ฑ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Istio์—์„œ gRPC ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ

  • gRPC ์š”์ฒญ์„ HTTP์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • VirtualService๋ฅผ ํ™œ์šฉํ•˜์—ฌ gRPC ํŠธ๋ž˜ํ”ฝ์„ ํŠน์ • ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…
  • ๋ฆฌํŠธ๋ผ์ด, ํƒ€์ž„์•„์›ƒ, ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์„ค์ • ๊ฐ€๋Šฅ

๐Ÿ”น 2. Istio TCP ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

โœ… 2.1 TCP ํŠธ๋ž˜ํ”ฝ์„ ์œ„ํ•œ DestinationRule ์„ค์ •

์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” TCP ํŠธ๋ž˜ํ”ฝ์„ ํŠน์ • ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” DestinationRule์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tcp-service
spec:
  host: my-tcp-service  # TCP ์„œ๋น„์Šค ๋Œ€์ƒ
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100  # ์ตœ๋Œ€ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ
      http:
        maxRequestsPerConnection: 1  # HTTP ์—ฐ๊ฒฐ๋‹น ์š”์ฒญ ๊ฐœ์ˆ˜ ์ œํ•œ
    outlierDetection:
      consecutive5xxErrors: 3  # 5xx ์˜ค๋ฅ˜๊ฐ€ 3๋ฒˆ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐ
      interval: 10s  # ์˜ค๋ฅ˜ ๊ฐ์ง€ ์ฃผ๊ธฐ (10์ดˆ)
      baseEjectionTime: 30s  # ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํ™œ์„ฑํ™” ํ›„ 30์ดˆ ๋™์•ˆ ์ฐจ๋‹จ

์„ค๋ช…:

  • trafficPolicy.connectionPool.tcp.maxConnections: 100 → ์ตœ๋Œ€ ๋™์‹œ ์—ฐ๊ฒฐ 100๊ฐœ๊นŒ์ง€ ํ—ˆ์šฉ
  • outlierDetection.consecutive5xxErrors: 3 → 3๋ฒˆ ์—ฐ์† 5xx ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค ์ œ๊ฑฐ
  • baseEjectionTime: 30s → ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์„œ๋น„์Šค๋Š” 30์ดˆ ๋™์•ˆ ์ฐจ๋‹จ๋จ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • TCP ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค(์˜ˆ: MySQL, Redis)์˜ ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ
  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ์ž๋™ ์ฐจ๋‹จ

โœ… 2.2 TCP ํŠธ๋ž˜ํ”ฝ์„ ์œ„ํ•œ VirtualService ์„ค์ •

์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” ํŠน์ • ํฌํŠธ(3306, MySQL)์—์„œ TCP ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” VirtualService๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tcp-service
spec:
  hosts:
    - my-tcp-service
  tcp:
    - match:
        - port: 3306  # MySQL ํฌํŠธ์—์„œ TCP ํŠธ๋ž˜ํ”ฝ ์ˆ˜์‹ 
      route:
        - destination:
            host: my-tcp-service
            port:
              number: 3306

์„ค๋ช…:

  • tcp.match.port: 3306 → MySQL์˜ ๊ธฐ๋ณธ ํฌํŠธ(3306)์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ 
  • route.destination.host: my-tcp-service → ํŠธ๋ž˜ํ”ฝ์„ ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • TCP ์„œ๋น„์Šค(MySQL, Redis, Kafka ๋“ฑ)๋ฅผ Istio ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ

๐Ÿ”น 3. Istio gRPC ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

โœ… 3.1 gRPC ํŠธ๋ž˜ํ”ฝ์„ ์œ„ํ•œ VirtualService ์„ค์ •

์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” gRPC ์š”์ฒญ์„ ํŠน์ • ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” VirtualService๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grpc-service
spec:
  hosts:
    - my-grpc-service
  http:
    - match:
        - uri:
            prefix: "/grpc"  # "/grpc"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
      route:
        - destination:
            host: my-grpc-service
            port:
              number: 50051  # gRPC ๊ธฐ๋ณธ ํฌํŠธ

์„ค๋ช…:

  • match.uri.prefix: "/grpc" → ๋ชจ๋“  gRPC ์š”์ฒญ์„ ํŠน์ • ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…
  • destination.port.number: 50051 → gRPC ์„œ๋น„์Šค์˜ ๊ธฐ๋ณธ ํฌํŠธ(50051)๋กœ ์ „๋‹ฌ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • Istio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gRPC ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด
  • ํŠน์ • gRPC ๋ฉ”์„œ๋“œ(API ์—”๋“œํฌ์ธํŠธ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฐฐ

โœ… 3.2 gRPC ์š”์ฒญ์˜ ๋ฆฌํŠธ๋ผ์ด ์„ค์ •

์•„๋ž˜ ์„ค์ •์€ gRPC ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ์ตœ๋Œ€ 3ํšŒ ์žฌ์‹œ๋„ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grpc-service
spec:
  hosts:
    - my-grpc-service
  http:
    - route:
        - destination:
            host: my-grpc-service
      retries:
        attempts: 3  # ์ตœ๋Œ€ 3๋ฒˆ๊นŒ์ง€ ์žฌ์‹œ๋„
        perTryTimeout: 2s  # ๊ฐ ์š”์ฒญ๋‹น ์ตœ๋Œ€ 2์ดˆ ๋Œ€๊ธฐ
        retryOn: "cancelled,unavailable,resource-exhausted"  # ํŠน์ • gRPC ์˜ค๋ฅ˜ ์‹œ ์žฌ์‹œ๋„

์„ค๋ช…:

  • retries.attempts: 3 → ์ตœ๋Œ€ 3๋ฒˆ๊นŒ์ง€ ์žฌ์‹œ๋„
  • retries.perTryTimeout: 2s → ๊ฐ ์š”์ฒญ๋‹น ์ตœ๋Œ€ 2์ดˆ ๋™์•ˆ ๋Œ€๊ธฐ
  • retryOn: "cancelled,unavailable,resource-exhausted"
    gRPC ์˜ค๋ฅ˜(cancelled, unavailable, resource-exhausted) ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ๋„ ์ˆ˜ํ–‰

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • gRPC ์„œ๋ฒ„ ์žฅ์•  ์‹œ ์ž๋™ ์žฌ์‹œ๋„๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€

๐Ÿ“Œ ๊ฒฐ๋ก 

  • TCP ํŠธ๋ž˜ํ”ฝ์€ VirtualService ๋ฐ DestinationRule์„ ํ™œ์šฉํ•˜์—ฌ ํฌํŠธ๋ณ„ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋ฐ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์ ์šฉ ๊ฐ€๋Šฅ
  • gRPC ํŠธ๋ž˜ํ”ฝ์€ HTTP์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ธ๋ฐ€ํ•œ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ๋ฐ ๋ฆฌํŠธ๋ผ์ด ์„ค์ • ๊ฐ€๋Šฅ
  • TCP ์„œ๋น„์Šค(MySQL, Redis, Kafka ๋“ฑ) ๋ฐ gRPC API๋ฅผ Istio ๋‚ด๋ถ€์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ๋ฆฌํŠธ๋ผ์ด ๋ฐ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ ๊ฐ€๋Šฅ



728x90