使用 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 配置分布式追踪数据收集

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

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

前提条件

  • 目标集群已安装 Alauda Container Platform Distributed Tracing(之前称为 Alauda Build of Jaeger v2)集群插件。请参阅 安装 Alauda Build of Jaeger v2 集群插件。该插件会将追踪组件的容器镜像发布到平台的 registry,并将其地址记录在 cpaas-system 中的 jaeger-cluster-plugin-manifest ConfigMap 内,以下步骤将读取这些地址。

  • 已安装 Alauda Container Platform Application Observability(之前称为 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 部署,请根据 mesh 的拓扑选择前缀:

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

  • 已创建 Istio 实例。

  • 已创建 Istio CNI 实例。

操作步骤

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

如果 mesh 通过在 Istio 资源上设置 discoverySelectors 来限制控制平面监视的命名空间,则承载 OpenTelemetry Collector 的命名空间(默认为 jaeger-system 命名空间)也必须匹配其中一个 selector。否则,控制平面不会将 Collector Service 推送到 sidecar proxy,proxy 也无法向其导出 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 模式下的 使用 DiscoverySelectors,以及 ambient 模式下的 ambient 模式中的 discovery selectors。

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

示例:通过 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
      serviceSettings:
      - hosts:
        - otel-collector.jaeger-system.svc.cluster.local
        settings:
          clusterLocal: true
  1. service 字段是 OpenTelemetry Collector Service 的 FQDN。默认值指向 jaeger-system 命名空间中部署的 Collector,如 部署 OpenTelemetry Collector 中所述。如果您将 Collector 部署在其他命名空间中,或使用了不同的实例名称,请将其替换为实际的 Collector 地址。
  2. 使每个 proxy 都将其 span 导出到自身集群的 Collector。在单集群 mesh 中,此设置不会产生任何变化;当 mesh 跨越多个集群时,该设置可确保追踪完整。使用与上方 service 字段相同的 host。
每个集群都需要自己的 Collector

在跨越多个集群的 mesh 中,每个集群都会以相同的 Service 名称发布其 Collector,控制平面会将它们合并为一组 endpoint:如果没有 clusterLocal,proxy 会将其 span 分散到所有集群的 Collector。发送到其他集群的 span 会在集群位于不同网络时丢失;即使它们共享网络,也会无谓地跨越集群边界。

clusterLocal 会删除属于其他集群的 endpoint,因此仅当每个集群都运行自己的 Collector 时才应设置它,这也是前提条件中安装的方式。如果一个 Collector 为多个集群提供服务,请省略此项:没有 Collector 的集群中的 proxy 将完全没有 endpoint,并会丢弃所有 span。

要应用此配置,请修补 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
      serviceSettings:
      - hosts:
        - otel-collector.jaeger-system.svc.cluster.local
        settings:
          clusterLocal: true
'
WARNING

此命令使用 JSON merge patch,会替换整个 meshConfig.extensionProviders 和 meshConfig.serviceSettings 数组。如果 Istio 资源已定义其他 extension provider 或 service 设置,这些内容将被覆盖。若要保留这些内容,请使用 kubectl edit istio default 编辑资源并手动追加条目,或使用 JSON Patch(--type=json)追加到 /spec/values/meshConfig/extensionProviders/- 和 /spec/values/meshConfig/serviceSettings/-。

更新 Telemetry 资源,以启用 meshConfig 中定义的追踪 provider:

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 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 资源,并移除名为 otel 的 meshConfig.extensionProviders 条目以及针对 Collector 主机的 meshConfig.serviceSettings 条目,或者将 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 Container Platform Application Observability(之前称为 Alauda Build of OpenTelemetry v2)Operator 的操作说明,请参阅 Uninstalling Alauda Distributed Tracing。