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

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

时间:2023-12-14 09:12:07浏览次数:35  
标签:sample kubectl fsm 网格 OpenTelemetry 跟踪 分布式

在上一篇文章中,介绍了 如何在 k8s 中无侵入安装 Otel 探针 并实现了无侵入(某些语言还无法实现,比如 Go 的 eBPF 对内核的苛刻要求)的分布式跟踪。

这篇文章发出后有读者评论 javaagent 的“无侵入”一说,这里有必要解释下。“无侵入”主要指的是不需要修改应用程序的业务逻辑代码就能实现的功能,对应用程序透明无感知,让开发者专注于业务开发;同时由于无需修改应用程序代码,更易于集成;同时还维护简单,在多种语言、框架间保证功能的一致性

而 Java Agent 在 JVM 启动时加载,它在运行时修改字节码来注入跟踪代码,而不是在应用程序的源代码层面上进行修改。

背景

分布式跟踪

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

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

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

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

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

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

演示

架构

环境配置

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 代理的跨度数据。

关注"云原生指北"公众号
(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

标签:sample,kubectl,fsm,网格,OpenTelemetry,跟踪,分布式
From: https://www.cnblogs.com/addozhang/p/17900418.html

相关文章

  • 分布式学习记录:第4天
       在分布式学习的探索之旅中,第四天我深入了解了分布式学习的并行计算和负载均衡技术。首先,我学习了分布式学习的并行计算技术。并行计算是分布式学习的重要手段之一,它可以通过将计算任务分配给多个计算节点,同时进行计算,以加速模型的训练过程。我学习了不同的并行计算方法,如数......
  • 分布式进阶-链路追踪SpringCloudSleuth、Zipkin【实战篇】
    一、前言我们在使用微服务的时候,往往设计到各个微服务之间的调用,肯定会存在深度的调用链路,如果出现BUG或者异常,就会让问题定位和处理效率非常低。有了Sleuth,就可以帮助我们记录、跟踪应用程序中的请求和操作。通常与Zipkin配合使用,从而提供更全面的可视化应用程序跟踪和分析功......
  • 在 Kubernetes 中无侵入安装 OpenTelemetry 探针
    背景OpenTelemetry探针OpenTelemetry(简称Otel,最新的版本是1.27)是一个用于观察性的开源项目,提供了一套工具、APIs和SDKs,用于收集、处理和导出遥测数据(如指标、日志和追踪信息)。应用程序遥测数据(如追踪、指标和日志)的收集是通过探针来完成的,探针通常以库的形式集成到应用......
  • select for update在springboot里实现分布式锁
    //mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁@Select("<script>select*fromfoowhereid=#{id}forupdate</script>")FooselectForUpdateById(@Param("id")Longid);//service,必须加事物,否则selectForUpdateById无法实现分布式锁的作用@Transac......
  • torch 多进程训练和分布式训练
    通常来说,多进程没有涉及到梯度同步的概念。分布式则设计梯度同步。分布式中,如果用cpu,则指定gloo后端。用gpu,则指定nccl后端。多进程训练只需要mp.spawn即可,每个进程只负责自己的模型训练,不涉及梯度同步。例子https://www.geeksforgeeks.org/multiprocessing-in-python-and-py......
  • 分布式学习记录:实践与体验
    第二天,我继续深入分布式学习的世界,通过实践来加深对分布式学习的理解。首先,我参与了一个分布式学习项目,负责其中一个计算节点的训练任务。这个项目使用了一种基于梯度下降的分布式学习算法,每个计算节点都拥有自己的数据子集,并独立进行模型训练。我负责其中一个节点的训练过程,通过不......
  • 分布式学习记录:探索与优化
    经过前面的学习,我对分布式学习有了基本的认识和理解。然而,分布式学习是一个充满挑战和机遇的领域,需要不断探索和优化。今天,我继续深入学习分布式学习,进一步了解其应用和优化方法。首先,我学习了分布式学习的调参技巧。在分布式学习中,参数的选择对学习效果有着重要的影响。我学习了如......
  • SQL server不同域之间搭建分布式可用性组
    配置AlwaysOn分布式可用性组要创建分布式可用性组,必须创建两个具有各自侦听程序的可用性组。然后将这些可用性组合并到分布式可用性组中。两个可用性组无需处于同一位置:它们可以跨物理机、虚拟机;跨内网、云上;跨有域、无域;甚至跨平台(如Linux、Windows)。只要两个可用性组可以......
  • Sermant:无代理服务网格架构解析及无门槛玩转插件开发
    本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者:华为云社区精选。本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计......
  • 分布式配置中心
    为什么要有分布式配置中心:1、项目背景现在有一个项目,使用SSM进行开发的,配置文件的话我们知道是一个叫做application.properties的文件。#业务参数相关配置user.register.default.name=小强user.register.default.sex=男这个配置文件会在项目启动的时候被加载到内......