はじめに
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
これらのヘッダーを次のサービスに伝播させていくことで、複数のサービスでの処理をトレーシングすることができます。
実際に試してみる
ローカルで実際に試してみます。
下記の Istio のリポジトリから Jaeger のマニフェストとサンプルアプリを利用します。
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 については、下記を参考にしてください。

Jeager のインストール
次に、Jaeger をインストールします。
Istio のリポジトリにある Jaeger のマニフェストを利用してインストールします。
kubectl apply -f samples/addons/jaeger.yaml
サンプルアプリのデプロイ
サンプルアプリについても、Isito のリポジトリにあるサンプルアプリを利用します。
まずは、アプリケーションをデプロイします。
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 については、下記を参考にしてください。

下記 2 つは同じリクエストの処理なので、x-request-id
が同じ値になっています。
下記は別のリクエストなので、x-request-id
が別の値になっています。
Jaeger の GUI からトレースの結果を確認したい Service(ここではproductpage.default
)を選択して"Find Traces"をクリックすると、トレースの結果が確認できます。
また、その中からトレースを選択することで、そのリクエストでどこでどのくらい処理に時間がかかっていたかを確認することができます。