すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:Istio でのトレースに OpenTelemetry を使用する

最終更新日:May 09, 2025

このトピックでは、Istio で分散トレースに OpenTelemetry を使用する方法について説明します。Istio のトレース機能を使用すると、サービス呼び出しの関係と依存関係を視覚化し、マイクロサービスの正常性を監視し、パフォーマンスボトルネックを特定し、分散システムの問題をトラブルシューティングできます。

前提条件

  • Istio v1.19 以降がクラスターにインストールされている。

  • OpenTelemetry Collector がクラスターにデプロイされている。Istio トレースデータは、OpenTelemetry Collector を介して Managed Service for OpenTelemetry に転送する必要があります。クラスターに OpenTelemetry Collector をデプロイする方法については、「OpenTelemetry Collector を介した転送」をご参照ください。

  • Managed Service for OpenTelemetry のエンドポイントと認証情報を取得している。詳細については、「Managed Service for OpenTelemetry への接続とクライアントの認証」をご参照ください。

手順

1. Istio トレースデータのレポート方法を構成する

  1. Istio は、gRPC または HTTP プロトコルを介して OpenTelemetry Collector にトレースデータをエクスポートすることをサポートしています。次のいずれかの方法を選択します。

    gRPC プロトコルを使用する

    次のコマンドを実行します。Istio トレースデータは、OTLP/gRPC を介して OpenTelemetry Collector にエクスポートされます。

    istio-otel-config.yaml という名前の構成ファイルを作成します。

    cat > istio-otel-config.yaml <<EOF
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      meshConfig:
        defaultConfig:
          tracingServiceName: APP_LABEL_AND_NAMESPACE
        enableTracing: true
        extensionProviders:
        - name: otel-tracing
          opentelemetry:
            port: 4317
            service: <service-name>.<namespace>.svc.cluster.local
            resource_detectors:
              environment: {}
    EOF

    HTTP プロトコルを使用する

    次のコマンドを実行します。Istio トレースデータは、OTLP/HTTP を介して OpenTelemetry Collector にエクスポートされます。

    istio-otel-config.yaml という名前の構成ファイルを作成します。

    cat > istio-otel-config.yaml <<EOF
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      meshConfig:
        enableTracing: true
        extensionProviders:
        - name: otel-tracing
          opentelemetry:
            port: 4318
            service: opentelemetry-collector.observability.svc.cluster.local
            http:
              path: "/v1/traces"
              timeout: 5s
              headers:
                - name: "custom-header"
                  value: "custom value"
            resource_detectors:
              environment: {}
    EOF
    説明
    • 構成内のサービスアドレスを、お使いの環境における OpenTelemetry Collector の実際のサービスアドレスに置き換える必要があります。構成では、<service-name> は OpenTelemetry Collector のサービス名、<namespace> はデプロイされている名前空間を指します。例: opentelemetry-collector.observability.svc.cluster.local

    • Istio は、サービス名(アプリケーション名)の生成方法を制御するための構成オプション tracingServiceName を提供しており、3 つのオプションがあります。

      • APP_LABEL_AND_NAMESPACE (デフォルト): <app label>.<namespace> の形式を使用します。

      • CANONICAL_NAME_ONLY: ワークロードの正規名(Deployment の名前など)のみを使用します。

      • CANONICAL_NAME_AND_NAMESPACE: <canonical name>.<namespace> の形式を使用します。

  2. istio-otel-config.yaml ファイルを適用します。

    istioctl install -y -f istio-otel-config.yaml

2. Istio のトレースを有効にする

トレースデータのレポートを構成した後、Istio トレースデータの収集を有効にし、サンプリング比率を設定する必要があります。次のコマンドを実行して、トレースを有効にします。

  1. 構成ファイル istio-telemetry.yaml を作成します。

    cat > istio-telemetry.yaml <<EOF
    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: otel-demo
    spec:
      tracing:
      - providers:
        - name: otel-tracing
        randomSamplingPercentage: 100
    EOF
    説明

    randomSamplingPercentage はトレースサンプリングレートを表し、値の範囲は 0 ~ 100 です。100 に設定すると、すべてのリクエストのトレースデータが記録されます。本番環境では、実際のトラフィック状況に基づいてこの値を調整することをお勧めします。

  2. 構成を適用します。

    kubectl apply -f istio-telemetry.yaml

    上記の構成が完了すると、サービス間の呼び出しが発生したときに、Istio は自動的にトレースデータを生成し、OpenTelemetry Collector を介して Managed Service for OpenTelemetry に転送します。

3. Istio トレースデータを表示する

Managed Service for OpenTelemetry コンソール に移動して、Istio トレースデータを表示します。94

サンプル演習

次のサンプル演習では、Istio トレースデータを収集し、Managed Service for OpenTelemetry にレポートする方法を示します。

1. Istio をインストールする

curl -L https://istio.io/downloadIstio | sh -

cd istio-1.25.2

export PATH=$PWD/bin:$PATH

2. OpenTelemetry Collector をインストールする

  1. otel.yaml を作成します。 <gRPC-Endpoint> および <gRPC-Token> を、「前提条件」で取得したエンドポイントと認証トークンに置き換えます。

    cat > otel.yaml <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: opentelemetry-collector-conf
      labels:
        app: opentelemetry-collector
    data:
      opentelemetry-collector-config: |
        receivers:
          otlp:
            protocols:
              grpc:
              http:
        processors:
          batch:
        exporters:
          otlp:
            endpoint: "<gRPC-Endpoint>"
            headers:
              Authentication: "<gRPC-Token>"
            tls:
              insecure: true
          logging:
            loglevel: debug
        extensions:
          health_check:
            port: 13133
        service:
          extensions:
          - health_check
          pipelines:
            logs:
              receivers: [otlp]
              processors: [batch]
              exporters: [logging]
            traces:
              receivers:
              - otlp
              exporters:
              - logging
              - otlp
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: opentelemetry-collector
      labels:
        app: opentelemetry-collector
    spec:
      ports:
        - name: grpc-opencensus
          port: 55678
          protocol: TCP
          targetPort: 55678
        - name: grpc-otlp # OpenTelemetry レシーバーのデフォルトエンドポイント。
          port: 4317
          protocol: TCP
          targetPort: 4317
        - name: http-otlp # OpenTelemetry レシーバーの HTTP エンドポイント。
          port: 4318
          protocol: TCP
          targetPort: 4318
      selector:
        app: opentelemetry-collector
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: opentelemetry-collector
    spec:
      selector:
        matchLabels:
          app: opentelemetry-collector
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: opentelemetry-collector
            sidecar.istio.io/inject: "false" # 注入しない
        spec:
          containers:
            - command:
                - "/otelcol"
                - "--config=/conf/opentelemetry-collector-config.yaml"
              env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.namespace
              image: otel/opentelemetry-collector:0.54.0
              imagePullPolicy: IfNotPresent
              name: opentelemetry-collector
              ports:
                - containerPort: 4317
                  protocol: TCP
                - containerPort: 4318
                  protocol: TCP
                - name: grpc-opencensus
                  containerPort: 55678
                  protocol: TCP
              resources:
                limits:
                  cpu: "2"
                  memory: 4Gi
                requests:
                  cpu: 200m
                  memory: 400Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                - name: opentelemetry-collector-config-vol
                  mountPath: /conf
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          terminationGracePeriodSeconds: 30
          volumes:
            - configMap:
                defaultMode: 420
                items:
                  - key: opentelemetry-collector-config
                    path: opentelemetry-collector-config.yaml
                name: opentelemetry-collector-conf
              name: opentelemetry-collector-config-vol
    EOF
  2. observability という名前のネームスペースを作成します。

    kubectl create namespace observability
  3. OpenTelemetry Collector をデプロイします。

    kubectl apply -f otel.yaml -n observability

3. Istio トレースを構成する

  1. クラスターで次のコマンドを実行すると、Istio トレースデータは OTLP/gRPC を介して OpenTelemetry Collector にエクスポートされます。

    cat <<EOF | istioctl install -y -f -
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      meshConfig:
        enableTracing: true
        extensionProviders:
        - name: otel-tracing
          opentelemetry:
            port: 4317
            service: opentelemetry-collector.observability.svc.cluster.local
            resource_detectors:
              environment: {}
    EOF
  2. 次のコマンドを実行して、Istio トレースを有効にします。

    kubectl apply -f - <<EOF
    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: otel-demo
    spec:
      tracing:
      - providers:
        - name: otel-tracing
        randomSamplingPercentage: 100
    EOF

4. デモ アプリケーションをデプロイする

  1. default 名前空間の自動サイドカー注入を有効にします。

    Istio は、この名前空間に作成された新しいポッドにサイドカープロキシ(istio-proxy コンテナー)を自動的に注入します。

    kubectl label namespace default istio-injection=enabled
  2. Istio に含まれるデモ アプリケーションをデプロイします(このコマンドは、展開された Istio ディレクトリから実行します)。

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
  3. ポッドとサービスのステータスを確認します。

    kubectl get pods
    kubectl get services
  4. アプリケーションにアクセスできることを確認します。

    kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
    
    # 予期される出力
    <title>Simple Bookstore App</title>

5. デモ サービスの外部アクセスエントリを作成する

  1. デモ アプリケーションのイングレスゲートウェイを作成します。

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
  2. イングレスアドレスを取得します

    export INGRESS_NAME=istio-ingressgateway    
    export INGRESS_NS=istio-system             
    
    export INGRESS_HOST=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    export INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    export SECURE_INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
    export TCP_INGRESS_PORT=$(kubectl -n "$INGRESS_NS" get service "$INGRESS_NAME" -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
    
    export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    
    # 生成されたイングレスアドレスを表示する
    echo $GATEWAY_URL
    # 出力例: 192.168.1.100:80
  3. デモ アプリケーションにアクセスできることを確認します。

    curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
    
    # 予期される出力
    <title>Simple Bookstore App</title>

6. トレースデータを表示する

  1. 次のコマンドを使用して製品ページに 10 回連続してアクセスし、テストトラフィックを生成します。

    for i in $(seq 1 10); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
  2. Managed Service for OpenTelemetry コンソール に移動して、Istio トレースデータを表示します。93

FAQ

問題: コンソールに Istio トレースデータが見つからない場合はどうすればよいですか?

解決策

  1. OpenTelemetry Collector のログを確認し、正しく実行されていて、Istio からレポートされたデータを受信していることを確認します。

    kubectl logs <collector-pod-name> -n <namespace>

    予期される出力:91

  2. サイドカーが正常に注入されたことを確認します。次のコマンドを実行して、各ポッドに istio-proxy コンテナーが存在するかどうかを確認します。

    kubectl get pod -n default -o custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

    CONTAINERS リストに istio-proxy コンテナーが表示されない場合は、注入に失敗しています。これは、ポッドがすでに作成された後に istio-injection=enabled ラベルが名前空間に適用されたことが原因である可能性があります。自動注入は新しいポッドにのみ適用されます。既存のポッドは、再起動されない限り影響を受けません。

  3. Telemetry リソースが正しく構成されているかどうかを確認します。

    • 次のコマンドを使用して、Telemetry 構成を確認します。

      kubectl get telemetry otel-demo -o yaml 
    • Istio ConfigMap の OpenTelemetry 関連の構成が正しいことを確認します。

      kubectl get cm istio -n istio-system -o yaml | grep -A 10 extensionProviders

参照

Istio OpenTelemetry