YAZONG 我的开源

Kubernetes(十三)istio(13.12)分布式追踪Jaeger

  , , ,
0 评论0 浏览

分布式追踪可以让用户对跨多个分布式服务网格的 1 个请求进行追踪分析。

Istio 利用 Envoy 的分布式追踪功能提供了开箱即用的追踪集成。确切地说,Istio 提供了安装各种各种追踪后端服务的选项,并且通过配置代理来自动发送追踪 span 到追踪后端服务。

(并不是完全自动化的,比如A服务到XX到B服务,必须要把span带过去。)

上下文传递

尽管Istio 代理能够自动发送 span,但是他们需要一些附加线索才能将整个追踪链路关联到一起。

所以当代理发送span 信息的时候,应用需要附加适当的 HTTP 请求头信息,这样才能够把多个 span 正确的关联到同一个追踪上。

要做到这一点,应用程序从传入请求到任何传出的请求中需要包含以下请求头参数:

- x-request-id
- x-b3-traceid
- x-b3-spanid
- x-b3-parentspanid
- x-b3-sampled
- x-b3-flags
- x-ot-span-context

例如,如果你看Python 的 productpage 服务这个例子,可以看到这个应用程序使用了 OpenTracing 库从 HTTP 请求中提取所需的头信息:


def getForwardHeaders(request):

    headers = {}

 

    # x-b3-*** headers can be populated using the opentracing span

    span = get_current_span()

    carrier = {}

    tracer.inject(

        span_context=span.context,

        format=Format.HTTP_HEADERS,

        carrier=carrier)

 

    headers.update(carrier)

 

    # ...

 

    incoming_headers = ['x-request-id']

 

    # ...

 

    for ihdr in incoming_headers:

        val = request.headers.get(ihdr)

        if val is not None:

            headers[ihdr] = val

 

    return headers

在reviews 这个应用中(Java)也做了类似的事情:


@GET

@Path("/reviews/{productId}")

public Response bookReviewsById(@PathParam("productId") int productId,

                            @HeaderParam("end-user") String user,

                            @HeaderParam("x-request-id") String xreq,

                            @HeaderParam("x-b3-traceid") String xtraceid,

                            @HeaderParam("x-b3-spanid") String xspanid,

                            @HeaderParam("x-b3-parentspanid") String xparentspanid,

                            @HeaderParam("x-b3-sampled") String xsampled,

                            @HeaderParam("x-b3-flags") String xflags,

                            @HeaderParam("x-ot-span-context") String xotspan) {

 

  if (ratings_enabled) {

    JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

当你在应用程序中进行下游调用时,请确保包含这些请求头。

真正不会这么写,要有一个插件或者像skywalking有个agent。

追踪采样

默认情况下,使用demo 配置文件安装时,Istio 会捕获所有请求的追踪信息。例如,当使用上面的 Bookinfo 示例应用时,每次访问 /productpage 接口时,你都可以在 dashboard 中看到一条相应的追踪信息。此采样频率适用于测试或低流量网格。

对于高流量网格你可以通过下面的两种方法之一来降低追踪采样频率:

(在这两种情况下,有效值的范围从 0.0 到 100.0,精度为 0.01。)

在运行中的网格,可以通过编辑 istio-pilot deployment 并通过以下步骤来改变环境变量:
# 1)运行下面的命令来打开编辑器并加载 deployment 配置文件:
[root@node-2 istio-1.9.5]# kubectl -n istio-system edit deploy istiod
        - name: PILOT_TRACE_SAMPLING
          value: "100"
# 2)找到 PILOT_TRACE_SAMPLING 环境变量,将 value: 设置成你想要的百分比。

Zipkin vs Jaeger

Zipkin早于Jaeger,是Google Dapper的开源版本,由Twitter进一步开发。Zipkin基于Java语言的应用程序,其中包含很多服务,每个服务都实现Zipkin具体的某一个功能,并包括一个用户界面和用于跟踪软件系统框架的界面。Zipkin支持大多数流行的高级语言,包括C#,Java和JavaScript。  

Jaeger由Uber创建,用Go语言编写。它除了Zipkin的功能集外,Jaeger还提供了动态采样,REST API,基于React的UI界面。为了实现这些功能,Jaeger相比Zipkin采取了一种不同的,更分散的方法。  

Jaeger的分布式体系结构使其具有高度可扩展性。Jaeger还具有独特的数据收集方式:与其他尝试收集轨迹和跨度(spans)的系统不同,Jaeger会对监视的数据进行动态采样。这种方法不仅可以处理突然的流量激增,而且可以提高Jaeger的整体性能。  

从github上对比来看,它们的star数差别不大,也就侧面说明了出道更晚的Jaeger更受欢迎。从commits历史看,Zipkin从2021年开始就几乎没有多少更新了。而Jaeger一直处于持续的更新中。

访问jaegerUI

##### 修改jager的service为nodePort

[root@node-2 istio-1.9.5]# kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
   labels:
     app: jaeger
   name: tracing
   namespace: istio-system
spec:
   ports:
   - name: http-query
     port: 80
     nodePort: 30686
     protocol: TCP
     targetPort: 16686
   selector:
     app: jaeger
   type: NodePort
EOF
service/tracing configured


[root@node-2 istio-1.9.5]# kubectl get svc tracing -n istio-system              
NAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
tracing   NodePort   10.200.62.68   <none>        80:30686/TCP   3h29m

访问:”http://10.0.0.22:30686/”
访问”http://10.0.0.22:32274/productpage”,刷新一次或多次以生成追踪信息。

image.png

#选择JSON可看到JSON串,包括TRACE-ID。

image.png

image.png

#都是V1版本,对比没意义。这里搞个V2的。
[root@node-2 istio-1.9.5]# kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews configured
#用完V2删掉
[root@node-2 istio-1.9.5]# kubectl delete -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml   
virtualservice.networking.istio.io "reviews" deleted
访问”http://10.0.0.22:32274/productpage”,刷新一次或多次以生成追踪信息。

#对比右边V1和左边V2。红色:右边比左边少的。绿色:右边比左边多的。

image.png

image.png


标题:Kubernetes(十三)istio(13.12)分布式追踪Jaeger
作者:yazong
地址:https://blog.llyweb.com/articles/2022/12/24/1671816663917.html