分布式追踪 常见问题解答

Istio 中的分布式追踪是如何工作的?

Istio 使用基于 Envoy 的追踪与分布式追踪系统集成。通过基于 Envoy 的追踪集成,应用程序负责转发追踪头以进行后续的传出请求。

您可以在 Istio 分布式追踪 (JaegerLightstepZipkin) 任务以及Envoy 追踪文档中找到更多信息。

Istio 的分布式追踪需要什么条件?

Istio 支持报告网格内工作负载到工作负载通信的追踪跨度。但是,为了完整地查看流量流,将各种追踪跨度拼接在一起,应用程序必须在传入和传出请求之间传播追踪上下文。

特别是,Istio 依赖于应用程序传播 B3 追踪头以及 Envoy 生成的请求 ID。这些头包括

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • b3

如果您使用的是 Lightstep,您还需要转发以下头信息

  • x-ot-span-context

如果您使用的是 OpenTelemetry 或 Stackdriver,您还需要转发以下头信息

  • traceparent
  • tracestate

可以通过客户端库(例如ZipkinJaeger)或手动完成头部信息的传播,如分布式追踪任务中所述。

基于 Envoy 的追踪是如何工作的?

对于基于 Envoy 的追踪集成,Envoy(边车代理)代表被代理的应用程序直接将追踪信息发送到追踪后端。

Envoy

  • 在请求流经代理时生成请求 ID 和追踪头(例如,X-B3-TraceId
  • 根据请求和响应元数据(例如,响应时间)为每个请求生成追踪跨度
  • 将生成的追踪跨度发送到追踪后端
  • 将追踪头转发到被代理的应用程序

Istio 支持LightstepZipkin的基于 Envoy 的集成,以及所有兼容 Zipkin API 的后端,包括Jaeger

分布式追踪所需的 Istio 最小配置是什么?

启用了追踪的Istio 最小配置文件是 Istio 与兼容 Zipkin 的后端集成的唯一要求。

谁生成最初的 Zipkin (B3) HTTP 头?

如果请求中没有提供头信息,Istio 边车代理(Envoy)会生成最初的头信息

为什么 Istio 不能代替应用程序传播头部信息?

尽管 Istio 边车会处理关联应用程序实例的传入和传出请求,但它没有隐式的方法将传出请求与导致它们的传入请求关联起来。实现此关联的唯一方法是应用程序将相关信息(即头信息)从传入请求传播到传出请求。可以通过客户端库或手动完成头信息的传播。在Istio 的分布式追踪需要什么条件?中提供了进一步的讨论。

为什么我的请求没有被追踪?

从 Istio 1.0.3 开始,default配置配置文件中追踪的采样率已降至 1%。这意味着 Istio 捕获的 100 个追踪实例中只有 1 个会被报告到追踪后端。demo配置文件中的采样率仍然设置为 100%。有关如何设置采样率的更多信息,请参阅此部分

如果您仍然没有看到任何追踪数据,请确认您的端口是否符合 Istio端口命名约定,并且是否公开了相应的容器端口(例如,通过 pod 规范),以便边车代理(Envoy)能够捕获流量。

如果您只看到与出口代理关联的追踪数据,而没有看到与入口代理关联的追踪数据,这可能仍然与 Istio端口命名约定相关。从Istio 1.3开始,出口流量的协议会自动检测。

如何控制追踪的量?

Istio 通过 Envoy 目前支持基于百分比的追踪生成采样策略。有关如何设置此采样率的更多信息,请参阅此部分

如何禁用追踪?

如果您已安装启用了追踪的 Istio,您可以按如下方式禁用它

# Fill <istio namespace> with the namespace of your istio mesh.Ex: istio-system
TRACING_POD=`kubectl get po -n <istio namespace> | grep istio-tracing | awk '{print $1}'`
$ kubectl delete pod $TRACING_POD -n <istio namespace>
$ kubectl delete services tracing zipkin   -n <istio namespace>
# Now, manually remove instances of trace_zipkin_url from the file and save it.

然后按照分布式追踪任务的清理部分中的步骤操作。

如果您根本不需要追踪功能,则在安装 Istio 时禁用追踪

Istio 可以将追踪信息发送到外部兼容 Zipkin 的后端吗?

为此,您必须使用兼容 Zipkin 实例的完全限定域名。例如:zipkin.mynamespace.svc.cluster.local

Istio 是否支持 vert.x 事件总线消息的请求追踪?

Istio 目前不支持发布/订阅和事件总线协议。任何使用这些技术的行为都是尽力而为的,并且可能会出现故障。