分布式追踪定义
分布式追踪是一种用来跟踪分布式系统中请求的方法,它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念:TraceID 和 SpanID。
TraceID 是一个++++全局唯一++++的 ID,用来标识一个请求的追踪信息。一个请求的所有追踪信息都属于同一个 TraceID,TraceID 在整个请求的追踪过程中都是不变的;
SpanID 是一个++++局部唯一++++的 ID,用来标识一个请求在某一时刻的追踪信息。一个请求在不同的时间段会产生不同的 SpanID,SpanID 用来区分一个请求在不同时间段的追踪信息;
TraceID 和 SpanID 是分布式追踪的基础,它们为分布式系统中请求的追踪提供了一个统一的标识,方便用户查询、管理和分析请求的追踪信息。
分布式追踪的过程:
当一个系统收到请求后,分布式追踪系统会为该请求分配一个 TraceID,用于串联起整个调用链;
分布式追踪系统会为该请求在系统内的每一次服务调用生成一个 SpanID 和 ParentID,用于记录调用的父子关系,没有 ParentID 的 Span 将作为调用链的入口;
每个服务调用过程中都要传递 TraceID 和 SpanID;
在查看分布式追踪时,通过 TraceID 查询某次请求的全过程;
2.Istio如何实现分布式追踪
Istio 中的分布式追踪是基于数据平面中的 Envoy 代理实现的。服务请求在被劫持到 Envoy 中后,Envoy 在转发请求时会附加大量 Header,Istio 通过在服务网格中自动注入代理(Envoy)来拦截服务间的通信。这些代理能够收集和传播追踪相关的上下文信息,如请求 ID、跨度(Span)等。分布式追踪的核心思想是跟踪一个请求在多个服务之间的流转过程,通过记录每个服务处理请求的时间跨度等信息,构建出完整的请求链路。
Envoy 会在 Ingress Gateway 中为你产生用于追踪的 Header,不论你的应用程序使用何种语言开发,Envoy 都会将这些 Header 转发到上游集群。但是,你还要对应用程序代码做一些小的修改,才能为使用分布式追踪功能。这是因为应用程序无法自动传播这些 Header,可以在程序中集成分布式追踪的 Agent,或者在代码中手动传播这些 Header。Envoy 会将追踪数据发送到 tracer 后端处理,然后就可以在 UI 中查看追踪数据了。
Istio-Jaeger
(1)Jaeger介绍
Jaeger是由Uber开源的分布式追踪系统,它采用Go语言编写,主要借鉴了Google Dapper论文和Zipkin的设计,兼容OpenTracing以及Zipkin追踪格式,目前已经成为CNCF基金会的开源项目。
Istio和Jaeger可以无缝集成,通过Istio的Telemetry API,我们可以将分布式追踪数据发送到Jaeger进行展示和分析。
通过Istio和Jaeger的结合使用,我们可以轻松地实现微服务架构中的分布式追踪。这不仅有助于我们更好地监控和调试服务之间的调用关系,还可以帮助我们优化系统性能和提高可靠性。在实际应用中,我们可以根据具体需求对Istio和Jaeger进行配置和定制,以满足不同的业务场景和性能要求。
(2)Jaeger实施
搭建Istio网格服务,搭建过程省略
安装jaeger
在Istio的目录下存放了官方提供的jaeger的基础运行环境的yaml文件,该文件在samples/addons/jaeger.yaml
直接运行即可,为了访问可视化,将其service的port类型改为NodePort
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| apiVersion: v1 kind: Service metadata: name: tracing namespace: istio-system labels: app: jaeger spec: type: NodePort ports: - name: http-query port: 80 protocol: TCP targetPort: 16686 # Note: Change port name if you add '--query.grpc.tls.enabled=true' - name: grpc-query port: 16685 protocol: TCP targetPort: 16685 selector: app: jaeger |
| 搭建jaeger [root@master istio-1.17.3]# kubectl apply -f samples/addons/jaeger.yaml deployment.apps/jaeger created service/tracing created service/zipkin created service/jaeger-collector created |
Jaeger搭建完成。部署Bookinfo进行测试:
Bookinfo 应用程序启动并运行时,访问 http://$GATEWAY_URL/productpage 一次或多次以生成追踪信息。
要查看追踪数据,必须向服务发送请求。请求的数量取决于 Istio 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 1%。在第一个跟踪可见之前,您需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求:
|----------------------------------------------------------------------------------------------------------------------------|
| [root@master istio-1.17.3]# for i in `seq 1 100`; do curl -s -o /dev/null http://192.168.128.5:31870/productpage; done |
此时进入jaeger的可视化界面进行查看
服务选择productpage.default选项进行FindTraces
页面信息有:
通过 "Lookup by Trace ID. About Jaeger v" 查找跟踪 ID。
显示了一个名为 "productpage e749dee" 的条目及相关信息,包括 "istio-ingressgateway.istio-system: productpage.default.svc.cluster.local.9080/" 等。
给出了 "Trace Start November 12 2024, 13:23:40.530 Duration 663.56ms" 的跟踪起始时间和持续时间。
列出了 "Services 5 Depth 6 Total Spans 8 165.89ms" 等不同阶段的时间信息。
展示了各个服务及操作的时间信息,如 "istio-ingressgateway.istio-system productpage default svc. dustet locat 908 productpage default productpage. default svc.cluster locat 900/productpage" 以及对应的时间如 "2.86ms""2.31ms""9ms""633.09ms""17.73ms""781usl"。
Istio-zipkin
Istio-Zipkin
Zipkin介绍
Zipkin是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储展现、查找和我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源,除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin搭建
在Istio的拓展文件中存放了Zipkin的yanl文件,执行即可
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| apiVersion: apps/v1 kind: Deployment metadata: name: zipkin namespace: istio-system labels: app: zipkin spec: selector: matchLabels: app: zipkin template: metadata: labels: app: zipkin sidecar.istio.io/inject: "false" spec: containers: - name: zipkin image: openzipkin/zipkin-slim:2.23.14 env: - name: STORAGE_METHOD value: "mem" readinessProbe: httpGet: path: /health port: 9411 initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: tracing namespace: istio-system labels: app: zipkin spec: type: NodePort ports: - name: http-query port: 80 protocol: TCP targetPort: 9411 selector: app: zipkin --- apiVersion: v1 kind: Service metadata: labels: name: zipkin name: zipkin namespace: istio-system spec: ports: - port: 9411 targetPort: 9411 name: http-query selector: app: zipkin |
Zipkin服务启动成功,查看服务
部署Bookinfo服务进行测试
浏览器访问:http://192.168.128.5:30987/
|----------------------------------------------------------------------------------------------------------------------------|
| [root@master istio-1.17.3]# for i in `seq 1 100`; do curl -s -o /dev/null http://192.168.128.5:30093/productpage; done |
查看zipkin界面:
追踪由一组 Span 组成,其中每个 Span 对应一个 Bookinfo Service,这些服务在执行 /productpage 请求或 Istio 内部组件时被调用,例如:istio-ingressgateway。