Istio架构总览:控制平面与数据平面

好,咱们今天聊聊Istio的整体架构。说实话,我第一次接触Istio时,也被它那堆组件名字搞晕过——Pilot、Mixer、Citadel,听着像航空公司的航班代号。但等你真正拆开来看,其实没那么复杂。

Istio的架构,说白了就两个部分:控制平面数据平面。这个划分在服务网格里几乎是标配。数据平面负责干活,控制平面负责指挥。嗯,就这么简单。

数据平面:Envoy代理的核心作用

数据平面里跑的是什么?是Envoy代理。每个服务旁边都挂着一个Envoy,就像每个员工身边配了个私人助理。所有进出的流量,都得经过这个助理。

Envoy能干的事太多了。我挑几个重点说说:

  • 流量拦截与转发:Envoy用iptables规则把流量劫持到自己手里,然后根据控制平面下发的配置做转发。我在生产环境里遇到过一个问题——iptables规则没配好,结果流量直接绕过了Envoy,服务间调用完全不受管控。排查了半天才发现是初始化顺序的问题。
  • 负载均衡:支持多种算法,轮询、最少连接、一致性哈希等等。我个人习惯用最少连接,因为后端服务性能不均时效果更好。
  • 熔断与重试:当某个服务挂了,Envoy能自动熔断,避免雪崩。我曾经见过一个场景,A服务调用B服务,B服务响应越来越慢,结果所有线程都卡在等待上,整个系统瘫了。后来加了熔断,阈值一设,问题就解决了。
  • 指标收集与链路追踪:Envoy会自动生成各种指标,比如请求延迟、错误率。你想想看,没有Envoy,这些数据你得自己埋点,多麻烦。

核心要点:Envoy是数据平面的唯一组件。它负责所有网络通信的代理工作。控制平面下发配置,Envoy执行配置。两者通过xDS协议通信。

控制平面:Pilot、Mixer、Citadel

控制平面是Istio的大脑。它由三个核心组件组成:Pilot、Mixer、Citadel。不过我得说一句,Mixer在较新版本里已经被逐渐剥离了,但理解它的设计思路仍然很有价值。

Pilot:服务发现与流量管理

Pilot是控制平面里最核心的组件。它负责两件事:服务发现和流量管理。

服务发现这块,Pilot会从平台(比如Kubernetes)拉取所有服务的注册信息,然后转换成Envoy能理解的格式。流量管理呢,就是把你写的VirtualService、DestinationRule这些CRD,翻译成Envoy的配置。

我记得有一次,团队里有人改了VirtualService的权重,结果流量没按预期分配。查了半天,发现是Pilot的配置下发有延迟。后来我们调整了Pilot的同步间隔,问题就解决了。嗯,这里要注意,Pilot的配置下发不是实时的,有缓存机制。

小技巧:如果你改了流量规则但没生效,可以试试重启Pilot Pod,或者直接调用Envoy的管理接口强制刷新配置。

Mixer:策略与遥测(历史组件)

Mixer在早期版本里负责策略检查和遥测数据上报。每次请求经过Envoy时,Envoy会先问Mixer:“这个请求能过吗?”Mixer检查完策略,再告诉Envoy放行还是拒绝。

但这里有个性能问题——每个请求都要多一次RPC调用,延迟就上去了。我在压测时发现,加了Mixer后,P99延迟直接翻倍。所以后来Istio社区把Mixer的功能拆了,策略检查放到了Envoy里,遥测数据直接上报。

说白了,Mixer的设计理念很好,但实现上太重了。现在你如果用的是新版本Istio,基本看不到Mixer的身影了。

Citadel:安全与证书管理

Citadel负责服务间的身份认证和通信加密。它会给每个服务签发一个证书,服务之间通信时用这个证书做mTLS(双向TLS)。

你想想看,没有Citadel,服务间的通信就是明文。万一有人在内网搞个中间人攻击,数据就全暴露了。Citadel解决了这个问题,而且证书会自动轮换,不需要人工干预。

我曾经遇到过一个问题:Citadel的证书过期了,结果服务间通信全断了。排查时发现是Citadel的证书签发组件出了故障,重启后才恢复。从那以后,我养成了一个习惯——监控证书的过期时间,提前告警。

避坑指南:我曾经在生产环境里遇到过Citadel证书轮换失败的情况。原因是集群时间不同步,导致证书签发时的时间戳异常。建议你在部署Istio前,先确保所有节点的NTP服务正常。

控制平面与数据平面的交互

控制平面和数据平面怎么通信?通过xDS协议。xDS是一组协议的统称,包括LDS(监听器发现)、RDS(路由发现)、CDS(集群发现)、EDS(端点发现)等等。

流程大概是这样的:

  1. Pilot从Kubernetes获取服务信息
  2. Pilot把服务信息转换成xDS配置
  3. Envoy通过gRPC流式拉取这些配置
  4. Envoy根据配置处理流量

这个过程中,Envoy会定期向Pilot发送心跳,确保连接正常。如果连接断了,Envoy会使用本地缓存的配置继续工作,不会立即中断服务。

关键点:控制平面挂了,数据平面还能继续工作一段时间。但如果你改了流量规则,新规则不会生效,直到控制平面恢复。

总结一下

Istio的架构其实不复杂:

  • 数据平面:Envoy代理,负责流量转发、负载均衡、熔断、指标收集
  • 控制平面:Pilot(服务发现与流量管理)、Mixer(策略与遥测,已逐渐废弃)、Citadel(安全与证书管理)

我个人觉得,理解Istio架构的关键在于搞清楚控制平面和数据平面的分工。控制平面下发配置,数据平面执行配置。两者各司其职,互不干扰。你想想看,这种设计的好处是什么?控制平面升级时,数据平面不受影响,流量照常转发。这就是服务网格的魅力所在。

下一章,咱们会深入Envoy的配置细节,看看xDS协议到底是怎么工作的。到时候我会分享一些我在生产环境里踩过的坑,保证让你少走弯路。