入力コントローラを介してサービスにアクセスする場合、x-b3-sampledヘッダーは常に0に設定されます
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にプッシュされていないことです。
私が試したことはほとんどありません
- ゲートウェイとVirtualServiceをServiceAに追加して、Istioingressgatewayを介して公開しました。入口ゲートウェイを介してトラフィックを送信すると、すべてが期待どおりに機能します。JaegerUIでトレース[ingress-gateway]-> [ServiceA]-> [ServiceB]を見ることができます
- また、カスタム構成を使用して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
回答
数日掘った後、私はそれを理解しました。問題は、x-request-id
nginx入力コントローラーが使用するヘッダーの形式にあります。
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を生成し、リクエストがトレースされます。