2. Istio 基础回顾:架构、核心组件与 Envoy 代理原理

在深入流量拓扑漂移告警的复测流程之前,必须牢固掌握 Istio 服务网格的基础架构。本章将系统回顾 Istio 的控制面与数据面分离设计、三大核心组件的职责,以及 Envoy 代理作为数据面核心的工作机制。这些知识是后续理解流量拓扑采集、告警规则推导和复测验证的基石。

2.1 Istio 整体架构:控制面与数据面

Istio 采用经典的控制面/数据面分离架构。数据面由注入到每个 Pod 中的 Envoy 代理组成,负责拦截并处理所有进出容器的流量;控制面则统一管理代理的配置下发、策略执行和证书分发。

架构要点: 数据面代理(Envoy)通过 xDS 协议从控制面拉取动态配置,实现无中断的流量路由、负载均衡、熔断和可观测性。
Istio 控制面与数据面架构 Istio 控制面与数据面架构 控制面 (Control Plane) — istiod Pilot 服务发现 + 配置下发 Citadel 证书签发 + 身份认证 Mixer (v1.5 前) 策略 + 遥测 (已内化) 数据面 (Data Plane) — Envoy 代理 Pod A App 容器 Envoy iptables 流量拦截 Pod B App 容器 Envoy iptables 流量拦截 业务流量 (HTTP/gRPC/TCP) 说明:Envoy 代理通过 xDS 协议从 Pilot 获取动态配置,Citadel 提供 mTLS 证书,Mixer 功能已逐步内化到 Envoy 和 Pilot 中。

2.2 核心组件详解

Istio 控制面自 v1.5 起合并为单一的 istiod 二进制,但内部仍保留 Pilot、Citadel、Mixer 三大逻辑组件。理解每个组件的原始职责,有助于排查配置下发和证书相关问题。

组件 核心职责 关键协议/接口 与流量拓扑的关系
Pilot 服务发现、流量管理规则转换、xDS 配置下发 ADS/EDS/CDS/LDS/RDS 直接决定 Envoy 的路由规则和端点列表,是拓扑数据的来源
Citadel 证书签发、密钥管理、身份认证(mTLS) SPIFFE、K8s CSR 影响服务间通信的加密和身份标识,拓扑中体现为信任关系
Mixer 访问策略、遥测数据收集(v1.5 前独立部署) Check/Report 历史版本中影响流量策略,当前功能已内化到 Envoy 和 Pilot
实践提示: 在流量拓扑漂移告警复测中,Pilot 下发的 EDS(端点发现服务)配置是最关键的检查点。如果 Envoy 的端点列表与预期不符,拓扑漂移几乎必然发生。

2.3 Envoy 代理原理

Envoy 是 Istio 数据面的核心,以 sidecar 模式注入到每个 Pod 中。它通过 iptables 规则透明地劫持所有进出容器的流量,并基于从 Pilot 获取的动态配置执行路由、负载均衡、熔断和可观测性操作。

2.3.1 Envoy 核心工作流程

  1. 流量劫持: Init 容器设置 iptables 规则,将入站和出站流量重定向到 Envoy 的监听端口(默认 15001/15006)。
  2. 配置获取: Envoy 启动后通过 xDS 协议向 Pilot 发起 ADS 请求,获取监听器(LDS)、路由(RDS)、集群(CDS)、端点(EDS)和密钥(SDS)配置。
  3. 请求处理: 当应用发出请求时,Envoy 根据路由规则选择目标集群,再通过负载均衡算法选择一个端点,建立连接并转发请求。
  4. 可观测性: Envoy 自动生成访问日志、分布式追踪和指标(如请求数、延迟、错误率),上报给 Prometheus 或 Jaeger。
Envoy 代理请求处理流程 Envoy 代理请求处理流程 App 容器 发起请求 iptables 劫持 Envoy 入站监听 端口 15006 Envoy 路由引擎 匹配 VirtualService 目标集群 负载均衡 + 端点 目标 Pod Envoy 转发到 App 容器 关键配置来源(xDS 协议) LDS(监听器发现)→ 定义 Envoy 监听哪些端口 RDS(路由发现)→ 定义请求匹配规则和路由目标 CDS(集群发现)→ 定义上游服务集群和负载均衡策略 EDS(端点发现)→ 定义集群中可用的 Pod IP 列表(拓扑漂移的直接检测点)

2.3.2 Envoy 关键配置与拓扑漂移的关联

在流量拓扑漂移告警复测中,Envoy 的 EDS 配置 是最核心的检测对象。当 Pilot 下发的端点列表与 Kubernetes Service 的 Endpoints 对象不一致时,就会产生拓扑漂移。常见的漂移场景包括:

  • 端点缺失: 新扩容的 Pod 未及时出现在 Envoy 的 EDS 中,导致流量无法到达。
  • 端点残留: 已终止的 Pod 仍存在于 Envoy 的 EDS 中,导致请求被路由到不存在的 Pod。
  • 路由规则错误: VirtualService 或 DestinationRule 配置错误,导致流量被路由到错误的集群或子集。
复测关注点: 在复测流程中,需要对比 istioctl proxy-config endpoints <pod> 的输出与 kubectl get endpoints <service> 的结果。任何差异都意味着拓扑漂移,需要进一步排查 Pilot 的配置下发链路。

2.4 本章小结