Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.28] 4๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง #4 | Envoy Proxy ๋กœ๊ทธ ๋ถ„์„ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‹ค์Šต

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ Envoy Proxy ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ์„œ๋น„์Šค ๋ฉ”์‹œ ๋‚ด๋ถ€์—์„œ Envoy ํ”„๋ก์‹œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ,
Envoy ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ, ์š”์ฒญ ์ง€์—ฐ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์›์ธ์„ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Envoy Proxy์˜ ์ฃผ์š” ๋กœ๊ทธ ์œ ํ˜•, ๋กœ๊ทธ ๋ถ„์„ ๋ฐฉ๋ฒ•, ์‹ค์ „ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์˜ˆ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Envoy Proxy ๋กœ๊ทธ๋ž€?

โœ… 1.1 Envoy Proxy๋ž€?

Envoy Proxy๋Š” Istio์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์„œ๋น„์Šค ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค.
๊ฐ Pod์— Sidecar ํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋˜๋ฉฐ, ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด Envoy๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

Envoy Proxy์˜ ์—ญํ• 

  • ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋ฐ ๋ถ€ํ•˜ ๋ถ„์‚ฐ
  • mTLS๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ๋ฐ ์•”ํ˜ธํ™” ์ ์šฉ
  • ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ ๋ฐ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘
  • ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๊ฐ์ง€ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ง€์›

๐Ÿ’ก Istio์—์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Envoy ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.


โœ… 1.2 Envoy Proxy ๋กœ๊ทธ ์œ ํ˜•

Envoy Proxy๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜•์˜ ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ ์œ ํ˜• ์„ค๋ช…
Access Log ์„œ๋น„์Šค ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋กœ๊ทธ (HTTP, gRPC, TCP ์š”์ฒญ ์ •๋ณด)
Admin Log Envoy ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ถ€ ๋กœ๊ทธ
Error Log ์š”์ฒญ ์‹คํŒจ ๋ฐ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๊ธฐ๋ก๋˜๋Š” ๋กœ๊ทธ
Trace Log ์š”์ฒญ ๊ฒฝ๋กœ ๋ฐ ์„œ๋น„์Šค ํ˜ธ์ถœ ํ๋ฆ„ ์ถ”์  (Jaeger, Zipkin ์—ฐ๋™ ๊ฐ€๋Šฅ)

๐Ÿ’ก Access Log์™€ Error Log๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์ƒํƒœ ๋ฐ ์˜ค๋ฅ˜ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 2. Envoy Proxy ๋กœ๊ทธ ๋ถ„์„ ๋ฐฉ๋ฒ•

โœ… 2.1 Envoy Access Log ์„ค์ • ํ™•์ธ

Istio์—์„œ Envoy Access Log๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get configmap istio -n istio-system -o yaml | grep accessLogFile

 

์ถœ๋ ฅ ์˜ˆ์ œ:

accessLogFile: "/dev/stdout"

๐Ÿ’ก Access Log๊ฐ€ /dev/stdout์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, kubectl logs ๋ช…๋ น์–ด๋กœ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.2 ํŠน์ • Pod์˜ Envoy Proxy ๋กœ๊ทธ ํ™•์ธ

Envoy Proxy ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด, ํ•ด๋‹น Pod์˜ Sidecar ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kubectl logs <pod-name> -c istio-proxy -n <namespace>

 

์˜ˆ์ œ:

kubectl logs my-app-pod -c istio-proxy -n default

 

์ถœ๋ ฅ ์˜ˆ์ œ:

[2024-03-16T12:34:56.123Z] "GET /api/data HTTP/1.1" 200 - upstream_service_time=20ms
[2024-03-16T12:35:02.456Z] "POST /api/login HTTP/1.1" 401 - upstream_service_time=10ms

๐Ÿ’ก ์‘๋‹ต ์ฝ”๋“œ(200, 401) ๋ฐ ์„œ๋น„์Šค ์‘๋‹ต ์‹œ๊ฐ„(upstream_service_time)์„ ๋ถ„์„ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.3 Envoy Proxy Admin ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉํ•˜๊ธฐ

Envoy Proxy์˜ ์ƒํƒœ ๋ฐ ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด Admin API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ํŠน์ • Pod์˜ Envoy Admin API์— ์ ‘๊ทผ

kubectl port-forward <pod-name> -n <namespace> 15000:15000

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:15000 ์— ์ ‘์†ํ•˜๋ฉด Envoy์˜ ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘ก Envoy์˜ ํ˜„์žฌ ์„ค์ • ํ™•์ธ

curl http://localhost:15000/config_dump

โ‘ข Envoy์˜ ํ™œ์„ฑ ๋ผ์šฐํŠธ ์ •๋ณด ์กฐํšŒ

curl http://localhost:15000/routes

๐Ÿ’ก Admin API๋ฅผ ํ™œ์šฉํ•˜๋ฉด Envoy Proxy์˜ ๋„คํŠธ์›Œํฌ ์„ค์ • ๋ฐ ๋ผ์šฐํŒ… ์ƒํƒœ๋ฅผ ์ƒ์„ธํžˆ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


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

โœ… 3.1 ํŠธ๋ž˜ํ”ฝ์ด ํŠน์ • ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Envoy์˜ ๋ผ์šฐํŒ… ์„ค์ •์„ ํ™•์ธํ•˜๊ณ , DestinationRule์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  ํŠน์ • ์„œ๋น„์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธ

kubectl logs <pod-name> -c istio-proxy -n <namespace> | grep "GET /api/data"

โ‘ก DestinationRule์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL

๐Ÿ’ก DestinationRule์—์„œ tls.mode: ISTIO_MUTUAL์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด, mTLS ํ™œ์„ฑํ™”๋œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 3.2 ํŠน์ • ์š”์ฒญ์ด 503(Service Unavailable) ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Envoy Proxy ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  503 ์˜ค๋ฅ˜ ๋กœ๊ทธ ํ™•์ธ

kubectl logs <pod-name> -c istio-proxy -n <namespace> | grep "503"

 

์ถœ๋ ฅ ์˜ˆ์ œ:

[2024-03-16T12:40:00.789Z] "GET /api/data HTTP/1.1" 503 - upstream_reset_before_response_started{connection_termination}

โ‘ก ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ

kubectl get pods -n default

๐Ÿ’ก 503 ์˜ค๋ฅ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ๋น„์ •์ƒ ์ƒํƒœ์ด๊ฑฐ๋‚˜, DestinationRule ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


โœ… 3.3 ์„œ๋น„์Šค ๊ฐ„ ์š”์ฒญ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ๊ฒฝ์šฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Envoy Proxy์˜ upstream_service_time ๊ฐ’์„ ๋ถ„์„ํ•˜์—ฌ ์ง€์—ฐ ์›์ธ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

โ‘  ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ธด ์š”์ฒญ ํ•„ํ„ฐ๋ง

kubectl logs <pod-name> -c istio-proxy -n <namespace> | grep "upstream_service_time"

 

์ถœ๋ ฅ ์˜ˆ์ œ:

[2024-03-16T12:50:00.123Z] "GET /api/orders HTTP/1.1" 200 - upstream_service_time=1500ms

๐Ÿ’ก upstream_service_time=1500ms → ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด 1.5์ดˆ๋กœ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•„์š”


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Envoy Proxy ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ์„œ๋น„์Šค ๋ฉ”์‹œ ๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Access Log๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ ์ƒํƒœ, ์‘๋‹ต ์ฝ”๋“œ ๋ฐ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Envoy Admin API๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์„ค์ • ๋ฐ ๋ผ์šฐํŒ… ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 503 ์˜ค๋ฅ˜, ํŠธ๋ž˜ํ”ฝ ๋ˆ„๋ฝ, ์„ฑ๋Šฅ ์ €ํ•˜ ๋“ฑ์˜ ๋ฌธ์ œ๋Š” Envoy ๋กœ๊ทธ ๋ฐ Istio ๋ฆฌ์†Œ์Šค ์„ค์ •์„ ์ ๊ฒ€ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90