分布式追踪与服务网格

构建支持追踪上下文传播的应用程序

虽然 Istio 代理可以自动发送 span,但需要额外的信息将这些 span 关联成单个追踪。应用程序必须在 HTTP 头中传播这些信息,以便代理发送 span 时,后端能够将它们合并成一个完整的追踪。

为此,每个应用程序必须收集每个传入请求的头信息,并将这些头信息转发到该传入请求触发的所有传出请求。要转发的头信息取决于配置的追踪后端。以下是摘要:

所有应用程序应转发以下头信息:

  • x-request-id:Envoy 特定的头,用于一致地采样日志和追踪。
  • traceparenttracestateW3C 标准头

对于其他可观测性工具,请参考其文档。

使用服务网格配置分布式追踪平台

Alauda Service Mesh 通过集成以下组件支持分布式追踪:

  • Alauda Build of Jaeger:基于开源 Jaeger 项目的定制发行版,提供对复杂分布式系统中请求的端到端可视化。

  • Alauda Build of OpenTelemetry:基于 OpenTelemetry 项目,该组件通过管理 OpenTelemetry Collector 和工作负载的自动化采集,简化了指标、日志和追踪的遥测数据收集。

OpenTelemetry Collector 作为遥测信号的中间层,支持多种数据格式,提供标准化的管道用于处理和导出遥测数据到如 Jaeger 等后端。

使用服务网格配置分布式追踪数据采集

您可以将 Alauda Service Mesh 与 OpenTelemetry 集成,实现对 OpenTelemetry 追踪、指标和日志的自动化采集、生成、收集和导出,以分析和理解软件的性能和行为。

前提条件

操作步骤

istio-system 命名空间安装一个 Jaeger 实例。

参考 部署 Jaeger 实例 中的安装脚本,使用以下示例命令部署 Istio 专用的 Jaeger

INFO

--jaeger-es-index-prefix 参数设置 Elasticsearch 中存储追踪数据的索引前缀。

  • 对于单集群服务网格,建议以集群名称结尾,例如 istio-tracing-cluster-1
  • 对于多集群服务网格,所有集群的追踪数据必须存储在同一索引中,建议以 meshID 结尾,例如 istio-tracing-mesh-1
./install-jaeger.sh \
  --es-url='https://xxx' \
  --es-user-base64='xxx' \
  --es-pass-base64='xxx' \
  --target-namespace='istio-system' \
  --jaeger-basepath-suffix='/istio/jaeger' \
  --jaeger-es-index-prefix='istio-tracing-xxx'

安装成功后,您可以通过 <platform-url>/clusters/<cluster>/istio/jaeger 访问 Jaeger UI 查询追踪。

在 OperatorHub 中找到 Alauda Build of OpenTelemetry,并在 istio-system 命名空间创建 OpenTelemetryCollector

istio-system 命名空间中的 OpenTelemetry Collector 示例

apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: istio-system
spec:
  observability:
    metrics: {}
  deploymentUpdateStrategy: {}
  config:
    processors:
      batch: {}
    exporters:
      debug: {}
      otlp:
        endpoint: 'dns:///jaeger-prod-collector-headless.istio-system:4317'
        balancer_name: round_robin
        tls:
          insecure: true
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: '0.0.0.0:4317'
    service:
      pipelines:
        traces:
          exporters:
            - debug
            - otlp
          processors:
            - batch
          receivers:
            - otlp
  1. endpoint 字段指向 istio-system 命名空间中的 Jaeger collector 服务。

更新 Istio 资源以启用追踪并定义 OpenTelemetry 追踪提供者:

示例:通过 meshConfig 启用追踪

apiVersion: sailoperator.io/v1
kind: Istio
metadata:
  name: default
  # ...
spec:
  namespace: istio-system
  # ...
  values:
    meshConfig:
      enableTracing: true
      extensionProviders:
      - name: otel
        opentelemetry:
          port: 4317
          service: otel-collector.istio-system.svc.cluster.local
  1. service 字段指向 istio-system 命名空间中的 OpenTelemetry collector 服务。

更新 Telemetry 资源以启用 meshConfig 中定义的追踪提供者:

Istio Telemetry 资源示例

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: asm-default
  namespace: istio-system
  # ...
spec:
  # ...
  tracing:
    - providers:
        - name: otel
      randomSamplingPercentage: 100
NOTE

确认能够看到追踪后,请降低 randomSamplingPercentage 的值以减少请求数量。