このトピックでは、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 トレースデータのレポート方法を構成する
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: {} EOFHTTP プロトコルを使用する
次のコマンドを実行します。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>の形式を使用します。
istio-otel-config.yaml ファイルを適用します。
istioctl install -y -f istio-otel-config.yaml
2. Istio のトレースを有効にする
トレースデータのレポートを構成した後、Istio トレースデータの収集を有効にし、サンプリング比率を設定する必要があります。次のコマンドを実行して、トレースを有効にします。
構成ファイル 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 に設定すると、すべてのリクエストのトレースデータが記録されます。本番環境では、実際のトラフィック状況に基づいてこの値を調整することをお勧めします。構成を適用します。
kubectl apply -f istio-telemetry.yaml上記の構成が完了すると、サービス間の呼び出しが発生したときに、Istio は自動的にトレースデータを生成し、OpenTelemetry Collector を介して Managed Service for OpenTelemetry に転送します。
3. Istio トレースデータを表示する
Managed Service for OpenTelemetry コンソール に移動して、Istio トレースデータを表示します。
サンプル演習
次のサンプル演習では、Istio トレースデータを収集し、Managed Service for OpenTelemetry にレポートする方法を示します。
1. Istio をインストールする
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.25.2
export PATH=$PWD/bin:$PATH2. OpenTelemetry Collector をインストールする
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 EOFobservabilityという名前のネームスペースを作成します。kubectl create namespace observabilityOpenTelemetry Collector をデプロイします。
kubectl apply -f otel.yaml -n observability
3. Istio トレースを構成する
クラスターで次のコマンドを実行すると、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次のコマンドを実行して、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. デモ アプリケーションをデプロイする
default名前空間の自動サイドカー注入を有効にします。Istio は、この名前空間に作成された新しいポッドにサイドカープロキシ(
istio-proxyコンテナー)を自動的に注入します。kubectl label namespace default istio-injection=enabledIstio に含まれるデモ アプリケーションをデプロイします(このコマンドは、展開された Istio ディレクトリから実行します)。
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yamlポッドとサービスのステータスを確認します。
kubectl get pods kubectl get servicesアプリケーションにアクセスできることを確認します。
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. デモ サービスの外部アクセスエントリを作成する
デモ アプリケーションのイングレスゲートウェイを作成します。
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yamlexport 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デモ アプリケーションにアクセスできることを確認します。
curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>" # 予期される出力 <title>Simple Bookstore App</title>
6. トレースデータを表示する
次のコマンドを使用して製品ページに 10 回連続してアクセスし、テストトラフィックを生成します。
for i in $(seq 1 10); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; doneManaged Service for OpenTelemetry コンソール に移動して、Istio トレースデータを表示します。

FAQ
問題: コンソールに Istio トレースデータが見つからない場合はどうすればよいですか?
解決策
OpenTelemetry Collector のログを確認し、正しく実行されていて、Istio からレポートされたデータを受信していることを確認します。
kubectl logs <collector-pod-name> -n <namespace>予期される出力:

サイドカーが正常に注入されたことを確認します。次のコマンドを実行して、各ポッドに
istio-proxyコンテナーが存在するかどうかを確認します。kubectl get pod -n default -o custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].nameCONTAINERSリストにistio-proxyコンテナーが表示されない場合は、注入に失敗しています。これは、ポッドがすでに作成された後にistio-injection=enabledラベルが名前空間に適用されたことが原因である可能性があります。自動注入は新しいポッドにのみ適用されます。既存のポッドは、再起動されない限り影響を受けません。Telemetry リソースが正しく構成されているかどうかを確認します。
次のコマンドを使用して、Telemetry 構成を確認します。
kubectl get telemetry otel-demo -o yamlIstio ConfigMap の OpenTelemetry 関連の構成が正しいことを確認します。
kubectl get cm istio -n istio-system -o yaml | grep -A 10 extensionProviders