1. 微服务治理演进史
阶段 1:单体应用
所有模块在一个进程内,进程内方法调用,不存在跨网络服务调用,不需要服务治理。
阶段 2:第一代微服务 --- SDK 侵入式治理
治理逻辑嵌入业务代码 :服务注册发现、负载均衡、重试、熔断、限流、埋点、TLS 都封装在 SDK 里。 优点 :上手简单,无额外网络代理开销; 缺点:
- 语言绑定:一套 SDK 只支持一种语言。Java 用 SpringCloud,Go/Python 需要自己重写治理逻辑,多语言异构系统成本极高;
- 侵入业务:业务代码依赖治理 SDK,业务代码和通信治理逻辑耦合;
- SDK 升级灾难 :SDK 漏洞、版本升级,所有微服务必须重新打包发布;几十个上百个服务,升级周期极长;
- 能力统一管控难:策略散落在各个服务实例,很难全局统一灰度、流量镜像、细粒度访问控制;
- 运维侧无法独立调整流量策略,必须改代码发版本。
核心矛盾:通信治理逻辑是基础设施能力,却被写进业务代码。
阶段 3:第二代微服务 --- 服务网格Sidecar 代理模式
思想:把服务间通信治理能力从业务代码剥离,下沉到独立的基础设施代理进程(Sidecar)。业务进程完全不用感知治理逻辑,无需引入 SDK、无需修改代码。
核心口号:业务只负责业务逻辑,流量治理交给 Sidecar。
2. 服务网格定义、核心思想、分层架构
定义
服务网格是专门负责微服务之间东西向网络通信的基础设施层,由一组分布式代理(Sidecar)和中心化控制组件组成,以透明、非侵入方式提供微服务通信治理能力。
两大平面
服务网格永远分为 控制平面 Control Plane 和 数据平面 Data Plane,二者职责严格分离。
- 数据平面
- 载体:Sidecar(边车代理进程,典型:Envoy)
- 部署:和业务容器在同一个 Pod,共享网络命名空间
- 职责:实际转发数据包,执行流量策略。所有流量转发、路由、熔断、mTLS 加密、日志采集都是 Sidecar 实时执行。
- 特点:分布式,每个业务 Pod 都有独立 Sidecar;不保存全局配置,配置由控制平面推送。
- 控制平面
- 部署:独立的一组服务,不和业务 Pod 混部
- 职责:不转发任何业务数据包! 只做配置管理、服务发现、证书管理、策略下发。
- 工作流程:运维编写规则 CRD → 控制平面校验规则 → 转换成 Sidecar 能识别的配置 → 推送给所有 Sidecar。
- 特点:中心化管控;控制平面挂掉,不会影响已经在运行的业务流量,Sidecar 会使用本地缓存配置继续工作(这是重要容灾特性)。
通俗类比:
- 数据平面 Sidecar:马路上每辆车随车安全员,现场执行限速、安检;安全员不制定法规,只执行。流量发生在安全员和安全员之间。
- 控制平面:交通局,制定法规、下发规则;交通局不参与路上车辆通行;交通局宕机,路上车辆还能按旧规则继续跑。
3. Sidecar 模式原理、流量劫持完整机制
K8s 下 Istio 最经典:Pod 内业务容器 + Envoy Sidecar 容器,共享
net网络命名空间。 流量劫持依靠 iptables 端口重定向,实现透明代理,业务完全感知不到 Sidecar。
劫持完整流程
- 业务容器发起 TCP 请求,目标地址是
serviceA:8080; - 流量到达 Pod 内的网络栈,被iptables OUTPUT 链捕获;
- iptables 规则:把 Pod 内所有出站 TCP 流量,劫持转发到本机 Sidecar 的监听端口(默认 15001);
- Envoy Sidecar 接收流量,解析请求;
- Sidecar 根据控制平面下发的 VirtualService/DestinationRule 执行策略:路由选择、权重分流、熔断、mTLS 加密;
- Sidecar 建立新连接,将请求转发给目标 Pod 的 Sidecar;
- 目标 Pod Sidecar 接收连接,解密 mTLS,校验访问策略;
- iptables 把流量转发给目标 Pod 内业务容器;
- 响应流量原路返回,再次经过两端 Sidecar。
入站流量
- 流量进入 Pod;
- iptables PREROUTING 链捕获入站流量,转发到 Sidecar 的 15006 端口;
- Sidecar 校验策略、解密;
- 转发给本地业务容器。
iptables 劫持要点
- 注入 Sidecar 的时候,istio-init 初始化容器负责在 Pod 里写入 iptables 规则;初始化容器执行完就退出;
- 可以配置流量劫持范围:可以只劫持特定端口,或者排除某些端口;
- 缺点:iptables 规则过多时,会带来内核网络栈开销,大规模 Pod 场景下 iptables 管理成本上升。
补充:透明代理的目标:业务代码写死目标 IP / 端口,不需要配置代理地址,流量自动被劫持,这就是透明代理。
Sidecar 模式优缺点
✅ 优点:非侵入;多语言统一治理;独立升级 Sidecar,业务无需改动; ❌ 缺点:每个 Pod 额外进程,占用 CPU 内存;多一层网络转发,增加延迟;Pod 数量越多,Sidecar 总资源开销越大;iptables 带来内核开销;排障链路变长。
4. 数据平面核心能力详解
Envoy 是高性能 C++ 开发的七层代理,Istio、Kuma 都基于 Envoy。Envoy 是事件驱动架构,支持热配置更新(配置变更不需要重启进程)。
4.1 流量管理
- 服务发现:Sidecar 本地维护后端实例列表;控制平面持续同步实例状态(健康实例、异常实例);
- 七层路由 :基于 HTTP 请求头、URL、Cookie 做路由;例如
user-type=test的请求路由到 v2 版本; - 加权路由(灰度):按百分比分配流量,90% v1,10% v2;
- 流量镜像(影子流量):真实请求正常发给 v1;复制一份相同请求异步发给 v2;镜像流量返回结果丢弃。用来做线上版本验证,不影响真实用户;
- 负载均衡策略:轮询、随机、加权轮询、最小请求数、会话保持;
- 超时、重试:配置调用超时;可配置只对幂等请求重试,限制重试次数、重试间隔;
- 熔断与实例隔离:后端实例错误率超过阈值 → 将实例从可用列表摘除,一段时间后恢复;防止服务雪崩;
- 连接池管理:控制到每个后端实例最大并发连接数;防止后端被打满;
- 故障注入(混沌工程) :主动注入延迟、5xx 错误,人为制造故障,验证服务容错能力。只作用于被劫持流量,业务代码不用改。
4.2 安全能力
- mTLS 双向 TLS :服务之间通信加密;客户端 Sidecar 和服务端 Sidecar 互相校验证书身份;不是普通 HTTPS(单向)。
- 证书由控制平面自动签发、自动轮换;业务完全不用管理证书;
- 细粒度访问控制 AuthorizationPolicy:定义服务访问白名单。例:只有 order 服务可以调用 payment;其他服务访问直接拒绝;
- 支持 JWT 校验:Sidecar 层直接校验请求 token,不用业务代码处理鉴权。
4.3 可观测性
Sidecar 在流量经过时自动采集,业务无需埋点:
- Metrics 指标:请求量 QPS、响应码分布、延迟 P50/P90/P99、连接数、失败率;
- Trace 分布式追踪:自动生成 traceId,把调用链串联;对接 Jaeger、Zipkin;
- Access Log 访问日志:每条请求记录源服务、目标服务、耗时、状态码、请求头;
注意:Sidecar 只能采集经过它的网络调用;业务内部代码异常无法捕获。
4.4 限流
- 支持客户端侧限流(调用方 Sidecar 限制对外请求速率);
- 服务端侧限流(被调用方 Sidecar 限制收到请求速率);
- 维度:按服务、IP、请求头维度限流。
5. 控制平面原理:配置推送、服务发现、证书分发
新版 Istio 将多个组件合并为 istiod 单体控制平面,简化架构。旧版是 Pilot、Citadel、Galley 分离组件,软考有时候会考旧版组件名称。
istiod 内部模块
-
Pilot(流量配置 + 服务发现)
- 监听 K8s 资源:Deployment、Service、Pod;监听 Istio 自定义 CRD:VirtualService、DestinationRule;
- 维护服务实例信息;
- 将 K8s 资源 + Istio 规则翻译成 Envoy 可识别的配置;
- 通过 gRPC 协议(xDS 协议)推送给所有 Sidecar;
xDS 协议:Envoy 的动态配置协议。包含 LDS(监听器)、RDS(路由)、CDS(集群)、EDS(端点实例)。xDS 支持增量推送,配置变更不需要重启 Envoy。这是 Envoy 核心能力。
-
Citadel
- CA 证书中心;负责给每个服务签发身份证书;自动轮换证书;提供 mTLS 证书。
-
Galley
- 校验 Istio CRD 配置合法性,过滤无效配置;
新版 istiod 内部整合 Galley,不再独立部署。
重点:xDS 是 Envoy 和控制平面之间的核心通信协议。
控制平面工作流程完整示例
- 用户编写
VirtualService+DestinationRule,提交到 K8s APIServer; - istiod 监听 CRD 变更,触发配置更新;
- Pilot 解析规则,结合 K8s 服务实例列表,生成 Envoy xDS 配置;
- istiod 通过 gRPC 长连接,增量推送配置给集群所有 Sidecar;
- Sidecar 收到 xDS 配置,热加载,不需要重启 Envoy 进程;
- 新流量立刻按照新灰度规则执行;旧连接不受影响。
容灾特性:控制平面宕机,已经下发到 Sidecar 的配置保存在本地;Sidecar 继续使用旧配置转发流量,业务调用不受影响。控制平面是管控面,不是数据面,控制平面故障不中断业务流量。软考高频考点!
6. Istio CRD 资源详解
Istio 扩展 K8s API,自定义资源 CRD,用来定义流量、安全策略。
| CRD | 作用 |
|---|---|
| VirtualService | 虚拟服务:定义路由规则。流量匹配、权重、流量镜像、故障注入。定义请求怎么转发。 |
| DestinationRule | 目标规则:定义目标服务的策略。负载均衡、熔断、连接池、mTLS 模式、版本子集。VirtualService 依赖 DestinationRule 的子集。 |
| Gateway | 网关:定义集群入口,南北向流量,外部流量进入网格。 |
| PeerAuthentication | 对等认证:控制服务之间 mTLS 模式(关闭 / 允许 / 强制) |
| AuthorizationPolicy | 访问授权策略:服务间访问权限黑白名单 |
| Sidecar | Sidecar 资源:细粒度控制 Sidecar 监听端口、服务发现范围,用来优化大规模集群性能,减少 Sidecar 配置大小 |
关系:VirtualService 回答:请求往哪发;DestinationRule 回答:发到目标服务之后,用什么策略。
举例:灰度发布 CRD 逻辑
- Deployment 部署 order-v1、order-v2;打标签
version: v1/version:v2; - K8s Service order,选择所有带标签 app=order 的 Pod;
- DestinationRule 定义 order 服务,划分两个子集 v1、v2;配置熔断策略;
- VirtualService:匹配 order 服务流量,90% 流量路由到子集 v1,10% 路由 v2;
- istiod 感知配置变更,xDS 推送给 Sidecar。
7. 主流服务网格产品横向对比
Istio
- 数据平面:Envoy;控制平面:istiod;
- 特点:功能最全,生态最强,企业落地最多;支持复杂路由、镜像、mTLS、鉴权;
- 缺点:组件多,资源开销大;早期版本复杂;学习曲线陡峭;适合中大规模集群。
- 适用:企业生产,复杂微服务场景,软考默认示例。
Linkerd
- 数据平面:自研 Linkerd2-proxy(Rust 开发);控制平面轻量化;
- 特点:极简,部署简单,资源占用低;开箱即用;
- 短板:高级流量能力弱,流量镜像、复杂路由能力不如 Istio;适合中小型集群。
Kuma
- 基于 Envoy;轻量;支持 K8s + 虚拟机混合环境;适合异构混合云。
Consul Connect
HashiCorp Consul 配套;强服务发现;K8s 和 VM 混合部署场景。
8. 服务网格与周边组件辨析
8.1 服务网格 vs API 网关 / Ingress Gateway
- API 网关(Ingress Gateway):南北向流量:外部客户端 → 集群内部服务;是集群入口。
- 服务网格 Sidecar:东西向流量:集群内部服务 ↔ 集群内部服务。
Istio Gateway 本质就是 Envoy,作为网格入口网关,同时支持南北向。 一句话区分:网关管进集群 ;Sidecar 管集群内部互相调用。两者经常搭配使用。
8.2 服务网格 vs K8s Service
K8s Service:四层 IP 负载均衡;基于 iptables/ipvs;只能基础转发,没有七层路由、灰度、熔断、mTLS、流量镜像。 服务网格是 K8s 之上七层流量治理增强。K8s Service 依然保留,作为服务发现基础。
8.3 服务网格 vs SpringCloud/Dubbo SDK
SDK 模式:侵入业务代码;语言绑定;治理逻辑在业务进程内部; 服务网格 Sidecar 模式:进程外代理;非侵入;多语言统一治理。
8.4 服务网格 vs 分布式追踪系统
分布式追踪(Jaeger)是可观测组件;服务网格 Sidecar 自动生成 trace 数据,输出给 Jaeger;网格不替代追踪系统。
9. 服务网格落地:适用场景、不适合场景、收益与代价
✅ 适合落地场景
- K8s 集群,微服务数量≥10 个,多语言异构服务(Java、Go、Python 混合);
- 需要频繁灰度发布、蓝绿发布、流量镜像做线上验证;
- 安全要求高,希望全集群服务之间自动 mTLS 加密;
- 基础设施团队统一管控流量策略,业务团队不希望关心通信治理;
- 需要统一可观测,业务不能到处埋点;
- 需要全局服务访问权限控制;混沌工程故障注入。
❌ 不适合场景
- 小规模集群,微服务很少;引入网格带来的复杂度 > 收益;
- 极致低延迟场景,无法容忍 Sidecar 代理增加的网络延迟;
- 资源紧张边缘集群,无法承担 Sidecar CPU 内存开销;
- 单体应用;
- 简单架构,不需要灰度、mTLS、细粒度流量控制。
收益
- 业务代码和通信治理能力解耦;非侵入接入;
- 多语言微服务统一治理标准;
- 流量策略集中管控,运维独立变更策略,无需发布业务;
- 内置安全:mTLS、服务身份认证;
- 统一可观测,自动采集指标、日志、链路追踪;
- 故障隔离能力,降低雪崩风险。
代价
- 资源开销:每个 Pod 增加 Sidecar 进程;大规模集群资源消耗明显;
- 网络延迟增加:请求多一次代理转发;
- 架构复杂度提升:新增整套基础设施;故障排查链路变长:业务 Pod → Sidecar → istiod;网络抓包、问题定位难度上升;
- 学习、运维成本高;需要团队掌握 Envoy、xDS、CRD;
- iptables 劫持带来内核网络开销;大规模集群调优工作量大。
工程最佳实践:不要全集群一次性开启 Sidecar 注入;采用渐进式,部分命名空间、部分服务开启网格,逐步验证。
10. 典型业务场景原理详解
10.1 灰度发布
需求:新版本 v2 上线,只放 10% 流量,观察指标;异常快速切回 v1。 原理:VirtualService 权重分流;流量由调用方 Sidecar 做路由;不需要修改业务代码。
10.2 蓝绿发布
两套完整环境 v1、v2;通过 VirtualService 一键切换全部流量。v2 验证有问题,立刻切回 v1。
10.3 流量镜像
线上真实请求发给 v1;复制一份异步发给 v2;镜像请求返回结果丢弃。用于新版本压测、功能验证,不影响真实用户。
注意:镜像流量会放大后端压力,需要评估容量;写请求镜像可能产生脏数据。
10.4 故障注入
在 Sidecar 层对指定比例请求注入延迟或者错误,测试系统容错能力。混沌工程能力。
10.5 服务访问隔离
PeerAuthentication 开启 mTLS;AuthorizationPolicy 配置策略,只有 order 服务可以调用 payment。
11. 服务网格性能瓶颈、常见问题与优化方案
瓶颈点
- Sidecar CPU / 内存开销;Pod 越多总开销越大;
- iptables 规则膨胀,内核网络栈开销;
- xDS 推送压力:集群几千 Pod 的时候,istiod 推送配置压力大;
- 额外一跳网络转发带来延迟增加;
- 大量日志、指标采集带来开销。
优化手段
- 选择性注入 Sidecar:不是所有 Pod 都注入,只给需要治理的服务开启;
- 使用 Sidecar CRD 缩小 Sidecar 服务发现范围,减少 Sidecar 本地配置量;
- 调优 Sidecar 资源 limit 和 request;
- 对不需要的能力关闭:关闭日志、关闭不必要的指标采集;
- 调大连接池参数,减少连接建立开销;
- istiod 水平扩容;
- 避免过多复杂 VirtualService 规则。
常见故障
- Sidecar 和 istiod 连接中断,无法更新配置;旧配置继续运行;
- iptables 规则错误,流量劫持失败;
- mTLS 策略配置错误,服务之间无法通信;
- xDS 配置推送延迟;新策略不生效。
12. 下一代:eBPF 无 Sidecar 服务网格
传统服务网格:Sidecar 进程代理,流量在用户态转发,带来开销。 eBPF:Linux 内核可编程技术,在内核中挂载钩子,在内核层完成流量劫持、路由、观测。不需要每个 Pod 部署 Sidecar 进程。 代表项目:Cilium。
Sidecar 网格 vs eBPF 网格对比
- Sidecar 网格:用户态代理;每个 Pod 一个进程;开销大;实现简单成熟;Istio;
- eBPF 网格:内核态处理流量;无每个 Pod Sidecar 进程;开销更低;延迟更低;依赖 Linux 内核版本;能力目前弱于成熟 Sidecar 网格。
行业现状:eBPF 是下一代方向,但生产大规模落地、复杂流量治理能力还不如 Istio。