使用 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 作为 telemetry 信号的中介。它支持多种数据格式,并提供标准化的处理与导出 pipeline,可将 telemetry 发送到 Jaeger 等后端。

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

你可以通过部署一个 Jaeger v2 实例和一个 OpenTelemetry Collector,然后配置 Istio 通过它们导出 trace 数据,从而将 Alauda Service Mesh 与 Alauda Distributed Tracing 集成起来。

Jaeger v2 实例和 OpenTelemetry Collector 并不属于 Service Mesh 专属组件:一对 Jaeger v2 和 OpenTelemetry Collector(默认部署在 jaeger-system namespace 中)可以同时服务于 Service Mesh 和集群中的其他 workload。本节仅介绍 Service Mesh 相关配置;底层安装步骤请参考 Alauda Distributed Tracing 文档。

前提条件

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

  • 已部署 Jaeger v2 实例。请参见 部署 Alauda Build of Jaeger v2

    INFO

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

    • 对于单集群 service mesh,建议以前缀结尾包含集群名称,例如 acp-cluster-1
    • 对于多集群 service mesh,所有集群的 trace 必须存储在同一个索引 family 中;建议以前缀结尾包含 meshID,例如 acp-mesh-1。在 mesh 中每个集群上执行安装操作步骤时,请使用相同的 JAEGER_ES_INDEX_PREFIX,以便 Jaeger UI 能够跨集群关联 span。
  • 已部署 OpenTelemetry Collector。请参见 部署 OpenTelemetry Collector

  • 已创建 Istio 实例。

  • 已创建 Istio CNI 实例。

操作步骤

更新 Istio 资源以启用 tracing 并定义 OpenTelemetry tracing provider

示例:通过 meshConfig 启用 tracing

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 namespace 中的 Collector,如 部署 OpenTelemetry Collector 所述。如果你将 Collector 部署在其他 namespace 中,或使用了不同的实例名称,请将其替换为实际的 Collector 地址。

要应用此配置,请 patch 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 资源已经定义了其他 extension provider,它们将被覆盖。若要保留这些配置,请使用 kubectl edit istio default 手动编辑资源并追加 otel 条目,或者使用 JSON Patch(--type=json)向 /spec/values/meshConfig/extensionProviders/- 追加内容。

更新 Telemetry 资源以启用在 meshConfig 中定义的 tracing provider:

Istio Telemetry 资源示例

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

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

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

在确认能够看到 traces 之后,请降低 randomSamplingPercentage 值以减少请求数量。

卸载分布式追踪

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

移除 Service Mesh tracing 配置

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

  1. 编辑 Telemetry 资源,并删除引用 otel provider 的 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

如果集群中的其他 workload 仍然依赖 OpenTelemetry Collector 或 Jaeger v2 实例,则跳过此步骤。

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