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 网络命名空间内设置以下规则:

  1. 入站流量重定向:所有目标端口非 15006 的入站 TCP 包,被 PREROUTING 链重定向到 Envoy 的 15006 端口。
  2. 出站流量重定向:所有从业务容器发出的 TCP 包(目标为 Pod/Service IP),被 OUTPUT 链重定向到 Envoy 的 15001 端口。
  3. 绕过 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 流量字节数,用于网络拓扑带宽分析。
Istio 控制面与数据面组件架构 控制面 (istiod) Pilot (xDS 下发) LDS/RDS/CDS/EDS Citadel (证书管理) mTLS / SPIFFE Galley (配置验证) CRD 校验与分发 数据面 (Envoy Sidecar) 入站代理 (15006) 流量劫持与路由 出站代理 (15001) 服务发现与负载均衡 指标暴露 (15020/15090) Prometheus 采集 xDS 配置推送 (gRPC) 说明:控制面不参与数据转发 Envoy 通过 iptables 透明劫持流量 指标通过 15020 端口统一暴露

2.5 流量拦截与指标暴露的完整流程

当一个请求从 Pod A 的 ServiceA 发往 Pod B 的 ServiceB 时,Envoy Sidecar 的拦截与指标采集过程如下:

  1. 出站拦截:Pod A 业务容器发出 TCP 包,iptables OUTPUT 链将其重定向到本地 Envoy 的 15001 端口。
  2. 路由决策:Envoy 根据 xDS 下发的路由规则(VirtualService),选择目标集群(ServiceB 的端点列表)。
  3. 负载均衡:Envoy 从连接池中选取一个健康端点(Pod B IP:Port),建立出站连接。
  4. 入站拦截:Pod B 的 iptables PREROUTING 链将入站包重定向到本地 Envoy 的 15006 端口。
  5. 指标记录:Envoy 在请求处理完成后,记录 istio_requests_total、istio_request_duration_milliseconds 等指标到内部统计缓存。
  6. 指标暴露:Prometheus 定期抓取每个 Pod 的 :15020/metrics 端点,获取合并后的指标数据。
性能考量:Envoy 的指标采集是异步的,不会增加请求延迟。但指标基数(高基数标签如 source_ip、request_id)会显著增加 Prometheus 存储压力。建议在 Istio 的 MeshConfig 中配置 defaultConfig.proxyStatsMatcher 来过滤不必要的指标维度。
Envoy Sidecar 流量拦截与指标暴露流程 Pod A (ServiceA) 业务容器 app=service-a Envoy Sidecar iptables 出站拦截 15020/metrics 请求 Istio 网格 istiod 控制面 xDS 配置推送 mTLS 加密通道 证书自动轮换 请求 Pod B (ServiceB) 业务容器 app=service-b Envoy Sidecar iptables 入站拦截 15020/metrics Prometheus 定期抓取每个 Pod 的 15020/metrics 端点 指标包含请求数、延迟、TCP 字节数等

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 以确保指标端点统一。