๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ 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 ๋ฆฌ์์ค ์ค์ ์ ์ ๊ฒํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.