x-b3-sampled 헤더는 수신 컨트롤러를 통해 서비스에 액세스 할 때 항상 0으로 설정됩니다.
데모 프로필과 함께 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로 푸시되지 않는다는 것입니다.
내가 시도한 몇 가지
- Istio ingressgateway를 통해 노출되도록 ServiceA에 Gateway 및 VirtualService를 추가했습니다. Ingressgateway를 통해 트래픽을 보내면 모든 것이 예상대로 작동합니다. 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 (예 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를 생성하고 요청이 추적됩니다.