4. Istio Telemetry V2 架构:深入理解 Mixer 弃用后的指标生成原理

Istio 1.5 版本是遥测架构的分水岭。此前的 Mixer 组件作为独立的中央策略与遥测后端,虽然功能强大,但引入了额外的网络跳转(Out-of-Process)和性能瓶颈。Telemetry V2 架构将指标生成逻辑直接下沉至 Envoy 代理(In-Process),彻底移除了 Mixer,实现了零额外延迟的 Prometheus 指标暴露。

4.1 架构演进:从 Mixer 到 Telemetry V2

下表对比了 Mixer 时代与 Telemetry V2 时代在数据路径上的核心差异:

对比维度 Mixer 架构(Istio 1.4 及之前) Telemetry V2 架构(Istio 1.5+)
指标生成位置 Mixer 组件(独立 Pod) Envoy 代理(Sidecar 内)
数据路径 请求 → Envoy → Mixer → 后端 请求 → Envoy → 后端
网络跳转 增加 1 次 gRPC 调用 0 次额外跳转
配置方式 Mixer 适配器 + CRD EnvoyFilter + WasmPlugin
性能开销 较高(序列化/反序列化) 极低(原生 C++ 处理)
Prometheus 集成 通过 Mixer Prometheus 适配器 Envoy 直接暴露 /stats/prometheus
关键认知: Telemetry V2 并非简单地将 Mixer 代码搬进 Envoy,而是利用 Envoy 的 Wasm(WebAssembly) 扩展机制和 Stats 框架,以原生方式生成指标。这使得 Istio 的遥测能力从“代理转发”进化为“代理原生”。

4.2 Telemetry V2 核心组件与数据流

Telemetry V2 架构由三个核心组件构成,它们协同工作,将请求属性转化为 Prometheus 指标。

Istio Telemetry V2 架构:Envoy 内指标生成流程 Envoy Proxy (Sidecar) 内部 入站请求 HTTP/gRPC/TCP HTTP 连接管理器 请求解析 & 路由 Wasm 扩展 属性提取 & 指标生成 Envoy Stats 框架 指标聚合 & 存储 /stats/prometheus HTTP 端点暴露 Prometheus Server 说明 Wasm 扩展通过 EnvoyFilter 加载 Stats 框架原生 支持 Prometheus
数据流说明:
  1. 请求进入:Envoy 的 HTTP 连接管理器(HCM)接收并解析入站请求。
  2. Wasm 扩展拦截:Istio 预置的 Wasm 插件(如 stats-filter)在请求处理的关键阶段(如请求头解析、响应发送)被调用,提取请求属性(源/目标服务、响应码、延迟等)。
  3. 指标注入:Wasm 扩展调用 Envoy 的 Stats API,以原生方式创建或更新计数器(Counter)、直方图(Histogram)和仪表盘(Gauge)。
  4. 聚合与暴露:Envoy Stats 框架在内存中聚合指标,并通过 /stats/prometheus 端点以标准 Prometheus 文本格式暴露。
  5. 抓取:Prometheus Server 通过 Service 或 Pod 注解发现目标,定期抓取该端点。

4.3 标准 Prometheus 指标清单

Telemetry V2 默认暴露的指标遵循 istio_ 命名前缀,覆盖了服务网格可观测性的核心维度。以下是关键指标及其语义:

指标名称 类型 标签(维度) 描述
istio_requests_total Counter source_workload, destination_service, response_code, connection_security_policy 请求总数,按源、目标、响应码和安全策略细分
istio_request_duration_milliseconds Histogram source_workload, destination_service, response_code 请求延迟分布(毫秒),用于计算 P50/P95/P99
istio_request_bytes Histogram source_workload, destination_service 请求体大小分布(字节)
istio_response_bytes Histogram source_workload, destination_service 响应体大小分布(字节)
istio_tcp_sent_bytes_total Counter source_workload, destination_service TCP 连接发送字节总数
istio_tcp_received_bytes_total Counter source_workload, destination_service TCP 连接接收字节总数
注意标签基数: source_workload 和 destination_service 等标签的组合会导致指标基数随服务数量线性增长。在大型网格中(超过 1000 个服务),建议启用 Workload Entry 合并 或使用 Prometheus 的 Recording Rules 进行预聚合,避免 Prometheus 内存压力过大。

4.4 配置示例:通过 EnvoyFilter 自定义指标

Telemetry V2 允许通过 EnvoyFilter 自定义 Wasm 扩展的行为,例如添加自定义标签或修改指标名称。以下示例展示了如何为 istio_requests_total 增加一个 request_path 标签:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-stats-filter
  namespace: istio-system
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: "envoy.filters.network.http_connection_manager"
            subFilter:
              name: "envoy.filters.http.wasm"
    patch:
      operation: MERGE
      value:
        name: istio.stats
        typed_config:
          "@type": type.googleapis.com/udpa.type.v1.TypedStruct
          type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
          value:
            config:
              configuration:
                "@type": type.googleapis.com/google.protobuf.StringValue
                value: |
                  {
                    "debug": "false",
                    "stat_prefix": "istio",
                    "metrics": [
                      {
                        "name": "requests_total",
                        "dimensions": {
                          "request_path": "request.path"
                        }
                      }
                    ]
                  }
              vm_config:
                runtime: envoy.wasm.runtime.null
                code:
                  local:
                    filename: /etc/istio/extensions/stats-filter.wasm
生产建议: 自定义维度会增加指标基数。在添加 request_path 或 user_agent 等高基数标签前,务必评估其对 Prometheus 存储和查询性能的影响。推荐使用 StatsFilter 的 regex 匹配 功能,仅对特定路径启用高基数标签。

4.5 验证 Telemetry V2 指标

部署 Istio 1.5+ 后,可以通过以下步骤验证 Telemetry V2 是否正常工作:

  1. 检查 Envoy 端点:进入任意 Sidecar 容器,访问 /stats/prometheus 端点。
kubectl exec -it <pod-name> -c istio-proxy -- curl http://localhost:15090/stats/prometheus | grep istio_requests_total
  1. 确认指标存在:输出应包含类似以下内容:
# HELP istio_requests_total HTTP and gRPC requests
# TYPE istio_requests_total counter
istio_requests_total{response_code="200",source_workload="productpage-v1",destination_service="reviews.default.svc.cluster.local",...} 42
  1. 验证 Prometheus 抓取:在 Prometheus UI 中执行查询 istio_requests_total,确认数据已成功采集。
架构收益总结: Telemetry V2 通过将指标生成内聚到 Envoy,消除了 Mixer 带来的性能损耗和单点故障。Envoy 直接暴露标准 Prometheus 指标,使得 Prometheus 可以像抓取普通应用一样抓取 Sidecar,极大地简化了服务网格的可观测性基础设施。这一架构变化是 Istio 走向生产就绪的关键一步。