首页 > 其他分享 >探索服务网格与 OpenTelemetry 的协同之分布式跟踪

探索服务网格与 OpenTelemetry 的协同之分布式跟踪

时间:2024-01-09 14:36:50浏览次数:30  
标签:sample kubectl fsm 网格 OpenTelemetry pod 分布式

背景

分布式跟踪

分布式跟踪是监控和诊断微服务请求流程的关键技术,也是可观测性的关键组成部分,提供了对微服务架构中复杂交互和性能问题的深入洞察。它通过提供服务间请求链路的清晰视图来管理复杂性,并帮助识别性能瓶颈、优化资源分配、快速定位和解决故障,提高系统的整体可靠性。

服务网格的无侵入式分布式跟踪

又是无侵入性!服务网格中的代理自动处理所有入站和出站的网络通信,自动捕获、记录和分析服务间的请求和响应的详细信息,如请求时间、持续时间、状态代码和其他元数据。这种 实现方式 对应用程序本身透明,并且较 Java Agent 在运行时修改字节码更加彻底。

这里有个前提是应用程序能够在请求中传递上下文信息,这样 sidecar 代理生成和发送的跟踪信息最终可以串联在一起,不会发生断链。

探索服务网格与 OpenTelemetry 的协同之分布式跟踪_流量管理

网格的无侵入式分布式跟踪虽然为我们展示了请求的链路,但是如上图所示每个跨度(span)都是 sidecar 代理的信息。

紧跟上篇文章之后,我们今天将探索 服务网格 FSM 与 OpenTelemetry 的集成,实现应用、网格的全链路分布式跟踪。

演示

架构

探索服务网格与 OpenTelemetry 的协同之分布式跟踪_分布式跟踪_02

环境配置

Jaeger、cert-manager 和 Otel operator 的安装,请参考 上一篇文章

配置 Instrumentation

接下来就是配置探针的安装和配置了,详细的配置说明,可以参考 Instrumentation API 文档

根据 FSM 分布式跟踪文档 的介绍,FSM 支持 Zipkin 的协议,因此在 propagators 中我们使用 b3multi,使用 B3 的多标头格式,在请求头中传递如下的信息:

  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags

这次使用 sample 命名空间。

kubectl create namespace sample

kubectl apply -n sample -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: instrumentation-sample
spec:
  propagators:
    - b3multi
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  env:
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: otel-collector.default:4318
EOF

配置 OpenTelemetry Collector

Otel 收集器的详细配置可以参考 官方文档

  • 接收器(receiver),我们配置 otlp 来接收来自应用程序的跟踪信息,使用 zipkin 来接收来自 sidecar 的上报,使用端点 0.0.0.0:9411
  • 输出器(exporter),配置 Jager 的 otlp 端点 jaeger.default:4317
  • 管道服务(pipeline service),使用 otlpzipkin 作为输入源,将 jaeger 作为输出目的地。
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
      zipkin:
        endpoint: "0.0.0.0:9411"

    exporters:
      otlp/jaeger:
        endpoint: "jaeger.default:4317"
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [otlp, zipkin]
          exporters: [otlp/jaeger]
EOF

安装服务网格 FSM

我们通过 CLI 来安装 FSM,现下载 FSM 使用当前最新的正式版 1.1.4。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.1.4
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version

在安装时,启用分布式跟踪并将地址指向 Otel Collector 的 zipkin 接收器,zipkin 接收器端点为 /api/v2/spans

fsm install \
  --set=fsm.tracing.enable=true \
  --set=fsm.tracing.address=otel-collector.default \
  --set=fsm.tracing.port=9411 \
  --set=fsm.tracing.endpoint=/api/v2/spans

部署示例应用

将命名空间 sample 加入到服务网格中,部署应用。

fsm namespace add sample
kubectl apply -n sample -f https://raw.githubusercontent.com/addozhang/http-sample/main/manifests/service-v1.yaml

确认应用 pod 注入 sidecar 并正常运行。

kubectl get po -n sample
NAME                         READY   STATUS    RESTARTS   AGE
service-c-66bf9dcc7b-pdj8p   2/2     Running   0          38s
service-b-586cfc5ccd-k9qrs   2/2     Running   0          37s
service-a-7cf7bc5bcc-tgjzz   2/2     Running   0          37s

测试

pod_name="$(kubectl get pod -n sample -l app=service-a -o jsonpath='{.items[0].metadata.name}')"
kubectl port-forward -n sample $pod_name 8080:8080 &

curl localhost:8080

发送请求后,打开 Jaeger UI。

jaeger_pod="$(kubectl get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}')"
kubectl port-forward $jaeger_pod 16686:16686 &

在 Jaeger UI 中,可以看到链路的内容更加的丰富:包含了应用程序和 sidecar 代理的跨度数据。

探索服务网格与 OpenTelemetry 的协同之分布式跟踪_微服务_03

标签:sample,kubectl,fsm,网格,OpenTelemetry,pod,分布式
From: https://blog.51cto.com/u_16455808/9161127

相关文章

  • 【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行
    内容介绍在本章内容中,我们将深入探讨Tomcat服务器的运行架构、LVS负载均衡的运行机制以及Cache缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。Servlet容器和Tomcat服务器Servlet容器是为JavaWeb应用提供运行时......
  • 避免重复扣款:分布式支付系统的幂等性原理与实践
    这是《百图解码支付系统设计与实现》专栏系列文章中的第(6)篇。本文主要讲清楚什么是幂等性原理,在支付系统中的重要应用,业务幂等、全部幂等这些不同的幂等方案选型带来的收益和复杂度权衡,幂等击穿场景及可能的严重后果。这也是支付公司面试的必考题目之一。专栏地址:百图解码支付系统......
  • 分布式I/O模块在轨道交通的作用
    随着科技的不断发展,轨道交通系统正逐渐向智能化、高效化的方向转型。在这个过程中,分布式I/O模块作为一种先进的控制技术,发挥着越来越重要的作用。分布式I/O模块能够实现轨道交通系统的集中控制和分散操作。可以监测轨道交通水位、桥梁位移等参数保障铁轨安全运行。通过将各个子系统......
  • Apache SeaTunnel:探索下一代高性能分布式数据集成工具
    大家下午好,我叫刘广东,然后是来自ApacheSeaTunnel社区的一名Committer。今天给大家分享的议题是下一代高性能分布式海量数据集成工具,后面的整个的PPT,主要是基于开发者的视角去看待ApacheSeaTunnel。后续所有的讲解主要是可能会硬核偏技术一点,主要是ApacheSeaTunnel流程当中的一......
  • 太强了!全新一代分布式任务调度与计算框架!
    大家好,我是Java陈序员。我们在工作开发中,离不开任务调度。通过指定的间隔时间执行各类操作,来完成无需用户操作的任务。目前市场上,有一些编程语言本身自带的定时任务工具,如Java中Timer。也有一些比较成熟的定时任务框架,如Quartz。现在大部分系统都是使用分布式,分布式的任务调度......
  • 无涯教程-Seaborn - 配对网格
    PairGrid允许无涯教程使用相同的绘图类型绘制子图网格以可视化数据。与FacetGrid不同,它为每个子图使用不同的变量对。它形成子图矩阵。有时也称为"散点图矩阵"。pairgrid的用法类似于facetgrid。首先初始化网格,然后传递绘图功能。importpandasaspdimportseabornassbfr......
  • 无涯教程-Seaborn - 多面网格
    FacetGrid最多可以绘制三个维度-row,col和hue,前两个与所得的轴数组有明显的对应关系,可以将色相变量视为沿深度轴的第三维,在其中用不同的颜色绘制不同的级别。FacetGrid对象将数据框作为输入,并将构成网格的行,列或色调维度的变量的名称作为输入。变量应为分类变量,变量每个级别的......
  • 分布式日志追踪ID实战 | 京东物流技术团队
    本文通过介绍分布式应用下各个场景的全局日志ID透传思路,以及介绍分布式日志追踪ID简单实现原理和实战效果,从而达到通过提高日志查询排查问题的效率。背景开发排查系统问题用得最多的手段就是查看系统日志,相信不少人都值过班当过小秘吧:给下接口和出入参吧,麻烦看看日志里的有没有异常......
  • 8.Elasticsearch,分布式搜索引擎
    1.Elasticsearch入门Elasticsearch简介一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展,每秒可以处理PB级海量数据。Elasticsearch术语索引、类型、文档、字段。集群、节点、分片、副本。术......
  • fugue 分布式计算通用接口
    fugue提供了通用方便分布式计算的接口,可以高效的访问大数据项目,提供了python,pandas,sql等模式如下图从上图可以看出fugue提供了一个语义层,我们的计算任务可以运行在ray,dask,spark,以及duckdb中参考架构可以看出fugue提供了不少方便的能力,比如sql,机器学习,以及流处理说明对于搞机器......