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

スポンサーリンク

はじめに

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 of distributed tracing in Istio.

実際に試してみる

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

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

https://github.com/istio/istio/tree/master/samples

Istio のインストール

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

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

brew install istioctl

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

istioctl install --set profile=demo -y

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

kubectl label namespace default istio-injection=enabled

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

【Istio】実際に動かしてざっくり理解するIstio
はじめに Istioとはどんなものなのか実際に使ってみて、ざっくり理解したいと思います。 Istioとは Istionとは、サービスメッシュを実装するためのオープンソースです。 Istioには以下のような機能があります。 ネットワークトラフ...

Jeager のインストール

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

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

istio/samples/addons at master · istio/istio
Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.
kubectl apply -f samples/addons/jaeger.yaml

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

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

istio/samples/bookinfo at master · istio/istio
Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

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

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

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

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

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

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

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

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

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

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

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

istioctl dashboard jaeger

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

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

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

【Kubernetes】ksniffでパケットキャプチャ
はじめに Kubernetes で ksniff を使ってパケットキャプチャをする方法を紹介します。 ksniff ksniff は、tcpdump と Wireshark でのパケットキャプチャができる kubectl プラグインです。 ...

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


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

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

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

参考

タイトルとURLをコピーしました