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对比分析
相关推荐
乐橙开放平台19 分钟前
离岗检测怎么实现?通过客流相机或 AI 摄像头识别岗位区域无人状态,再推送告警消息
人工智能·笔记·后端·数码相机·物联网·自动化·音视频
真上帝的左手2 小时前
12. 消息队列-Kafka进阶
分布式·中间件·kafka
蒸蒸yyyyzwd10 小时前
AI应用相关可能的面试问题
笔记
叼烟扛炮11 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
蒸蒸yyyyzwd12 小时前
学习笔记 八股手撕
笔记·学习
揣一尾游鱼yu13 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
小李不想当小白15 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
瑞码空间17 小时前
JSP与Servlet核心开发与CRUD实战笔记
java·笔记·servlet·jsp
La Pulga17 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
wuyoutrans20 小时前
以色列专利OA答复翻译,重点要避开哪些坑?
笔记