1. 服务网格基础概念

1.1 什么是服务网格

服务网格(Service Mesh)是云原生架构中用于处理服务间通信的基础设施层。它将原本嵌入在应用代码中的流量管理、服务发现、负载均衡、熔断、重试、可观测性等能力抽离出来,下沉到独立的代理进程中,使开发者可以专注于业务逻辑。

核心思想:将网络通信的复杂性从应用容器中剥离,交给 Sidecar 代理统一处理。

服务网格通常由两个平面组成:

平面 职责 典型组件
数据平面(Data Plane) 拦截并处理所有进出服务的网络流量,执行路由、负载均衡、健康检查、TLS 终止、指标采集等 Envoy、Linkerd-proxy、MOSN
控制平面(Control Plane) 下发配置、管理证书、聚合遥测数据、提供 API 供运维人员声明式管理网格行为 Istiod(Istio)、Conduit-controller、Kuma CP
服务网格两层架构 控制平面(Control Plane) 数据平面(Data Plane) Service A Sidecar Proxy Service B Sidecar Proxy 流量 配置下发 配置下发

1.2 Sidecar 代理模式

Sidecar 是服务网格的部署单元。每个服务实例旁边都会部署一个独立的代理容器(Sidecar),该代理拦截该实例的所有入站和出站流量。

关键特征:Sidecar 与业务容器共享同一个 Pod(Kubernetes 场景),共享网络命名空间,但进程隔离。业务容器完全感知不到 Sidecar 的存在。

Sidecar 代理模式带来的优势:

  • 零侵入:无需修改业务代码即可获得流量管理、安全、可观测能力。
  • 统一治理:所有流量策略在 Sidecar 层集中配置,避免各语言 SDK 碎片化。
  • 故障隔离:Sidecar 崩溃不影响业务进程,业务进程崩溃 Sidecar 仍可上报指标。
  • 渐进式采纳:可以按命名空间、工作负载粒度逐步接入网格。
Sidecar 代理模式 — Pod 内部结构 Kubernetes Pod 业务容器 (App / Service) Sidecar 容器 (Envoy Proxy) 共享网络命名空间(Network Namespace) iptables 规则将流量透明劫持到 Sidecar 入站 出站

1.3 Istio 与 Envoy 的关系

在服务网格生态中,Istio 和 Envoy 是最具代表性的组合。两者分工明确:

组件 角色 所属平面 核心职责
Envoy 高性能数据平面代理 数据平面 流量拦截、L4/L7 路由、负载均衡、TLS 终止、熔断、重试、指标与日志生成
Istiod 统一控制平面组件 控制平面 将 Pilot、Citadel、Galley 整合为一个进程;下发 xDS 配置、管理证书、验证策略
Istioctl / K8s CRD 运维接口 控制平面(用户侧) 声明式定义 VirtualService、DestinationRule、PeerAuthentication 等资源

Istio 与 Envoy 的协作流程:

  1. 运维人员通过 kubectl apply 创建 Istio CRD 资源(如 VirtualService)。
  2. Istiod 监听 API Server,将 CRD 转换为 Envoy 可理解的 xDS 协议配置(LDS、RDS、CDS、EDS 等)。
  3. Istiod 通过 gRPC 流式推送 xDS 配置给每个 Pod 中的 Envoy Sidecar。
  4. Envoy 根据最新配置动态更新路由、监听器、集群,无需重启。
  5. Envoy 实时采集流量指标、访问日志、链路追踪数据,上报给 Prometheus / 日志系统 / Jaeger。
常见误解:Istio 不是 Envoy 的替代品,而是 Envoy 的编排者。Envoy 本身是一个独立的代理,Istio 利用 Envoy 的 xDS API 对其进行集中管理。没有 Istio,Envoy 依然可以独立运行(如作为边缘代理);没有 Envoy,Istio 的数据平面能力将不复存在。
Istio + Envoy 协作架构 运维人员 / CI/CD kubectl apply CRD Istiod Pilot + Citadel + Galley xDS 配置推送 xDS 配置推送 Envoy Sidecar A 数据平面代理 Envoy Sidecar B 数据平面代理 服务间流量 指标/日志/追踪 指标/日志/追踪 Prometheus / Loki / Jaeger / Kiali

1.4 为什么选择 Envoy 作为 Istio 的数据平面

Envoy 并非 Istio 唯一可选的数据平面代理,但它是 Istio 的默认且最成熟的实现。Envoy 被选中的关键原因:

  • 原生 xDS 支持:Envoy 是 xDS 协议的发明者和最早实现者,Istiod 可以直接使用标准 xDS API 进行配置下发。
  • 高性能 C++ 实现:相比纯 Go 或 Java 代理,Envoy 在吞吐量和延迟方面表现更优,适合大规模生产环境。
  • 丰富的 L7 过滤链:Envoy 内置 HTTP/1.1、HTTP/2、gRPC、TCP、MongoDB、Redis 等多种协议解析器,无需额外插件。
  • 可观测性原生集成:Envoy 原生生成结构化访问日志、分布式追踪(Zipkin/Jaeger)、Prometheus 指标,无需 sidecar 额外采集器。
  • 热重载与动态配置:Envoy 支持通过 xDS 动态更新监听器、路由、集群,无需重启进程,适合频繁变更的微服务环境。