2.17.4. 分散トレース
分散トレースは、アプリケーションのサービス呼び出しのパスを追跡して、アプリケーション内の個々のサービスのパフォーマンスを追跡するプロセスです。アプリケーションでユーザーがアクションを起こすたびに、要求が実行され、多くのサービスが応答を生成するために対話が必要になる場合があります。この要求のパスは、分散トランザクションと呼ばれます。
Red Hat OpenShift Service Mesh は、Red Hat OpenShift Distributed Tracing Platform を使用して、開発者がマイクロサービスアプリケーション内の呼び出しの流れを確認できるようにします。
2.17.4.1. Red Hat OpenShift Distributed Tracing Platform と Red Hat build of OpenTelemetry の設定 リンクのコピーリンクがクリップボードにコピーされました!
ServiceMeshControlPlane の spec.meshConfig.extensionProviders 仕様に名前付き要素と opentelemetry プロバイダーを追加することで、トレースデータを Red Hat OpenShift Distributed Tracing Platform に公開できます。その後、テレメトリーカスタムリソースが、トレーススパンを収集して OpenTelemetry Collector エンドポイントに送信するように Istio プロキシーを設定します。
メッシュの namespace に Red Hat build of OpenTelemetry インスタンスを作成し、トレースデータをトレースプラットフォームバックエンドサービスに送信するように設定できます。
前提条件
-
tracing-systemnamespace で Red Hat Tempo Operator を使用して TempoStack インスタンスを作成しました。詳細は、「Red Hat OpenShift Distributed Tracing Platform のインストールを」参照してください。 -
Red Hat build of OpenTelemetry Operator を、推奨される namespace または
openshift-operatorsnamespace のいずれかにインストールした。詳細は、「Red Hat build of OpenTelemetry のインストール」を参照してください。 -
Red Hat OpenShift Service Mesh 2.5 以前を使用している場合は、
ServiceMeshControlPlaneリソースのspec.tracing.typeパラメーターをNoneに設定して、トレースデータを OpenTelemetry Collector に送信できるようにする。
手順
メッシュ namespace に OpenTelemetry Collector インスタンスを作成します。この例では、
bookinfo名前空間を使用しています。OpenTelemetry Collector の設定例
apiVersion: opentelemetry.io/v1alpha1 kind: OpenTelemetryCollector metadata: name: otel namespace: bookinfo1 spec: mode: deployment config: | receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 exporters: otlp: endpoint: "tempo-sample-distributor.tracing-system.svc.cluster.local:4317"2 tls: insecure: true service: pipelines: traces: receivers: [otlp] processors: [] exporters: [otlp]- 1
ServiceMeshMemberRollメンバーリストに namespace を含めます。- 2
- この例では、TempoStack インスタンスが
tracing-systemnamespace で実行しています。ServiceMeshMemberRollメンバーリストに、`tracing-system` などの TempoStack namespace を含める必要はありません。注記-
ServiceMeshMemberRollメンバー namespace の 1 つに OpenTelemetry Collector のインスタンスを 1 つ作成してください。 -
OpenTelemetryCollectorリソースにsidecar.istio.io/inject: 'true'を追加することで、メッシュの一部としてotel-collectorを追加できます。
-
otel-collectorPod ログを確認し、Pod が実行中であることを確認します。otel-collectorPod ログチェックの例$ oc logs -n bookinfo -l app.kubernetes.io/name=otel-collectoristio-systemnamespace でServiceMeshControlPlaneカスタムリソース (CR) を作成するか、既存のカスタムリソースを更新します。SMCP カスタムリソースの例
kind: ServiceMeshControlPlane apiVersion: maistra.io/v2 metadata: name: basic namespace: istio-system spec: addons: grafana: enabled: false kiali: enabled: true prometheus: enabled: true meshConfig: extensionProviders: - name: otel opentelemetry: port: 4317 service: otel-collector.bookinfo.svc.cluster.local policy: type: Istiod telemetry: type: Istiod version: v2.6注記SMCP 2.5 から 2.6 にアップグレードする場合は、
spec.tracing.typeパラメーターをNoneに設定します。SMCP
spec.tracing.typeパラメーターの例spec: tracing: type: Noneistio-systemnamespace に Telemetry リソースを作成します。Telemetry リソースの例
apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: mesh-default namespace: istio-system spec: tracing: - providers: - name: otel randomSamplingPercentage: 100-
istiodログを確認します。 Kiali リソース仕様を設定して、Kiali ワークロードトレースダッシュボードを有効にします。ダッシュボードを使用して、トレースクエリーの結果を表示できます。
Kiali リソースの例
apiVersion: kiali.io/v1alpha1 kind: Kiali # ... spec: external_services: tracing: query_timeout: 301 enabled: true in_cluster_url: 'http://tempo-sample-query-frontend.tracing-system.svc.cluster.local:16685' url: '[Tempo query frontend Route url]' use_grpc: true2 - 1
- デフォルトの
query_timeout整数値は 30 秒です。値を 30 秒より大きく設定する場合は、Kiali CR の.spec.server.write_timeoutを更新し、Kiali ルートにhaproxy.router.openshift.io/timeout=50sアノテーションを追加する必要があります。.spec.server.write_timeoutとhaproxy.router.openshift.io/timeout=は両方ともquery_timeoutより大きくする必要があります。 - 2
- デフォルトの HTTP または gRPC ポートを使用していない場合は、
in_cluster_url:ポートをカスタムポートに置き換えます。注記Kiali 1.73 は、Jaeger Query API を使用するため、Tempo リソースの制限に応じて応答時間が長くなります。Kiali UI に
Could not fetch spansのエラーメッセージが表示された場合は、Tempo 設定を確認するか、Kiali のクエリーごとの制限を減らしてください。
- アプリケーションにリクエストを送信します。
-
istiodPod ログとotel-collectorPod ログを確認します。
2.17.4.1.1. mTLS で暗号化された Service Mesh メンバー namespace での OpenTelemetryCollector の設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh dataPlane の mTLS 暗号化を有効にすると、すべてのトラフィックが TLS で暗号化されます。
メッシュが OpenTelemetryCollector サービスと通信できるようにするには、OpenTelemetryCollector サービスに DestinationRule を適用して TLS trafficPolicy を無効にします。
DestinationRule Tempo CR の例
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: otel-disable-tls
spec:
host: "otel-collector.bookinfo.svc.cluster.local"
trafficPolicy:
tls:
mode: DISABLE
2.17.4.1.2. mTLS で暗号化された Service Mesh メンバー namespace での Red Hat OpenShift Distributed Tracing Platform の設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh メンバー namespace ではない namespace に TempoStack インスタンスを作成した場合、この追加の DestinationRule 設定は必要ありません。
Service Mesh dataPlane mTLS 暗号化を有効にし、tracing-system-mtls などの Service Mesh メンバー namespace に TempoStack インスタンスを作成すると、すべてのトラフィックが TLS で暗号化されます。この暗号化は Tempo 分散サービスでは予期されていないため、TLS エラーが返されます。
TLS エラーを修正するには、Tempo と Kiali に DestinationRule を適用して TLS trafficPolicy を無効にします。
DestinationRule Tempo の例
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: tempo
namespace: tracing-system-mtls
spec:
host: "*.tracing-system-mtls.svc.cluster.local"
trafficPolicy:
tls:
mode: DISABLE
DestinationRule Kiali の例
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: kiali
namespace: istio-system
spec:
host: kiali.istio-system.svc.cluster.local
trafficPolicy:
tls:
mode: DISABLE