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

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

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

  • Alauda Build of OpenTelemetry v2:基于 OpenTelemetry 项目,此 Operator 负责管理 Jaeger v2 实例以及位于其前端的 OpenTelemetry Collector 的生命周期。

OpenTelemetry Collector 充当遥测信号的中介。它支持多种数据格式,并提供标准化的流水线,用于处理遥测数据并将其导出到诸如 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 命名空间中)即可同时服务于 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 变量用于控制存储 trace 数据的 Elasticsearch 索引前缀。默认值 acp-${CLUSTER_NAME} 适用于单集群部署。对于 Service Mesh 部署,请根据 mesh 的拓扑选择前缀:

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

  • 已创建 Istio 实例。

  • 已创建 Istio CNI 实例。

操作步骤

(可选)当 mesh 使用 discoverySelectors 时,为 jaeger-system 命名空间添加标签

如果 mesh 通过在 Istio 资源上设置 discoverySelectors 来限制控制平面监视的命名空间,则承载 OpenTelemetry Collector 的命名空间(默认是 jaeger-system 命名空间)也必须匹配这些 selector 之一。否则,控制平面不会将 Collector Service 下发到 sidecar 代理,代理也就无法向其导出 span。

将你的 discoverySelectors 所匹配的标签应用到 jaeger-system 命名空间。例如,如果 selector 匹配 istio-discovery=enabled 标签:

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

如果 mesh 未使用 discoverySelectors,请跳过此步骤。默认情况下,控制平面会发现每个命名空间,因此 Collector 已经可见,不需要额外标签。在未使用 discovery selectors 时添加该标签不会产生任何影响。

有关 discovery selectors 的更多信息,请参见 sidecar 模式下的 Using DiscoverySelectors,以及 ambient 模式下的 Discovery selectors in ambient mode

更新 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 命名空间中的 Collector,如 部署 OpenTelemetry Collector 中所述。如果你将 Collector 部署在其他命名空间,或使用了不同的实例名称,请将其替换为实际的 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 条目,或者使用会追加到 /spec/values/meshConfig/extensionProviders/- 的 JSON Patch(--type=json)。

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

在确认你可以看到 trace 之后,降低 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

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

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