使用 Service Mesh 配置分布式追踪平台

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

  • Alauda Build of Jaeger v2:基于开源 Jaeger 项目的定制发行版。它可以端到端地查看复杂分布式系统中的请求。在 v2 中,Jaeger 实例作为由 Alauda Build of OpenTelemetry v2 Operator 管理的 OpenTelemetryCollector 自定义资源进行部署。

  • Alauda Build of OpenTelemetry v2:基于 OpenTelemetry 项目,此 Operator 管理 Jaeger v2 实例和作为其前端的 OpenTelemetry Collector 的生命周期。

OpenTelemetry Collector 充当遥测信号的中间层。它支持多种数据格式,并提供用于处理遥测数据以及将其导出到 Jaeger 等后端的标准化管道。

使用 Service Mesh 配置分布式追踪数据收集

您可以通过部署 Jaeger v2 实例和 OpenTelemetry Collector,然后配置 Istio 通过它们导出追踪数据,将 Alauda Service Mesh 与 Alauda Distributed Tracing 集成。

Jaeger v2 实例和 OpenTelemetry Collector 并非 Service Mesh 专用组件:一对 Jaeger v2 和 OpenTelemetry Collector(默认部署在 jaeger-system 命名空间中)可以同时服务于 Service Mesh 和集群中的其他工作负载。本节仅介绍 Service Mesh 专用的配置;有关底层安装步骤,请参阅 Alauda Distributed Tracing 文档。

先决条件

  • 已安装 Alauda Build of OpenTelemetry v2 Operator。请参阅 安装 Alauda Build of OpenTelemetry v2 Operator

  • 已部署 Jaeger v2 实例。请参阅 使用 Elasticsearch 部署 Alauda Build of Jaeger v2使用 OpenSearch 部署 Alauda Build of Jaeger v2

    INFO

    安装操作步骤中引用的 JAEGER_ES_INDEX_PREFIX 变量控制用于存储追踪数据的 Elasticsearch 索引前缀。默认值 acp-${CLUSTER_NAME} 适用于单集群部署。对于 Service Mesh 部署,请根据网格拓扑选择前缀:

    • 对于单集群 Service Mesh,建议以前缀加集群名称结尾,例如 acp-cluster-1
    • 对于多集群 Service Mesh,所有集群的追踪数据必须存储在同一索引系列中;建议以前缀加 meshID 结尾,例如 acp-mesh-1。在网格中的每个集群上运行安装操作步骤时,使用相同的 JAEGER_ES_INDEX_PREFIX,以便 Jaeger UI 可以关联跨集群的 span。
  • 已部署 OpenTelemetry Collector。请参阅 部署 OpenTelemetry Collector

  • 已创建 Istio 实例。

  • 已创建 Istio CNI 实例。

操作步骤

网格使用发现选择器时(可选)为 jaeger-system 命名空间添加标签

如果网格通过在 Istio 资源上设置 discoverySelectors 来限制控制平面监视的命名空间,则承载 OpenTelemetry Collector 的命名空间(默认为 jaeger-system 命名空间)也必须匹配其中一个选择器。否则,控制平面不会将 Collector Service 推送到 sidecar proxy,proxy 也无法向其导出 span。

jaeger-system 命名空间应用与 discoverySelectors 匹配的标签。例如,如果选择器匹配 istio-discovery=enabled 标签:

kubectl label namespace jaeger-system istio-discovery=enabled
NOTE

当网格不使用 discoverySelectors 时,请跳过此步骤。默认情况下,控制平面会发现每个命名空间,因此 Collector 已经可见,无需额外标签。在未使用发现选择器时添加标签不会产生任何效果。

有关发现选择器的更多信息,请参阅 sidecar 模式下的使用 DiscoverySelectors,以及 ambient 模式下的ambient 模式中的发现选择器

更新 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.jaeger-system.svc.cluster.local
  1. service 字段是 OpenTelemetry Collector Service 的 FQDN。默认值指向 jaeger-system 命名空间中部署的 Collector,如 部署 OpenTelemetry Collector 中所述。如果您将 Collector 部署在其他命名空间中,或使用了其他实例名称,请将其替换为实际的 Collector 地址。

要应用此配置,请修补 Istio 资源:

kubectl patch istio default --type=merge -p '
spec:
  values:
    meshConfig:
      enableTracing: true
      extensionProviders:
      - name: otel
        opentelemetry:
          port: 4317
          service: otel-collector.jaeger-system.svc.cluster.local
'
WARNING

此命令使用 JSON merge patch,会替换整个 meshConfig.extensionProviders 数组。如果 Istio 资源已定义其他扩展提供程序,这些定义将被覆盖。要保留它们,请使用 kubectl edit istio default 编辑资源并手动追加 otel 条目,或使用 JSON Patch(--type=json)追加到 /spec/values/meshConfig/extensionProviders/-

更新 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

要应用此配置,请修补 Telemetry 资源:

kubectl -n istio-system patch telemetry asm-default --type=merge -p '
spec:
  tracing:
    - providers:
        - name: otel
      randomSamplingPercentage: 100
'
NOTE

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

卸载分布式追踪

如果不再需要与 Service Mesh 集成的分布式追踪,请按以下顺序移除配置。

移除 Service Mesh 追踪配置

在移除底层组件之前,请将 mesh 与 OpenTelemetry Collector 分离,以便 Istio 停止发送 span。

  1. 编辑 Telemetry 资源,并移除引用 otel 提供程序的 tracing providers 条目:

    kubectl -n istio-system edit telemetry asm-default

    或者,使用 kubectl patch 以非交互方式移除 tracing 配置:

    kubectl -n istio-system patch telemetry asm-default --type=json -p='[{"op": "remove", "path": "/spec/tracing"}]'
  2. 编辑 Istio 资源,并移除名为 otelmeshConfig.extensionProviders 条目,或将 meshConfig.enableTracing 设置为 false

    kubectl edit istio default

    或者,使用 kubectl patch 以非交互方式将 meshConfig.enableTracing 设置为 false

    kubectl patch istio default --type=merge -p='{"spec":{"values":{"meshConfig":{"enableTracing":false}}}}'

卸载 OpenTelemetry Collector 和 Jaeger v2

如果集群中的其他工作负载仍依赖 OpenTelemetry Collector 或 Jaeger v2 实例,请跳过此步骤。

有关删除 OpenTelemetry Collector 实例、Jaeger v2 实例以及(可选)Alauda Build of OpenTelemetry v2 Operator 的说明,请参阅 Uninstalling Alauda Distributed Tracing