服务网格架构
想象一座现代化工厂的物流系统。每个车间(服务)门口都有一个智能物流机器人(边车代理),负责接收物料、搬运产品、处理异常。工厂还有一个中央控制室(控制平面),实时监控所有机器人的状态,下发运输指令,调度物流资源。
这个「每个车间配机器人 + 中央控制室」的模式,就是服务网格的架构本质。
服务网格的宏观架构
服务网格由两大部分组成:
- 数据平面(Data Plane):负责实际的数据包转发,由每个服务旁的边车代理组成
- 控制平面(Control Plane):负责管理和配置数据平面,提供统一的策略下发
数据平面:边车代理
数据平面由边车代理(Sidecar Proxy)组成,每个服务实例旁运行一个代理实例。
Envoy 代理核心能力
Envoy 是目前最流行的边车代理,被 Istio、Ambassador、HashiCorp Consul 等主流服务网格采用。
Envoy 的线程模型
Envoy 使用单进程多线程模型:
- 主线程:管理配置更新、统计、健康检查
- 工作线程:处理请求,每个线程独立处理连接
- 监听线程:接受新连接,分发给工作线程
控制平面:Istio 架构
以 Istio 为例,控制平面由多个组件组成:
Pilot:服务发现与流量管理
Pilot 负责从服务注册中心(通常是 Kubernetes)获取服务信息,并将其转换为 Envoy 可以理解的配置:
Citadel:证书与身份管理
Citadel 负责签发证书、管理服务身份:
Galley:配置验证与分发
Galley 负责验证用户提交的 Istio 配置,防止错误配置进入集群:
xDS 协议
xDS 是服务网格的「通用语言」,定义了控制平面与数据平面之间的配置接口。
「x」代表可扩展的多种协议:
xDS 配置流
xDS 配置示例
流量拦截完整流程
从客户端请求到服务端响应的完整流程:
各阶段处理内容
服务网格的典型配置模型
虚拟服务(Virtual Service)
定义路由规则,控制流量分配:
目标规则(Destination Rule)
定义服务子集和负载均衡策略:
服务网格架构的权衡
控制平面的高可用:控制平面是整个服务网格的大脑,通常需要多副本部署保证高可用。Istio 的 istiod 组件是无状态的,可以水平扩展;Consul Connect 的 control plane 依赖 Consul 集群本身的高可用。
术语表
延伸思考
服务网格的架构设计,本质上是把「控制」和「转发」分开:
- 控制平面做决策:哪些流量可以走、走哪条路、服务是否健康
- 数据平面做执行:按照控制平面的决策转发数据包
这种分离带来了灵活性:可以独立升级控制平面或数据平面,而不影响业务。控制平面发了新的路由规则,数据平面的边车代理自动获取并应用,无需重启服务。
但这种灵活性也带来了复杂性:配置生效的时机不再由你完全控制。控制平面说「配置已下发」,但边车代理可能还没拉取到最新配置。这在生产环境中需要特别注意,建议在发布配置前留足观察时间。
另外一个趋势是控制平面的轻量化。Istio 从 1.5 版本开始把 Pilot、Citadel、Galley 合并成单一的 istiod 组件,大大简化了部署和运维。未来可能会进一步简化,让服务网格更加「隐形」。