入力コントローラを介してサービスにアクセスする場合、x-b3-sampledヘッダーは常に0に設定されます

Aug 20 2020

Kubernetes1.17.5とIstio1.6.8がデモプロファイルとともにインストールされています。

そして、これが私のテストセットアップです[nginx-ingress-controller]-> [proxy <-> ServiceA]-> [proxy <-> ServiceB]

  • serviceAおよびserviceBのプロキシは、Istioによって自動注入されます(istio-injection = enabled)
  • Nginx入力コントローラーでトレースが有効になっておらず、サイドカーとしてのエンボイプロキシがありません
  • ServiceAはトレースヘッダーをServiceBに渡します
  • ServiceAからServiceBへの呼び出しをトレースしようとしていますが、現時点ではIngress-> ServiceAスパンを気にしません

入力コントローラーにリクエストを送信すると、ServiceAが必要なすべてのトレースヘッダーをプロキシから受信していることがわかります。

x-b3-traceid: d9bab9b4cdc8d0a7772e27bb7d15332f
x-request-id: 60e82827a270070cfbda38c6f30f478a
x-envoy-internal: true
x-b3-spanid: 772e27bb7d15332f
x-b3-sampled: 0
x-forwarded-proto: http

問題は、x-b3-sampledが常に0に設定されており、スパン/トレースがJaegerにプッシュされていないことです。

私が試したことはほとんどありません

  1. ゲートウェイとVirtualServiceをServiceAに追加して、Istioingressgatewayを介して公開しました。入口ゲートウェイを介してトラフィックを送信すると、すべてが期待どおりに機能します。JaegerUIでトレース[ingress-gateway]-> [ServiceA]-> [ServiceB]を見ることができます
  2. また、カスタム構成を使用してIstioをインストールし、関連するパラメーターのトレースを試してみましたが、うまくいきませんでした。

これが私が使おうとした設定です

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    defaultConfig:
      tracing:
        sampling: 100
  addonComponents:
    tracing:
      enabled: true
    grafana:
      enabled: false
    istiocoredns:
      enabled: false
    kiali:
      enabled: false
    prometheus:
      enabled: false
  values:
    tracing:
      enabled: true
    pilot:
      traceSampling: 100

回答

3 arkadi4 Aug 25 2020 at 22:46

数日掘った後、私はそれを理解しました。問題は、x-request-idnginx入力コントローラーが使用するヘッダーの形式にあります。

EnvoyプロキシはそれがUUID(eg x-request-id: 3e21578f-cd04-9246-aa50-67188d790051)であることを想定していますが、ingrexコントローラーはそれをフォーマットされていないランダム文字列(x-request-id: 60e82827a270070cfbda38c6f30f478a)として渡します。適切にフォーマットされたx-request-idヘッダーをリクエストで入力コントローラーに渡すと、そのヘッダーはエンボイプロキシに渡され、リクエストは期待どおりにサンプリングされます。また、単純なEnvoyFilterを使用して、入力コントローラーからServiceAへの要求からx-request-idヘッダーを削除しようとしました。また、期待どおりに機能します。Envoyプロキシは新しいx-request-idを生成し、リクエストがトレースされます。