分布式追踪 常见问题解答
Istio 中的分布式追踪是如何工作的?
Istio 使用基于 Envoy 的追踪与分布式追踪系统集成。通过基于 Envoy 的追踪集成,应用程序负责转发追踪头以进行后续的传出请求。
您可以在 Istio 分布式追踪 (Jaeger、Lightstep、Zipkin) 任务以及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
基于 Envoy 的追踪是如何工作的?
对于基于 Envoy 的追踪集成,Envoy(边车代理)代表被代理的应用程序直接将追踪信息发送到追踪后端。
Envoy
- 在请求流经代理时生成请求 ID 和追踪头(例如,
X-B3-TraceId
) - 根据请求和响应元数据(例如,响应时间)为每个请求生成追踪跨度
- 将生成的追踪跨度发送到追踪后端
- 将追踪头转发到被代理的应用程序
Istio 支持Lightstep和Zipkin的基于 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 目前不支持发布/订阅和事件总线协议。任何使用这些技术的行为都是尽力而为的,并且可能会出现故障。