Alibaba Cloud Service Mesh (ASM) は、サービスメッシュ内のアプリケーションに対してすぐに使えるトレース機能を提供します。しかし、メッシュ内のサービスと通信する外部アプリケーションを含むエンドツーエンドのトレースを実現するには、OpenTelemetry 向けマネージドサービスを使用してコールトレースを統一する必要があります。このガイドでは、OpenTelemetry 向けマネージドサービスを使用して、外部アプリケーションから ASM インスタンス内のアプリケーションへのリクエストをトレースし、単一の統一されたコールトレースを作成する方法を説明します。
前提条件
-
Service Mesh (ASM) インスタンスが作成されていること。ACK クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスターの追加」をご参照ください。
-
メッシュ内のアプリケーションへのアクセスを許可するために、イングレスゲートウェイが ASM インスタンスにデプロイされていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
-
メッシュ外のサンプルアプリケーションを実行するために、Python 2.7 がインストールされた環境が利用可能であること。
-
OpenTelemetry 向けマネージドサービスが有効になっていること。詳細については、「Service Mesh (ASM) からのトレースデータのエクスポート」をご参照ください。
注意事項
-
このガイドでは、ExternalProxy という名前の Python アプリケーションをデプロイします。このアプリケーションは HTTP サーバーを実行します。ExternalProxy のルートパスにアクセスすると、サービスメッシュ内で実行されている Bookinfo アプリケーションの `productpage` サービスが呼び出されます。
-
このガイドでは、トレースバックエンドとして OpenTelemetry 向けマネージドサービスを使用します。Zipkin と互換性のある自己管理型のトレースシステムを使用する場合は、そのレポート用エンドポイントを外部アプリケーションに公開してください。その場合、「ステップ 2:OpenTelemetry エンドポイントの取得」をスキップし、システムのレポート用アドレスを使用して直接「ステップ 3:メッシュ外の ExternalProxy アプリケーションのデプロイ」に進むことができます。
ステップ 1:メッシュ内の Bookinfo アプリケーションのデプロイ
-
次のコマンドを実行して、Bookinfo アプリケーションを ASM インスタンス内のクラスターにデプロイします。
Bookinfo アプリケーションの YAML ファイルは GitHub からダウンロードできます。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml -
次のコマンドを実行して、Bookinfo アプリケーションの VirtualService をデプロイします。
VirtualService の YAML ファイルは GitHub からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml -
次のコマンドを実行して、Bookinfo アプリケーションの DestinationRule をデプロイします。
DestinationRule の YAML ファイルは Github からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml -
次のコマンドを実行して、Bookinfo アプリケーションの Gateway をデプロイします。
Gateway の YAML ファイルは GitHub からダウンロードできます。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
ステップ 2:OpenTelemetry エンドポイントの取得
-
OpenTelemetry 向けマネージドサービス コンソールにログインします。左側のナビゲーションウィンドウで、[概要] をクリックします。
-
[概要] ページで、[アクセスプロセス] タブをクリックし、次に [アクセスポイント情報を表示] をクリックします。
-
エンドポイントを表示します。
-
ページ上部で、対象のリージョンを選択します。
Bookinfo アプリケーションの ACK クラスターがデプロイされているリージョンを選択する必要があります。そうしないと、トレースデータを関連付けることができません。
-
[アクセスポイント情報] タブで、[トークンの表示] スイッチをオンにします。ExternalProxy アプリケーションがデプロイされている場所に基づいて、パブリックネットワークまたはプライベートネットワークのエンドポイントを選択します。
ExternalProxy は Zipkin v1 API を使用してデータをレポートするため、v1 エンドポイントが必要です。[Zipkin] タブをクリックし、表から適切なエンドポイントを見つけます。通常は v2 エンドポイントを使用すべきですが、Istio や Molten の統合といった特定のシナリオでは v1 エンドポイントが必要です。Sleuth コンポーネントを使用する場合、ベース URL に
/api/v2/spansを含めてはいけません。
-
ステップ 3:メッシュ外の ExternalProxy アプリケーションのデプロイ
-
サイドカープロキシは、HTTP ヘッダーやリクエストボディを含む、受信リクエストのすべての部分をアップストリームサービスに転送します。これは、トレース関連のヘッダーも転送されることを意味します。
-
トレースコンテキストの伝播を確実にするには、アプリケーションが標準的なコミュニティの慣行に従い、アウトバウンドリクエストに必要なトレースヘッダーを転送する必要があります。
-
次のコードを ExternalProxy.py という名前のファイルとして、外部アプリケーションの実行環境に保存します。
-
{XTRACE_ZIPKIN_V1_ENDPOINT}を前のステップで取得したエンドポイントに置き換えます。自己管理型のトレースシステムにレポートする場合は、そのレポート用エンドポイントを使用します。 -
{INGRESS_GATE_WAY_IP}をご利用の ACK クラスターのイングレスゲートウェイの IP アドレスに置き換えます。
-
-
次のコマンドを実行して、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:トレース情報の表示
-
OpenTelemetry 向けマネージドサービスコンソールにログインします。
-
左側のナビゲーションウィンドウで[アプリケーション]をクリックし、ページの上部でリージョンを選択して、アプリケーション一覧で ExternalProxy をクリックします。
-
左側のナビゲーションウィンドウで、[アプリケーション詳細] をクリックします。[トレース] タブをクリックし、次に [トレース ID] をクリックして呼び出しトレースの詳細を表示します。
これで、外部アプリケーション ExternalProxy とメッシュ内の Bookinfo アプリケーションとの間に完全なコールトレースが形成されました。トレース詳細ページの上部には、開始時刻、期間、サービス、深さ、合計スパン数などの概要情報が表示されます。概要の下には、各スパンの階層関係を示すツリービューが表示されます。列には、スパン名、タイムライン、サービス名、開始時刻、IP アドレス、ステータスが含まれます。この例では、コールトレースは `external-proxy` から始まり、`productpage` を経由して、`details`、`reviews`、`ratings` の各サービスを順番に呼び出します。`ahas_rate_limit_cluster` のレート制限スパンなど、一部のスパンはエラーステータスで表示される場合があります。