๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ 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 ๋ด๋ถ์์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ
- ๋ฆฌํธ๋ผ์ด ๋ฐ ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์กฐํฉํ์ฌ ์ฅ์ ๋ฐ์ ์ ์๋์ผ๋ก ๋ณต๊ตฌํ ์ ์๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ