Istio笔记04-基于Jaeger的分布式链路追踪

介绍

在微服务网格场景下,服务调用拓扑复杂,故障定位、时延分析难度大幅提升。Istio 原生支持分布式追踪标准,可将调用跨度数据上报至链路追踪系统。本文基于Jaeger完整落地 Istio 网格内服务调用链路采集、可视化,覆盖部署、网格配置、流量验证、生产选型等核心环节。

部署验证

环境说明

K8S 版本:1.32

Istio 版本:1.22.8

追踪组件:all-in-one:1.76.0

追踪协议:OpenTelemetry

可以参考 Istio笔记01--快速体验Istio 快速部署k8s+istio基础环境。

部署 Jaeger

  1. 安装了istio后,直接用jaeger.yaml的all-in-one快速验证
    1.1 部署jaeger

    bash 复制代码
    $ kubectl apply -f istio-1.22.8/samples/addons/jaeger.yaml

    1.2 配置gw & vs
    gw yaml

    yaml 复制代码
    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      annotations: {}
      name: trace-gateway
      namespace: istio-system
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - prometheus.xg.com
        - grafana.xg.com
        - jaeger.xg.com
        port:
          name: http
          number: 80
          protocol: HTTP

    vs yaml

    yaml 复制代码
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      annotations: {}
      name: jaeger
      namespace: istio-system
    spec:
      gateways:
      - istio-system/trace-gateway
      hosts:
      - jaeger.xg.com
      http:
      - route:
        - destination:
            host: tracing
            port:
              number: 80

    gw + vs 就绪后,通过本地域名 http://jaeger.xg.com:31480/ 访问确保jaeger就绪

  2. 配置 Istio 开启链路追踪
    2.1 在集群istio 的configmap istio中新增 extensionProviders -> jaeger

    yaml 复制代码
    ...
        extensionProviders:
        - name: jaeger
          opentelemetry:
            port: 4317
            service: jaeger-collector.istio-system.svc.cluster.local
    ...

    2.2 在 kube-system 命名空间新增一个默认的Telemetry

    yaml 复制代码
    # tracing.yaml
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: default
      namespace: istio-system
    spec:
      tracing:
        - providers:
            - name: "jaeger"
          randomSamplingPercentage: 100.0 # 按需设置采集比率
          customTags:
            cluster:
              literal:
                value: "k8s-bj-xx-1-yy" # 可以按需更改为需要的集群
            request_method:
              header:
                name: ":method"
            request_path:
              header:
                name: ":path"

验证

  1. 相关测试服务域名

    按需准备如下测试域名,当前没有接入LB,直接指向gw svc对应的31480端口

    http://test-nginx.xg.com:31480/

    http://bookinfo.xg.com:31480/

    http://jaeger.xg.com:31480/

  2. 快速产生测试数据

    按需快速产生一些数据

    bash 复制代码
    1) 在外部快速访问 bookinfo
    for i in $(seq 1 100); do curl -s -o /dev/null "http://bookinfo.xg.com:31480/productpage"; done
    
    2) 在外部快速访问 http://test-nginx.xg.com:31480/$i
    for i in $(seq 1 100); do curl --connect-timeout 2 -s -o /dev/null "http://test-nginx.xg.com:31480/$i"; done
    
    3)在nginx 里面访问该服务:
    for i in $(seq 1 100); do curl -s -o /dev/null "http://productpage.default:9080/productpage"; done
  3. 前端展示

    上述3种测试都可以正常看到其请求链路和对应的耗时、接口信息,能查看服务-服务的链路信息

    3.1 从 外部访问bookinfo

    3.2 从外部访问nginx

    3.3 从内部 nginx pod 直接访问 productpage.default

注意事项

  1. 如何单独根据traceid查询?

    直接在上面输入框内输入traceid即可检索

  2. 如何根据x-request-id查询?

    用户获取请求id(从日志或者istio sidecar里面查询), 然后在Search那里选中目标服务,在Tags那里输入 guid:x-request-id=4f05f59b-83d9-9c1f-9e45-604a5019853a 即可查看指定x-request-id的请求链路信息

  3. 生产环境怎么部署?

    可以使用官方的helm chart部署,后端按需选择为 Elasticsearch 或者 Cassandra。

    选型结论:

    3.1 选择 Elasticsearch

    业务需要依据自定义标签(X-Request-ID、错误码、接口名)检索链路;排查方式多样化。 代价:做好分片规划、ILM 冷热索引、控制写入压力。

    3.2 选择 Cassandra

    只有一个查询方式:已知 TraceID 查链路;不需要任何标签检索;集群 Span 量级极大,优先保障写入稳定。

    对比项 Cassandra Elasticsearch
    写入性能 极高。顺序时序写入,高吞吐、低写入抖动,适合大规模微服务海量 Span。 写入低于 Cassandra;存在段合并压力,流量极高需精细调优(分片、刷新间隔)。
    检索能力 短板。仅主键 TraceID 高效查询;Tag / 自定义字段过滤无索引,全表扫描,基本不可用。 强项。支持 Span Tag、http.x_request_id 等标签过滤、模糊检索、聚合统计,满足业务按 X-Request-ID、接口名检索需求。
    存储成本 压缩优秀;冷数据 TTL 清理友好。 同等数据量磁盘占用更高;开启多字段索引会进一步放大存储。
    扩缩容 横向扩容简单;重平衡数据流可控,但运维门槛高(修复未压实分区、GC 调优)。 分片扩容、重建索引成本高;大规模集群运维复杂度更高。
    故障恢复 节点宕机数据依赖副本,修复周期较长。 分片副本机制;容易出现分片不可用、unassigned 分片问题。
    典型适用场景 只通过TraceID 查询链路;追求超高写入吞吐量;几乎不用标签检索。 需要按 Tag、RequestID、接口、状态码检索链路;经常模糊排查问题(你的业务场景首选)。
    TTL 清理 原生支持按时间分区,过期数据删除轻量化。 依靠索引生命周期 ILM,定期删除整个索引,粒度为索引级别,无法单条删除 Span。
  4. 采样率不要长期保持 100%,线上根据流量规模灵活调整为 5%~50%.

参考文档

  1. www.jaegertracing.io
  2. www.jaegertracing.io/demo
  3. istio doc -> 分布式追踪的常见问题
  4. Jaeger存储后端选择:Elasticsearch与Cassandra对比分析
相关推荐
学计算机的计算基2 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
AOwhisky2 小时前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
砚凝霜2 小时前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm
遇乐的果园15 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
wWYy.15 小时前
分布式:数据复制
分布式
遇乐的果园16 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
摇滚侠17 小时前
Java 全栈开发实战教程 课程笔记 29-33
笔记
茯苓gao17 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
whyTeaFo18 小时前
GAMES101: Lecture 9: Shading 3(Texture Mapping cont.) ppt笔记
笔记