Service Mesh (ASM) は、ASM インスタンス内にデプロイされたアプリケーションをトレースできます。外部アプリケーションがメッシュ内のアプリケーションを呼び出す場合、ASM 単独では、それらのスパンを単一のエンドツーエンドトレースに相関させることはできません。OpenTelemetry 向けマネージドサービスは、両方の環境からスパンを収集し、それらを統合されたコールトレースにアセンブルすることで、このギャップを埋めます。
次の例は、このワークフローを示しています。外部 Python アプリケーション (ExternalProxy) が ASM インスタンス内の Bookinfo Productpage マイクロサービスを呼び出し、OpenTelemetry 向けマネージドサービスがそれらの間の境界を越えたコールトレースを生成します。
境界を越えたトレースの仕組み
リクエストが外部アプリケーションからメッシュに流れるとき、エンドツーエンドトレースは HTTP ヘッダーを介したトレースコンテキスト伝播 に依存します。プロセスは次のとおりです。
外部アプリケーションはルートスパンを作成し、B3 トレースヘッダーをアウトバウンド HTTP リクエストに挿入し、そのスパンをトレースバックエンドにレポートします。
ASM イングレスゲートウェイはリクエストを受信し、B3 ヘッダーをアップストリームサービスに転送し、その過程で独自の子スパンを作成します。
各メッシュ内サービスのサイドカープロキシは、ヘッダーの転送と子スパンの作成を継続します。
すべてのスパンが同じトレース ID を共有するため、トレースバックエンドはそれらを 1 つのコールトレースにアセンブルします。
Zipkin 互換のトレースには、次の B3 ヘッダーを伝播する必要があります。
| ヘッダー | 目的 |
|---|---|
X-B3-TraceId | 全体のトレースを識別します |
X-B3-SpanId | 現在のスパンを識別します |
X-B3-ParentSpanId | 親スパンを識別します |
サイドカープロキシは、リクエスト内のすべてのコンテンツ (ヘッダーと本文) をアップストリームサービスに転送します。ただし、ご利用のアプリケーションコードは、Istio コミュニティの仕様に従って、トレース関連のリクエストヘッダーをアップストリームサービスに明示的に伝播する必要があります。ヘッダーが伝播されない場合、トレースバックエンドはスパンを相関させることができず、トレースは分断されたフラグメントとして表示されます。
前提条件
開始する前に、以下を確認してください。
Container Service for Kubernetes (ACK) クラスターが追加された ASM インスタンス。詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスターの追加」をご参照ください。
外部アクセスを許可するために、ASM インスタンスにデプロイされたイングレスゲートウェイ。詳細については、「イングレスゲートウェイの作成」をご参照ください。
外部アプリケーションが実行される実行環境にインストールされた Python 2.7。
OpenTelemetry 向けマネージドサービスがアクティブ化されていること。詳細については、「ASM トレースデータを OpenTelemetry 向けマネージドサービスに収集する」をご参照ください。
例のシナリオについて
この例では、ExternalProxy と呼ばれる Python アプリケーションを ASM インスタンスの外部にデプロイします。ExternalProxy はポート 5000 で HTTP サーバーを実行します。そのルートパス (
/) にアクセスされると、イングレスゲートウェイを介して ASM インスタンス内の Bookinfo アプリケーションの Productpage マイクロサービスを呼び出します。OpenTelemetry 向けマネージドサービスの代わりに Zipkin 互換のカスタムトレースシステムを使用する場合は、ステップ 2 をスキップして、直接 ステップ 3 に進みます。OpenTelemetry 向けマネージドサービスのエンドポイントを、ご利用のカスタムトレースシステムのエンドポイントに置き換えてください。
ステップ 1: ASM インスタンス内への Bookinfo のデプロイ
ASM インスタンスに追加された ACK クラスターに Bookinfo サンプルアプリケーションをデプロイします。Istio GitHub リポジトリから各 YAML ファイルをダウンロードし、kubectl を使用して適用します。
Bookinfo アプリケーションリソースは ${DATA_PLANE_KUBECONFIG} (ACK クラスター kubeconfig) を使用して適用され、仮想サービス、宛先ルール、およびゲートウェイは ${ASM_KUBECONFIG} (ASM コントロールプレーン kubeconfig) を使用して適用されます。
Bookinfo アプリケーションをデプロイします。YAML ファイルは GitHub からダウンロードしてください。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml仮想サービスをデプロイします。YAML ファイルは GitHub からダウンロードしてください。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml宛先ルールをデプロイします。YAML ファイルは GitHub からダウンロードしてください。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yamlゲートウェイをデプロイします。YAML ファイルは GitHub からダウンロードしてください。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
ステップ 2: OpenTelemetry 向けマネージドサービスのエンドポイントの取得
OpenTelemetry 向けマネージドサービスコンソールから Zipkin V1 エンドポイントを取得します。ExternalProxy はそのトレースデータをこのエンドポイントにレポートします。
OpenTelemetry 向けマネージドサービスOpenTelemetry 向けマネージドサービスコンソールにログインします。左側のナビゲーションウィンドウで、[概要] をクリックします。
[概要] ページで、[アクセスプロセス] タブをクリックし、[アクセスポイント情報の表示] をクリックします。
ページ上部で、ACK クラスターがデプロイされているリージョンを選択します。
重要Bookinfo が実行されている ACK クラスターと同じリージョンを選択します。異なるリージョンを選択した場合、トレースデータを OpenTelemetry 向けマネージドサービスにレポートできません。
「アクセスポイント情報」タブで、[クラスター情報] パラメーターの [トークンを表示] を有効にします。ExternalProxy アプリケーションをデプロイする場所に応じて、Zipkin V1 エンドポイント(パブリックまたはプライベート)をコピーします。

ステップ 3: ExternalProxy アプリケーションのデプロイ
ExternalProxy アプリケーションを作成して実行します。ExternalProxy は、py_zipkin ライブラリを使用してアウトバウンドリクエストに B3 トレースヘッダーを計測し、ステップ 2 で取得した Zipkin V1 エンドポイントにスパンをレポートします。
次の内容で
ExternalProxy.pyという名前のファイルを作成します。保存する前に、2 つのプレースホルダーを実際の値に置き換えてください。プレースホルダー 説明 ${XTRACE_ZIPKIN_V1_ENDPOINT}ステップ 2 で取得した Zipkin V1 エンドポイント。トレースデータをカスタムトレースシステムにレポートする必要がある場合は、カスタムトレースシステムのアクセスエンドポイントを使用します。 ${INGRESS_GATE_WAY_IP}ACK クラスターにデプロイされたイングレスゲートウェイのエンドポイント ExternalProxy を起動します。期待される出力:
python ExternalProxy.py* Serving Flask app "main" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 317-792-686ExternalProxy にリクエストを送信します。期待される出力:
curl localhost:5000OK
ステップ 4: コールトレースの表示
ExternalProxy が Bookinfo を正常に呼び出した後、OpenTelemetry 向けマネージドサービスでエンドツーエンドトレースを確認します。
OpenTelemetry 向けマネージドサービス コンソールにログインします。
左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。ページの上部で、ACK クラスターが存在するリージョンを選択します。アプリケーションリストで ExternalProxy をクリックします。
左側のナビゲーションウィンドウで、[アプリケーション詳細] をクリックします。[トレース] タブをクリックし、確認したい呼び出しトレースのトレース ID をクリックします。トレースには、ExternalProxy (メッシュ外) がイングレスゲートウェイ経由で Bookinfo Productpage サービス (メッシュ内) を呼び出す完全なリクエストパスが表示されます。