下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:匿名     来源: 云计算点击数:245发布时间: 2023-12-11 14:53:53

标签: 服务网格协同分布式

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

  这篇文章发出后有读者评论 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 命名空间。

  复制

  1.  kubectl create namespace sample

      2.

  3.  kubectl apply -n sample -f - <<eof< p="">

  4.  apiVersion: opentelemetry.io/v1alpha1

  5.  kind: Instrumentation

  6.  metadata:

  7.  name: instrumentation-sample

  8.  spec:

  9.  propagators:

  10.  - b3multi

  11.  sampler:

  12.  type: parentbased_traceidratio

  13.  argument: "1"

  14.  env:

  15.  - name: OTEL_EXPORTER_OTLP_ENDPOINT

  16.  value: otel-collector.default:4318

  17.  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 作为输出目的地。

  复制

  1.  kubectl apply -f - <<eof< p="">

  2.  apiVersion: opentelemetry.io/v1alpha1

  3.  kind: OpenTelemetryCollector

  4.  metadata:

  5.  name: otel

  6.  spec:

  7.  config: |

  8.  receivers:

  9.  otlp:

  10.  protocols:

  11.  grpc:

  12.  http:

  13.  zipkin:

  14.  endpoint: "0.0.0.0:9411"

      15.

  16.  exporters:

  17.  otlp/jaeger:

  18.  endpoint: "jaeger.default:4317"

  19.  tls:

  20.  insecure: true

      21.

  22.  service:

  23.  pipelines:

  24.  traces:

  25.  receivers: [otlp, zipkin]

  26.  exporters: [otlp/jaeger]

  27.  EOF

  安装服务网格 FSM

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

  复制

  1.  system=$(uname -s | tr '[:upper:]' '[:lower:]')

  2.  arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')

  3.  release=v1.1.4

  4.  curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -

  5.   ./$system-$arch/fsm version

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

  复制

  1.  fsm install \\

  2.  --set=fsm.tracing.enable=true \\

  3.  --set=fsm.tracing.address=otel-collector.default \\

  4.  --set=fsm.tracing.port=9411 \\

  5.  --set=fsm.tracing.endpoint=/api/v2/spans

  部署示例应用

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

  复制

  1.  fsm namespace add sample

  2.  kubectl apply -n sample -f https://raw.githubusercontent.com/addozhang/http-sample/main/manifests/service-v1.yaml1.2.

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

  复制

  1.  kubectl get po -n sample

  2.  NAME READY STATUS RESTARTS AGE

  3.  service-c-66bf9dcc7b-pdj8p 2/2 Running 0 38s

  4.  service-b-586cfc5ccd-k9qrs 2/2 Running 0 37s

  5.  service-a-7cf7bc5bcc-tgjzz 2/2 Running 0 37s

  测试

  复制

  1.  pod_name="$(kubectl get pod -n sample -l app=service-a -o jsnotallow='{.items[0].metadata.name}')"

  2.  kubectl port-forward -n sample $pod_name 8080:8080 &

      3.

  4.  curl localhost:8080

  发送请求后,打开 Jaeger UI。

  复制

  1.  jaeger_pod="$(kubectl get pod -l app=jaeger -o jsnotallow='{.items[0].metadata.name}')"

  2.  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/

  来源: 云原生指北

    >>>>>>点击进入计算专题

赞(8)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程