2. Istio 网格基础架构:回顾控制面与数据面组件
在深入集成 Prometheus 监控与 Istio 网格拓扑之前,必须重新梳理 Istio 的核心架构。Istio 将服务网格分为两个平面:控制面(Control Plane)和数据面(Data Plane)。理解这两个平面的组件职责,尤其是 Envoy Sidecar 的流量拦截与指标暴露机制,是后续配置监控与拓扑分析的基础。
2.1 控制面组件(istiod)
控制面统一由 istiod 进程承载,它整合了 Pilot、Citadel、Galley 三大传统组件的功能。istiod 负责下发配置、颁发证书、验证策略,但不参与实际业务流量转发。
| 组件 | 职责 | 关键能力 |
|---|---|---|
| Pilot | 服务发现与流量管理 | 将 VirtualService、DestinationRule 转换为 Envoy 的 xDS 配置(LDS/RDS/CDS/EDS) |
| Citadel | 安全与证书管理 | 自动生成、分发、轮换 mTLS 证书,支持 SPIFFE 身份 |
| Galley | 配置验证与分发 | 校验 Istio CRD 合法性,将有效配置推送给 Pilot |
关键点:istiod 通过 gRPC 流式 xDS 协议与所有 Envoy Sidecar 保持长连接。一旦控制面故障,数据面仍会保持当前配置继续转发流量,但无法接收新的路由或安全策略更新。
2.2 数据面组件:Envoy Sidecar
数据面由注入到每个 Pod 中的 Envoy 代理组成。Envoy 以 Sidecar 容器 形式运行,拦截进出业务容器的所有 TCP 流量,并执行路由、负载均衡、熔断、指标采集等操作。
- 透明代理:业务容器无需感知 Envoy 的存在,所有流量被 iptables 规则透明劫持。
- 四层与七层处理:Envoy 支持 TCP 代理(四层)和 HTTP/gRPC 代理(七层),可解析请求头、路径、方法等。
- 热重载:通过 xDS 动态更新监听器、路由、集群配置,无需重启进程。
Envoy 核心工作线程模型:每个 Worker 线程拥有独立的 event loop,通过 连接池 和 线程局部缓存 实现高性能转发。指标采集在 Worker 线程内异步完成,不阻塞主转发路径。
2.3 Envoy Sidecar 流量拦截机制
Envoy 通过 iptables 规则 实现透明流量劫持。注入 Sidecar 时,Init 容器会执行 istio-iptables 命令,在 Pod 网络命名空间内设置以下规则:
- 入站流量重定向:所有目标端口非 15006 的入站 TCP 包,被 PREROUTING 链重定向到 Envoy 的 15006 端口。
- 出站流量重定向:所有从业务容器发出的 TCP 包(目标为 Pod/Service IP),被 OUTPUT 链重定向到 Envoy 的 15001 端口。
- 绕过 Envoy 自身流量:Envoy 容器发出的流量(UID 1337)不会被 iptables 规则拦截,避免循环。
# 典型的 iptables 规则摘要(istio-iptables 生成)
# 入站:将非 Envoy 的入站 TCP 流量转到 15006
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 15006
# 出站:将业务容器发出的 TCP 流量转到 15001
-A OUTPUT -p tcp -m owner --uid-owner 1337 -j RETURN
-A OUTPUT -p tcp -m tcp -j REDIRECT --to-ports 15001
避坑提示:如果 Pod 使用
hostNetwork: true,iptables 规则会干扰宿主机网络。此时应设置 sidecar.istio.io/inject: "false" 或使用 cni 模式替代 iptables 劫持。
2.4 Envoy Sidecar 指标暴露机制
Envoy 内置了强大的指标系统,Istio 在此基础上进行了标准化和聚合。指标暴露路径如下:
| 端点 | 端口 | 说明 |
|---|---|---|
/stats/prometheus |
15090 | Envoy 原生 Prometheus 格式指标,包含连接数、请求数、延迟、重试等 |
/metrics |
15020 | Istio Agent 合并后的指标端点,包含 Envoy 指标 + Istio 自身指标 |
/stats |
15000 | Envoy 管理接口,JSON/文本格式的管理统计,不推荐 Prometheus 直接采集 |
Prometheus 采集器通常配置为抓取 :15020/metrics 端点,因为该端点由 Istio Agent 统一管理,支持 指标过滤 和 标签注入(如 Pod 名称、命名空间、版本等)。
关键指标分类:
- istio_requests_total:请求总数,标签包含 source_workload、destination_service、response_code 等。
- istio_request_duration_milliseconds:请求延迟分布(P50/P90/P99)。
- istio_tcp_sent_bytes_total:TCP 流量字节数,用于网络拓扑带宽分析。
2.5 流量拦截与指标暴露的完整流程
当一个请求从 Pod A 的 ServiceA 发往 Pod B 的 ServiceB 时,Envoy Sidecar 的拦截与指标采集过程如下:
- 出站拦截:Pod A 业务容器发出 TCP 包,iptables OUTPUT 链将其重定向到本地 Envoy 的 15001 端口。
- 路由决策:Envoy 根据 xDS 下发的路由规则(VirtualService),选择目标集群(ServiceB 的端点列表)。
- 负载均衡:Envoy 从连接池中选取一个健康端点(Pod B IP:Port),建立出站连接。
- 入站拦截:Pod B 的 iptables PREROUTING 链将入站包重定向到本地 Envoy 的 15006 端口。
- 指标记录:Envoy 在请求处理完成后,记录
istio_requests_total、istio_request_duration_milliseconds等指标到内部统计缓存。 - 指标暴露:Prometheus 定期抓取每个 Pod 的
:15020/metrics端点,获取合并后的指标数据。
性能考量:Envoy 的指标采集是异步的,不会增加请求延迟。但指标基数(高基数标签如 source_ip、request_id)会显著增加 Prometheus 存储压力。建议在 Istio 的
MeshConfig 中配置 defaultConfig.proxyStatsMatcher 来过滤不必要的指标维度。
2.6 关键配置参数
在部署 Istio 时,以下配置直接影响流量拦截与指标暴露的行为:
| 配置项 | 位置 | 默认值 | 说明 |
|---|---|---|---|
meshConfig.defaultConfig.proxyStatsMatcher |
IstioOperator / MeshConfig | 空(采集所有指标) | 通过 inclusionRegexps / exclusionRegexps 过滤 Envoy 指标 |
meshConfig.enablePrometheusMerge |
MeshConfig | true | 是否合并 Envoy 指标与 Istio Agent 指标到 15020 |
sidecar.istio.io/inject |
Pod 注解 | true | 是否注入 Sidecar,设为 false 可跳过 iptables 劫持 |
traffic.sidecar.istio.io/includeOutboundIPRanges |
Pod 注解 | "*" | 限制出站拦截的 IP 范围,减少不必要的劫持 |
生产建议:在大型集群中,建议通过
proxyStatsMatcher 排除 istio_tcp_connections_opened_total 等低价值指标,降低 Prometheus 存储成本。同时开启 enablePrometheusMerge: true 以确保指标端点统一。