Istio Distributed Tracing with Jaeger
์๊ฑฐ๋ง์ด์คํฐ, ํ๋ธํฅ์ด ๋๋ ๋ฆฌํ๋ฅด. ์๊ฑฐ๋ฐค์ผ๋ก ํด์ ๋จน์ผ๋ฉด ๋ง์๋ค!
โDistributed Tracing(๋ถ์ฐ ์ถ์ )โ์ด๋ ๋ถ์ฐ ์์คํ ์์ ์์ฒญ์ด ์์คํ ์ ๋ค์ํ ์๋น์ค๋ฅผ ๊ฑฐ์น๋ฉฐ ์งํ๋ ๋, ์์ฒญ์ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๊ณ ์๊ฐํ ํ๋ ๊ธฐ์ ์ ๋งํ๋ค.
Tracing์ ํตํด MSA ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋ ๋ณต์กํ ๋ถ์ฐ ์์คํ ์ด ์๋ก ์ด๋ป๊ฒ ์ฐ๊ฒฐ ๋์ด ์๋์ง ํ์ ํ๊ณ , ์์ฒญ์ ๋๋ฒ๊ทธ ํ๋๋ฐ์ ๋์์ด ๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ โJaeger(์๊ฑฐ)โ๋ผ๋ Tracing ๋๊ตฌ๋ฅผ ์ฌ์ฉํด Istio์ ๋ถ์ฐ ์ถ์ ์ ๋ํด ์ดํด๋ณด๊ณ ์ ํ๋ค. ์ ์ฒด์ ์ธ ๊ณผ์ ์ Istio ๋ฌธ์์ Jeager ์์ ๋ฅผ ๋ฐ๋ผํ ๊ฒ์์ ๋ฐํ๋ค.
์ฌ์ ์ค๋น
Tracing์ ์ ์ดํด๋ณด๊ธฐ ์ํด MSA ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๋์ฐ์. Istio ์์ ์ธ โbookinfoโ๋ฅผ ๋์ด๋ค. (์์ ํธ์ฆ์จ์ ์์ ์ ์จ๋ ํฌ์คํธ ์ฐธ๊ณ .)
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/platform/kube/bookinfo.yaml
์์ฒญ์ pod์ ์ ์ํด ์๋ ๋ช ๋ น์ด๋ก ๋ณด๋ผ ์๋ ์๊ณ ,
$ k exec -it ... -- sh
~ $ for i in $(seq 1 100); do curl -s -o /dev/null "http://productpage.default.svc.cluster.local:9080/productpage"; done
Istio Gateway
์ VirtualService
๋ฅผ ๋์์ External IP๋ก ์์ฒญ์ ๋ณด๋ผ ์๋ ์๋ค.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/bookinfo-gateway.yaml
$ sh
sh-3.2$ for i in $(seq 1 100); do curl -s -o /dev/null "http://192.168.64.2/productpage"; done
์์ฒญ์ 100๋ฒ์ฉ ๋ฐ๋ณตํด์ ๋ณด๋ด๋ ์ด์ ๋ istio์ Trace Samping Rate ๋๋ฌธ์ด๋ค. istio ํด๋ฌ์คํฐ๋ฅผ ๋์ธ ๋ ๋ฐ๋ก ์ค์ ํด์ฃผ์ง ์์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 1%์ ํธ๋ํฝ๋ง์ ์ํ๋ง ํ๊ฒ ๋๋ค. ๊ทธ๋์ ์ต์ 100๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ ๊ฒ!
Jaeger Addon ๋์ฐ๊ธฐ
Istio์ ๋ค๋ฅธ addon์ธ โPrometheusโ, โKialiโ๋ฅผ ๋์ธ ๋ ํ๋ ๊ฒ์ฒ๋ผ istio์์ ์ ๊ณตํ๋ addon sample ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ Jeager๋ฅผ ๋์ธ ์ ์๋ค.
$ kubectl apply \
-f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/jaeger.yaml
Jaeger๋ฅผ ๋์ฐ๊ณ ๋๋ฉด, istio์๊ฒ ์์ผ๋ก ์ ์ฃผ์๋ก tracing ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ผ๊ณ ๋ช ์ํด์ค์ผ ํ๋ค.
istioctl \
--set meshConfig.defaultConfig.tracing.zipkin.address=zipkin.istio-system.svc.cluster.local:9411
(์ Jaeger์ธ๋ฐ, zipkin ํ๋์ ์ค์ ํ๋์ง ๋นํฉํ๋ ๋ถ๋ถ์ด๋ค. istio ์ค๋ช ์ ๋ฐ๋ฅด๋ฉด Jaeger๊ฐ zipkin์ ํฌ๋งท์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค ใ ใ ใ )
์ด์ Jaeger ๋์๋ณด๋์ ์ ์ ํด๋ณด์! istioctl
๋ก ์์ฝ๊ฒ ๊ฐ๋ฅํ๋ค.
$ istioctl dashboard jaeger
๊ทธ๋ฆฌ๊ณ ์์ ๋ฐฉ์๋๋ก 100๋ฒ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์ด๋ ๊ฒ ๋ด๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ๊ทธ ํ๋ฆ์ ๊ฐํธ ์ฐจํธ ๋๋์ผ๋ก ํ์ธํ ์ ์๋ค!!
์บก์ณ์ ์์ฒญ์ productpage
๋ผ๋ ์นํ์ด์ง์ ์์ฒญ์ ๋ณด๋ธ ๊ฒ์ผ๋ก ์ด ์์ฒญ์ด ์ฒ๋ฆฌ๋๊ธฐ ์ํด์ details
์ reviews
์ํฌ๋ก๋์ ์์ฒญ์ ๋ณด๋๊ณ , reviews
์ํฌ๋ก๋๋ ๋ ratings
์ํฌ๋ก๋์ ์์ฒญ์ ๋ณด๋ธ ๊ฑธ ํ์ธํ ์ ์๋ค!!
์ด๋ ๊ฒ Kiali์ฒ๋ผ ํธ๋ํฝ ๊ทธ๋ํ๋ ํ์ธํ ์ ์๊ณ
Ingress Gateway๋ฅผ ํตํด ๋ณด๋ธ ์์ฒญ๋ Jaeger๋ก ์ถ์ ์ด ๊ฐ๋ฅํ๋ค!
Header์ Body ์ ๋ณด๋ ํ์ธ ๋ถ๊ฐ
Istio Envoy Access Logging ํฌ์คํธ์์๋ ๊ทธ๋ฌ๋๋ฐ, ์์ฒญ์ Header์ Body ์ ๋ณด๋ Tracing์์๋ ํ์ธ ๋ถ๊ฐ๋ฅ ํ๋ค.
Zipkin
Istio ์์ ์์ Zipkin๋ ์ธํ ํด๋ณผ ์ ์์๋ค.
https://istio.io/latest/docs/ops/integrations/zipkin/#installation
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/extras/zipkin.yaml
๊ทธ๋ฐ๋ฐ ์จ๋ณด๋ ๋ญ๊ฐ Jaeger ๋ณด๋ค ์ํ๋ง์ด ์ ์ ๋๋ ๋๋์ด์๊ณ , UI/UX๋ Jaeger๊ฐ ์ข๋ ๋ง์์ ๋ค์๋ค!!
Tracing Config
Trace Sampling
Istio์ ์ํ๋ง ๊ธฐ๋ณธ๊ฐ์ 1%(1.0
)์ด๋ค. ๋ง์ฝ ์ด ๊ฐ์ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด, istio๋ฅผ ์ค์นํ ๋ IstioOperator
์ ์๋ Config๋ฅผ ์กฐ์ ํ๋ฉด ๋๋ค.
...
spec:
meshConfig:
defaultConfig:
tracing:
sampling: 100.0
๋๋ Pod Annotation์ผ๋ก Sampling Rate๋ฅผ ์กฐ์ ํ ์๋ ์๋ค.
...
metadata:
annotations:
proxy.istio.io/config: |
tracing:
sampling: 10
(Deprecated) Pilot Trace
๊ณผ๊ฑฐ์๋ pilot์ traceSampling
๊ฐ์ ์กฐ์ ํด์ ์ํ๋ง ํ์ผ๋, ์ด์ ๋ MeshConfig
์ ๊ฐ์ ํตํด ์กฐ์ ํด์ผ ํ๋ค๊ณ ํ๋ค.
์์ง ๋ ๋ฐฉ์ ๋ชจ๋ ์ง์ํ๊ณ ์์ผ๋, ๋ง์ฝ ๋๋ค ๊ฐ์ด ์ ์๋์ด ์๋ค๋ฉด MeshConfig
์ tracing.sampling
์ผ๋ก ๋ฎ์ด์์ ์ง๋ค๊ณ ํ๋ค.
Extension Provider
Istio ์์ ์์๋ Jaeger๋ฅผ Trace Provider๋ก ์ฌ์ฉํ๋๋ฐ, Jaeger ์ธ์๋ zipkin, Datadog, stackdriver, Apache SkyWalking ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
๋์ด๋ ๊ฒ๋ค์ ์ ๋ถ๋ค ์๋ ๊ฑด ์๋์ง๋ง Datadog์ Tracing ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ํฐ๋ง๊ณผ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, Anomaly Detection ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ง๊ณ (ํ์ง๋ง ๋น์ธ๋คโฆ!) Apache SkyWakling์ ์ด๋ฒ์ ์ฒ์ ๋ดค๋๋ฐ Datadog๊ณผ UI๋ ๋น์ทํ๊ณ ๊ธฐ๋ฅ๋ ๊ฑฐ์ ๋น์ทํ ๊ฒ ๊ฐ๋ค. (์ค ์ข์ ๊ฒ ๊ฐ์๋ฐ??)
Trace Context Propagation
์ฐ๋ฆฌ์ ๊ฐ๊ฐ Istio ์๋น์ค๋ฉ์ฌ๋ฅผ ์ ์ฉํ๊ธฐ๋ง ํ๋ฉด โ๋ถ์ฐ ์ถ์ โ์ ๋๋ฆด ์ ์์ ๊ฒ ๊ฐ์ง๋ง, ํ์ค์ ๊ทธ๋ ์ง ์๋ค ใ ใ
Tracing์ ๊ตฌํํ๋ ค๋ฉด ์์ฒญ์ ๋ฐ์ Application์์ ์์ฒญ์ ์ถ์ ํ๊ธฐ ์ํด ๋์์ธ๋ Tracing Header๋ฅผ ๋ค์ ์์ฒญ์ ํฌ์๋(forward) ํด์ฃผ๋ ์ฝ๋๊ฐ ๊ตฌํ๋์ด ์์ด์ผ ํ๋ค!!
์ด๋ค Tracing Provider๋ฅผ ์ฐ๋๋์ ๋ฐ๋ผ์ ํฌ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ ํค๋๊ฐ ๋ค๋ฅด์ง๋ง, ์ผ๋จ x-request-id
ํค๋๋ ๋ฌด์กฐ๊ฑด ํฌ์๋ฉ ํด์ผ ํ๋ค.
๋ง์ฝ, Zipkin, Jaeger ๋ฑ์ Tracing ๋๊ตฌ๋ก ์ฑํ ํ๋ค๋ฉด ์๋์ B3 ํค๋๋ค์ ํฌ์๋ ํด์ผ ํ๋ค. (B3๊ฐ ์ฝ์๋ผ๊ฑฐ๋ ํน๋ณํ ์๋ฏธ๊ฐ ์๋๊ฑด ์๋๋ค.)
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
์ฐธ๊ณ ๋ก Jaeger๋ b3 ํค๋ ํ์์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์, ์์ฒญ์ ๋ฌด์กฐ๊ฑด Tracing ํด์ผ ํ๋ค๋ฉด --header "x-b3-sampled: 1"
๋ก ์ธํ
ํ๋ฉด Sample Rate๋ฅผ ๋ฌด์ํ๊ณ ์ถ์ ์ด ๋๋ค ใ
ใ
Istio ์์ ์ ๊ตฌํ ์ฝ๋๋ ์ด์ง ๋์์๋๋ฐ Java์์ ์ด๋ฐ ๋๋์ด๋ค.
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(
@PathParam("productId") int productId,
@Context HttpHeaders requestHeaders // ์์ฒญ์ ํค๋๋ฅผ
) {
// ...
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(
Integer.toString(productId),
requestHeaders // ๊ทธ๋๋ก ๋๊ฒจ์คฌ๋ค!!
);