サービスメッシュ(ASM)は、ASM インスタンス内にデプロイされているアプリケーションをトレースできます。ASM インスタンス内外にデプロイされているアプリケーションを同時にトレースするには、Managed Service for OpenTelemetry を使用して呼び出しトレースを生成する必要があります。このトピックでは、Managed Service for OpenTelemetry を使用して、外部アプリケーションが ASM インスタンス内のアプリケーションを呼び出すことができるようにする方法について説明します。このようにして、Managed Service for OpenTelemetry は 2 つのアプリケーション間の呼び出しトレースを生成します。
前提条件
サービスメッシュ(ASM)インスタンスが作成されています。ACK クラスタが ASM インスタンスに追加されています。詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスタの追加」をご参照ください。
ASM インスタンス内にデプロイされているアプリケーションへの外部アクセスを許可するために、イングレスゲートウェイが ASM インスタンスにデプロイされています。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ASM インスタンス外にアプリケーションをデプロイするランタイム環境に Python 2.7 がインストールされています。
Managed Service for OpenTelemetry がアクティブ化されています。詳細については、「ASM トレースデータを Managed Service for OpenTelemetry に収集する」をご参照ください。
使用上の注意
この例では、Python を使用してコンパイルされた ExternalProxy アプリケーションが ASM インスタンス外にデプロイされています。ExternalProxy は HTTP サーバーを使用します。ExternalProxy のルートパスにアクセスすると、HTTP サーバーは ASM インスタンス内にデプロイされている Bookinfo アプリケーションの Productpage マイクロサービスを呼び出します。
この例では、アプリケーションのトレースに Managed Service for OpenTelemetry を使用します。Zipkin と互換性のあるカスタムトレースシステムを使用する場合は、「手順 2:Managed Service for OpenTelemetry にアクセスするために使用するエンドポイントを取得する」をスキップして、「手順 3:ExternalProxy アプリケーションをデプロイする」に進みます。カスタムトレースシステムへの外部アクセスのエンドポイントを、トレースデータが報告されるエンドポイントに設定します。
手順 1:ASM インスタンス内に Bookinfo アプリケーションをデプロイする
次のコマンドを実行して、ASM インスタンスに追加された ACK クラスタに Bookinfo アプリケーションをデプロイします。
Bookinfo アプリケーションの YAML ファイルは、GitHub からダウンロードできます。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml次のコマンドを実行して、Bookinfo アプリケーションの仮想サービスをデプロイします。
仮想サービスの YAML ファイルは、GitHub からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml次のコマンドを実行して、Bookinfo アプリケーションの宛先ルールをデプロイします。
宛先ルールの YAML ファイルは、GitHub からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml次のコマンドを実行して、Bookinfo アプリケーションのゲートウェイをデプロイします。
ゲートウェイの YAML ファイルは、GitHub からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
手順 2:Managed Service for OpenTelemetry にアクセスするために使用するエンドポイントを取得する
Managed Service for OpenTelemetry コンソールにログインします。左側のナビゲーションペインで、[概要] をクリックします。
[概要] ページで、[アクセスプロセス] タブをクリックし、[アクセスポイント情報を表示] をクリックします。
アクセスエンドポイントを表示します。
ページの上部で、目的のリージョンを選択します。
Bookinfo アプリケーションがデプロイされている ACK クラスタのリージョンを選択します。別のリージョンを選択すると、Bookinfo アプリケーションのトレースデータを Managed Service for OpenTelemetry に報告できません。
[アクセスポイント情報] タブで、クラスタ情報パラメータの [トークンを表示] をオンにします。ExternalProxy アプリケーションをデプロイする場所に基づいて、パブリックエンドポイントまたはプライベートエンドポイントを選択します。
この例では、ExternalProxy のトレースデータは Zipkin V1 の API を使用して報告されます。そのため、Zipkin V1 のパブリックエンドポイントまたはプライベートエンドポイントを使用する必要があります。

手順 3:ExternalProxy アプリケーションをデプロイする
サイドカープロキシは、リクエストで受信したすべてのコンテンツ(HTTP リクエストヘッダーとリクエストボディを含む)をアップストリームサービスに転送します。そのため、トレース関連のヘッダーもアップストリームサービスに転送されます。
トレース情報を渡すには、アプリケーションは Istio コミュニティの仕様に従って、トレース関連のリクエストヘッダーをアップストリームサービスに渡す必要があります。
次のコンテンツを含む ExternalProxy.py ファイルを作成し、ExternalProxy アプリケーションのランタイム環境にファイルを保存します。
{XTRACE_ZIPKIN_V1_ENDPOINT}を手順 2 で取得したエンドポイントに置き換えます。トレースデータをカスタムトレースシステムに報告する必要がある場合は、変数をカスタムトレースシステムのアクセスエンドポイントに置き換えます。{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-686次のコマンドを実行して、ExternalProxy を呼び出します。
curl localhost:5000予期される出力:
OK
手順 4:トレースデータを表示する
Managed Service for OpenTelemetry コンソールにログインします。
左側のナビゲーションペインで、[アプリケーション] をクリックします。[アプリケーション] ページの上部で、ACK クラスタが存在するリージョンを選択します。次に、アプリケーションリストで ExternalProxy をクリックします。
表示されるページで、左側のナビゲーションペインの [アプリケーションの詳細] をクリックします。[アプリケーションの詳細] ページで、[トレース] タブをクリックします。次に、クエリする呼び出しトレースのトレース ID をクリックします。
ASM インスタンス外にデプロイされている ExternalProxy アプリケーションと、ASM インスタンス内にデプロイされている Bookinfo アプリケーションの間に呼び出しトレースが生成されます。