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 指标。
数据流说明:
- 请求进入:Envoy 的 HTTP 连接管理器(HCM)接收并解析入站请求。
- Wasm 扩展拦截:Istio 预置的 Wasm 插件(如
stats-filter)在请求处理的关键阶段(如请求头解析、响应发送)被调用,提取请求属性(源/目标服务、响应码、延迟等)。 - 指标注入:Wasm 扩展调用 Envoy 的 Stats API,以原生方式创建或更新计数器(Counter)、直方图(Histogram)和仪表盘(Gauge)。
- 聚合与暴露:Envoy Stats 框架在内存中聚合指标,并通过
/stats/prometheus端点以标准 Prometheus 文本格式暴露。 - 抓取: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 是否正常工作:
- 检查 Envoy 端点:进入任意 Sidecar 容器,访问
/stats/prometheus端点。
kubectl exec -it <pod-name> -c istio-proxy -- curl http://localhost:15090/stats/prometheus | grep istio_requests_total
- 确认指标存在:输出应包含类似以下内容:
# 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
- 验证 Prometheus 抓取:在 Prometheus UI 中执行查询
istio_requests_total,确认数据已成功采集。
架构收益总结: Telemetry V2 通过将指标生成内聚到 Envoy,消除了 Mixer 带来的性能损耗和单点故障。Envoy 直接暴露标准 Prometheus 指标,使得 Prometheus 可以像抓取普通应用一样抓取 Sidecar,极大地简化了服务网格的可观测性基础设施。这一架构变化是 Istio 走向生产就绪的关键一步。