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

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

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

背景

分布式跟踪

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

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

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

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

图片

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

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

演示

架构

图片

环境配置

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

配置 Instrumentation

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

根据 FSM 分布式跟踪文档[4] 的介绍,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 收集器的详细配置可以参考 官方文档[5]。

  • 接收器(receiver),我们配置 otlp 来接收来自应用程序的跟踪信息,使用 zipkin 来接收来自 sidecar 的上报,使用端点 0.0.0.0:9411。
  • 输出器(exporter),配置 Jager 的 otlp 端点 jaeger.default:4317。
  • 管道服务(pipeline service),使用 otlp 和 zipkin 作为输入源,将 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 jsnotallow='{.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 jsnotallow='{.items[0].metadata.name}')"
kubectl port-forward $jaeger_pod 16686:16686 &

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

图片

参考资料

[1] 实现方式: https://fsm-docs.flomesh.io/guides/observability/tracing/

[2] 服务网格 FSM: http://fsm-docs.flomesh.io

[3] Instrumentation API 文档: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation

[4] FSM 分布式跟踪文档: https://fsm-docs.flomesh.io/guides/observability/tracing/

[5] 官方文档: https://opentelemetry.io/docs/collector/configuration/

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/244692.html<

(0)
运维的头像运维
上一篇2025-04-25 20:30
下一篇 2025-04-25 20:32

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注