x-b3-sampled 헤더는 수신 컨트롤러를 통해 서비스에 액세스 할 때 항상 0으로 설정됩니다.

Aug 20 2020

데모 프로필과 함께 Kubernetes 1.17.5 및 Istio 1.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. Istio ingressgateway를 통해 노출되도록 ServiceA에 Gateway 및 VirtualService를 추가했습니다. Ingressgateway를 통해 트래픽을 보내면 모든 것이 예상대로 작동합니다. 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 (예 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를 생성하고 요청이 추적됩니다.