IstioとJaegerで分散トレーシングを試してみる

2023.11.15
2024.03.24
Kubernetes
IstioJaeger分散トレーシング

はじめに

Istio と Jaeger を使った分散トレーシングを試してみたいと思います。

Istio と Jaeger で分散トレーシング

Istio を使うと、自動で分散トレーシングに使うヘッダーを送信してくれるので、Jaeger や Zipkin などで簡単に分散トレーシングができるようになっています。

ただし、一つのトレースとして認識させるためには送られてきたヘッダーを次のサービスに送信する必要があります。

下記のヘッダーは Istio(Envoy)固有のヘッダーになり、一つのトレースとして認識するために使われます。

  • x-request-id

また、それ以外に Jaeger でトレーシングする場合は、下記のヘッダーも必要になります。

  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags

これらのヘッダーを次のサービスに伝播させていくことで、複数のサービスでの処理をトレーシングすることができます。

Overview

Overview

Overview of distributed tracing in Istio.

実際に試してみる

ローカルで実際に試してみます。

下記の Istio のリポジトリから Jaeger のマニフェストとサンプルアプリを利用します。

istio/samples at master · istio/istio

istio/samples at master · istio/istio

Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

Istio のインストール

まずは、Istio をインストールします。

istioctlをまだインストールしていない場合は、インストールします。

1brew install istioctl

istioctlを使って、ローカル Kubernetes クラスタに Istio をインストールします。

1istioctl install --set profile=demo -y

istio-proxy のサイドカーが挿入されるように設定しておきます。

1kubectl label namespace default istio-injection=enabled

Istio については、下記を参考にしてください。

【Istio】実際に動かしてざっくり理解するIstio

【Istio】実際に動かしてざっくり理解するIstio

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

Jeager のインストール

次に、Jaeger をインストールします。

Istio のリポジトリにある Jaeger のマニフェストを利用してインストールします。

istio/samples/addons at master · istio/istio

istio/samples/addons at master · istio/istio

Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

1kubectl apply -f samples/addons/jaeger.yaml

サンプルアプリのデプロイ

サンプルアプリについても、Isito のリポジトリにあるサンプルアプリを利用します。

istio/samples/bookinfo at master · istio/istio

istio/samples/bookinfo at master · istio/istio

Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

まずは、アプリケーションをデプロイします。

1kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

次に、アプリケーションにアクセスできるように Gateway を作成します。

1kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

アクセスするのに必要な情報を環境変数に設定します。

1export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
2export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
3export INGRESS_HOST=127.0.0.1
4export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

下記でポートフォワードすることでhttp://localhost/productpageでアクセスできるようになります。

1kubectl -n istio-system port-forward svc/istio-ingressgateway $INGRESS_PORT:80

分散トレーシングしてみる

ここから分散トレーシングをしていきます。

まずは Jaeger の GUI にアクセスします。

1istioctl dashboard jaeger

下記のコマンドで軽い負荷をかけます。

1for i in $(seq 1 50); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done

試しに ksniff でパケットキャプチャして、ヘッダーがどうなっているかみてみます。ksniff については、下記を参考にしてください。

【Kubernetes】ksniffでパケットキャプチャ

【Kubernetes】ksniffでパケットキャプチャ

はじめに Kubernetes で ksniff を使ってパケットキャプチャをする方法を紹介しま

下記 2 つは同じリクエストの処理なので、x-request-idが同じ値になっています。

下記は別のリクエストなので、x-request-idが別の値になっています。

Jaeger の GUI からトレースの結果を確認したい Service(ここではproductpage.default)を選択して"Find Traces"をクリックすると、トレースの結果が確認できます。

また、その中からトレースを選択することで、そのリクエストでどこでどのくらい処理に時間がかかっていたかを確認することができます。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee