Istio 架构与核心组件

好,我们直接进入正题。上一章聊了为什么需要服务网格,这章咱们把 Istio 拆开看看。你把它想象成一个智能交通系统,控制平面就是交管中心,数据平面就是路口的摄像头和信号灯。

我个人习惯,学一个新东西,先看它长什么样,再琢磨怎么用。 Istio 的架构图很简单,但你要是只看官方文档,容易被一堆名词绕晕。我结合自己踩过的坑,带你捋一遍。

整体架构:控制平面 vs 数据平面

Istio 分两层:控制平面和数据平面。数据平面负责处理流量,控制平面负责告诉数据平面怎么处理。

说白了,数据平面干苦力,控制平面下指令。这个关系很重要,你想想看,如果控制平面挂了,数据平面还能按最后一条指令跑一阵子,但没法做调整了。

核心记忆点:

数据平面处理的是“数据包”,控制平面处理的是“配置”。两者之间通过 xDS 协议通信,这是 Istio 与 Envoy 对话的语言。

核心组件逐个拆解

Istio 1.5 之后,控制平面合并成了一个单体——istiod。但内部还是那几个组件在干活。我刚开始接触的时候,总觉得“合并成一个了,就不用学那么细了吧?” 结果出了问题,日志里全是 istiod 的报错,根本不知道是 Pilot 还是 Citadel 的锅。还是得拆开看。

下面这个表,是我总结的几个核心组件,你看一眼就能对上号:

组件名 所属平面 核心职责 一句话记住它
Pilot 控制平面 服务发现 + 流量管理 它告诉 Envoy 去哪找谁,怎么走
Mixer 控制平面 访问控制 + 遥测采集 它负责“同意与否”以及“记个账”
Citadel 控制平面 证书签发 + 身份管理 它就是 Istio 的 CA(证书颁发机构)
Galley 控制平面 配置验证 + 分发 它是守门员,检查配置有没有语法错误
Envoy 数据平面 代理所有进出流量 每个 Pod 里的“交通警察”

Pilot:服务发现的“大脑”

Pilot 是我接触最多的组件。它负责两件事:一是从平台(比如 Kubernetes)拉取服务注册信息,二是把这些信息转换成 Envoy 能理解的配置。

记得有一次,我在项目里调整了服务间的超时时间,结果怎么都不生效。查了一整天,最后发现 Pilot 的缓存没刷新。嗯,这里要注意,Pilot 有自己的缓存机制,改了配置别急着看效果,等几秒或者手动触发一次同步。

避坑指南:

我曾经直接修改了 Envoy 的配置,想绕过 Pilot 做点“骚操作”。事实证明,这是给自己挖坑。Pilot 会定期覆盖 Envoy 的配置,你改的会被冲掉。正确的做法是通过 Istio 的 CRD(比如 VirtualService、DestinationRule)来操作。

Mixer:策略与遥测的“管家”

Mixer 在 Istio 1.5 之后默认被移除了,但它的能力被拆解并内置到了 Envoy 和 istiod 里。但我觉得还是有必要讲一下,因为很多老项目还在用,而且理解它的设计思路,对你理解“策略执行点”这个概念很有帮助。

Mixer 的核心就是“解耦”。它把策略检查和遥测报告从 Envoy 里抽出来,变成一个独立的服务。好处是 Envoy 变轻了,坏处是多了一跳网络开销,性能会有损耗。

为什么会这样?因为每个请求到了 Envoy,Envoy 得先问 Mixer:“这个请求能过吗?” 然后 Mixer 查完策略再告诉 Envoy。一来一回,延迟就上去了。这也是为什么后来 Istio 社区决定把它砍掉,直接让 Envoy 自己做策略检查。

重要提醒:

如果你在用 Istio 1.5 之前的版本,并且启用了 Mixer,务必注意它的性能瓶颈。我曾经在一个高并发的支付系统上,因为 Mixer 的检查逻辑太复杂,导致 p99 延迟从 10ms 飙到了 200ms。

Citadel:安全通信的“护盾”

Citadel 是 Istio 实现 mTLS(双向 TLS)的核心。咱们这门课是讲“接口安全策略”的,所以 Citadel 是你必须吃透的组件。

它的工作流程很简单:

  1. Citadel 监听 Kubernetes 的 ServiceAccount 创建事件。
  2. 为每个 ServiceAccount 生成一个 X.509 证书,并注入到对应的 Pod 里。
  3. Envoy 之间通信时,用这个证书做双向认证。

说白了,就是 Istio 给每个服务发了一张“身份证”,别人一看就知道你是谁。

我在项目里遇到过一个坑:证书轮换。Citadel 默认证书有效期是 24 小时,到期前会自动轮换。但如果你的集群时间不同步,证书验证就会失败,服务直接断连。所以,确保 NTP(网络时间协议)服务正常工作,这是最基本的前提。

Galley:配置的“验证员”

Galley 相对来说比较低调,但它的作用很重要。它负责验证你提交的所有 Istio 配置(比如 VirtualService、DestinationRule 等),确保它们符合规范,然后把正确的配置分发给 Pilot。

我个人习惯,每次改动配置前,都会用 istioctl analyze 命令先检查一遍。这个命令背后调用的就是 Galley 的验证逻辑。如果不检查,直接 apply,很可能会把错误的配置推到集群里,导致服务间通信异常。

举个例子,我曾经写了一个 VirtualService,把流量路由到了一个不存在的 subset(子集)上。如果没有 Galley 帮我拦住,Pilot 会把这个配置下发下去,结果就是 50% 的请求都 503 了。

Envoy:数据平面的“执行者”

前面四个都是控制平面的,Envoy 是唯一一个跑在数据平面的。它作为 Sidecar 容器,跟业务容器一起待在同一个 Pod 里。

Envoy 接收来自 Pilot 的配置,然后根据这些配置来转发、拦截、修改流量。你设置的重试、超时、熔断、限流,最终都是 Envoy 在执行。

你别看 Envoy 只是一个代理,它的能力非常强,支持热重启、动态配置、丰富的过滤器链。我们在后面讲“安全策略落地”的时候,会频繁操作 Envoy 的行为。

实用技巧:

排查问题时,我最常用的就是直接看 Envoy 的 admin 界面。在 Pod 里执行 curl localhost:15000/stats 或者 curl localhost:15000/config_dump,就能看到 Envoy 当前的所有配置和统计信息。这比看日志快多了。

它们是怎么协同工作的?

了解了每个组件,我们来看看它们怎么配合。下面这张图,是我自己整理的 Istio 核心工作流程:

Istio 核心组件协同工作流程 Istio 核心组件协作流程 Kubernetes API Galley (配置验证) Pilot (服务发现/流量管理) Citadel (证书管理) Envoy (数据平面代理) 业务容器 图例说明: 1. 用户提交配置到 K8s API → Galley 验证 → 通过后转给 Pilot 2. Citadel 生成证书并下发到 Envoy + 业务容器 3. Pilot 将流量规则下发 Envoy,Envoy 拦截所有进出流量

你从上往下看:

  • 第一步:用户通过 kubectl apply 提交 Istio 配置(比如一个 VirtualService)。这个配置先被 Kubernetes API 接收。
  • 第二步:Galley 监听到新配置,对它进行格式和逻辑校验。如果校验通过,就转发给 Pilot。
  • 第三步:Pilot 拿到配置后,同时做两件事:一个是结合服务注册信息,生成 Envoy 能读懂的 xDS 配置;另一个是从 Citadel 那边获取证书信息。
  • 第四步:Pilot 把最终的配置下发给每个 Pod 里的 Envoy 代理。Citadel 则把证书直接注入到 Pod 里。
  • 第五步:Envoy 根据配置,开始拦截业务容器的所有进出流量,执行路由、限流、mTLS 等策略。
核心理解点:

整个流程的核心是“配置驱动”。你改配置 → Istio 自动响应 → 所有代理自动更新。你不需要重启任何服务,这就是“流量管理”的精髓。

关于 mTLS 的进一步说明

刚才 Citadel 部分提到了 mTLS,这里我再多说两句。因为咱们这个课程叫“接口安全策略落地”,mTLS 就是第一道防线。

mTLS 不是简单地“加个证书”,它涉及三个层面的工作:

  1. 身份认证:服务 A 访问服务 B 时,B 要求 A 出示证书,证明“你确实是 A”。
  2. 机密性:证书验证通过后,建立一个加密通道(TLS),所有数据都加密传输。
  3. 完整性:防止数据在传输过程中被篡改。

Istio 默认开启的是“宽容模式”(permissive mode),意思是:如果对方发了证书就做 mTLS,没发证书就用明文。但为了安全,我建议你在生产环境开启“严格模式”(strict mode),强制所有服务间通信都必须走 mTLS。

实战警告:

我曾经在一个有 200 多个微服务的系统上,直接开启了全局严格模式。结果一堆老服务炸了——因为它们不支持 mTLS,也没有对应的证书。正确做法是:先开启宽容模式观察一段时间,确认所有服务都能正常获取证书后,再逐步切换到严格模式。

本章小结

到这,Istio 的核心架构和组件我们就过了一遍。控制平面(istiod)负责定规则,数据平面(Envoy)负责执行规则。Pilot 管“路怎么走”,Citadel 管“你是谁”,Galley 管“规则对不对”。Envoy 则是那个在每个 Pod 里默默干活的兄弟。