Kubernetes 当通过入口控制器访问服务时,x-b3采样头始终设置为0

Kubernetes 当通过入口控制器访问服务时,x-b3采样头始终设置为0,kubernetes,trace,istio,Kubernetes,Trace,Istio,我已经在Kubernetes 1.17.5和Istio 1.6.8中安装了演示配置文件 这是我的测试设置[nginx入口控制器]->[proxyServiceA]->[proxyServiceB] serviceA和serviceB的代理由Istio自动注入(Istio注入=已启用) Nginx ingress controller未启用跟踪,并且没有作为侧车的特使代理 ServiceA将跟踪头向下传递给ServiceB 我正在尝试跟踪从ServiceA到ServiceB的呼叫,目前不关心入口

我已经在Kubernetes 1.17.5和Istio 1.6.8中安装了演示配置文件

这是我的测试设置[nginx入口控制器]->[proxyServiceA]->[proxyServiceB]

  • serviceA和serviceB的代理由Istio自动注入(Istio注入=已启用)
  • Nginx ingress controller未启用跟踪,并且没有作为侧车的特使代理
  • ServiceA将跟踪头向下传递给ServiceB
  • 我正在尝试跟踪从ServiceA到ServiceB的呼叫,目前不关心入口->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

我试过的东西很少

  • 我已经向ServiceA添加了网关和VirtualService,以通过Istio ingressgateway公开它。当我通过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
    

    经过几天的挖掘,我终于找到了答案。问题在于nginx入口控制器使用的
    x-request-id
    头的格式

    特使代理希望它是一个UUID(例如,
    x-request-id:3e21578f-cd04-9246-aa50-67188d790051
    ),但ingrex控制器将其作为非格式化随机字符串传递(
    x-request-id:60E82827A270070CFBDA3C6F30F478A
    )。当我将请求中格式正确的x-request-id头传递给入口控制器时,它将传递给特使代理,请求将按预期进行采样。我也试着移除
    从入口控制器到ServiceA的请求的x-request-id头,带有一个简单的EnvoyFilter。而且它也像预期的那样工作。特使代理生成了一个新的x-request-id,并且正在跟踪请求。

    我已经向ServiceA添加了网关和虚拟服务,以通过Istio ingressgateway公开它。当我通过ingressgateway发送流量时,一切正常。
    我会说它正常工作,如istio中所述
    建议使用istio网关,而不是Ingress,以利用istio提供的完整功能集,例如丰富的流量管理和安全功能。
    因此我假设其中有一个功能。是的,通过ingressgateway发送请求的工作方式与预期相同。但我们通过入口控制器提供大量流量,它对我们有效。用istio ingressgateway替换它来解决跟踪问题目前变化太大。当我用任何其他服务替换ingress controller并从集群内部初始化对serviceA的请求时,它工作正常。所以我认为这与请求从集群外部转发这一事实有关。我正在尝试重新配置入口控制器,以删除向上游服务的请求中的所有X-Forwarded-*头,从而诱使特使“认为”该请求是本地的。我也有类似的问题,但在ingress nginx上,我有一个特使侧车,以便在ingress控制器吊舱和其他服务之间使用mTLS。来自ingress nginx的请求x-request-id报头的格式是:“4668081de0d9e63cae60680710a23cfd”,但这不是由特使创建的,因为ingress nginx不会自行创建该报头(和其他b3-报头)?所以我想知道为什么特使没有以正确的UUID格式格式化请求id。