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 のマニフェストとサンプルアプリを利用します。
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
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
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.
1kubectl 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.
まずは、アプリケーションをデプロイします。
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 を使ってパケットキャプチャをする方法を紹介しま
下記 2 つは同じリクエストの処理なので、x-request-id
が同じ値になっています。
下記は別のリクエストなので、x-request-id
が別の値になっています。
Jaeger の GUI からトレースの結果を確認したい Service(ここではproductpage.default
)を選択して"Find Traces"をクリックすると、トレースの結果が確認できます。
また、その中からトレースを選択することで、そのリクエストでどこでどのくらい処理に時間がかかっていたかを確認することができます。