📚 目录
- 一、架构核心:控制平面与数据平面
- 二、数据平面:流量的执行者
- [1. 核心组件:Envoy Proxy](#1. 核心组件:Envoy Proxy)
- [2. 生命周期管理:pilot-agent](#2. 生命周期管理:pilot-agent)
- [3. 流量拦截原理](#3. 流量拦截原理)
- 三、控制平面:网格的大脑
- 四、核心交互流程
- [1. 集群启动与就绪](#1. 集群启动与就绪)
- [2. Pod 创建与 Sidecar 注入](#2. Pod 创建与 Sidecar 注入)
- [3. 业务请求的完整链路](#3. 业务请求的完整链路)
一、架构核心:控制平面与数据平面
Istio 的架构设计精髓在于逻辑上的分离,它将整个服务网格划分为两个核心部分:
- 控制平面 (Control Plane):负责全局的策略配置、安全认证和状态同步。它是网格的"大脑"。
- 数据平面 (Data Plane):由一组智能代理(Sidecar)组成,负责协调和控制微服务之间的所有网络通信。它是网格的"执行层"。
这种分离设计使得 Istio 能够在不修改任何业务代码的情况下,透明地接管微服务间的网络流量。
二、数据平面:流量的执行者
数据平面由部署在每个业务 Pod 中的 Sidecar(边车) 容器组成,它们与业务应用并肩运行。
1. 核心组件:Envoy Proxy
- 角色:高性能代理,负责拦截所有入站(Inbound)和出站(Outbound)流量。
- 能力:在本地执行路由、负载均衡、限流、熔断、mTLS 加密等治理规则。
特点:业务应用完全感知不到它的存在,依然以原本的方式通信。
2. 生命周期管理:pilot-agent
- 角色:Envoy 的"保姆"。
- 能力:负责为 Envoy 准备启动参数、管理进程生命周期(启动、监控、异常重启),确保代理稳定运行。
3. 流量拦截原理
- 机制:Pod 初始化时,通过 Init 容器设置 iptables 规则。
- 效果:将业务容器的所有流量透明重定向到 Envoy 监听的端口(默认 15001/15006),实现无感接入。
三、控制平面:网格的大脑
在 Istio 1.5+ 版本中,控制平面整合为单一组件 Istiod,内部包含三大核心模块:
| 模块 | 核心职责 | 关键能力 |
|---|---|---|
| Pilot | 流量与服务发现 | 将高级路由规则(A/B测试、金丝雀)转换为 Envoy 配置,通过 xDS API 实时下发。 |
| Citadel | 安全与证书管理 | 自动颁发/轮换 TLS 证书,实现服务间 mTLS 双向认证,无需人工干预。 |
| Galley | 配置验证与分发 | 拦截并校验 Istio 资源变更,确保配置合法;解耦底层平台(如 K8s),保证配置独立性。 |
早期的 Mixer 组件(负责策略和遥测)因性能问题已被弃用,相关功能已下沉到数据平面的 Envoy 过滤器中处理。
四、核心交互流程
1. 集群启动与就绪
当在 K8s 中部署 Istio 时:
- Istiod 启动:作为 Deployment 在 istio-system 命名空间运行。
- 建立监听:持续监控 K8s API Server 中的 Services、Endpoints、Pods 及 Istio CRD 变化。
- Webhook 注册:Galley 模块注册校验 Webhook,Citadel 模块作为 CA 就绪,准备签发证书。
2. Pod 创建与 Sidecar 注入
当在开启自动注入的命名空间创建业务 Pod 时:
- 拦截请求:Kube-apiserver 调用 Istio 的 Sidecar-Injector Webhook。
- 修改描述:Injector 动态修改 Pod Spec,注入 istio-proxy 容器(Envoy + pilot-agent)。
- 初始化拦截:Init 容器执行,配置 iptables 规则,打通流量重定向路径。
- 建立连接:
- pilot-agent 启动 Envoy。
- Envoy 通过 gRPC 长连接 向 Pilot 获取服务列表和路由策略。
- Envoy 向 Citadel 发送 CSR(证书签名请求),获取 mTLS 证书。
3. 业务请求的完整链路
当 服务 A 调用 服务 B 时:
- 流量劫持:服务 A 的请求被 iptables 拦截,强制转发给本 Pod 的 Envoy。
- 本地决策:Envoy 根据本地缓存的配置,执行:
- 服务发现:选择服务 B 的具体 Pod 实例。
- 流量治理:执行重试、超时、熔断或灰度路由规则。
- 安全握手:与服务 B 的 Envoy 建立 mTLS 加密通道。
- 转发请求:流量经过加密后发送给服务 B 的 Envoy,再转发给服务 B 应用。
- 配置热更新 (xDS):
- 若管理员修改了路由规则,Istiod 监听到 K8s 变更。
- Pilot 将新规则转换为 Envoy 配置,通过 xDS 协议(LDS/RDS/CDS/EDS)推送。
- Envoy 热加载生效,全程无需重启。
- 遥测上报:Envoy 自动收集指标(延迟、错误率、Trace),上报给 Prometheus/Jaeger。
Envoy (服务B) Envoy (服务A) Istiod (Pilot/Citadel) Sidecar-Injector K8s API Server 用户/CI Envoy (服务B) Envoy (服务A) Istiod (Pilot/Citadel) Sidecar-Injector K8s API Server 用户/CI #mermaid-svg-WJdT0C0UHy8ZaUqp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WJdT0C0UHy8ZaUqp .error-icon{fill:#552222;}#mermaid-svg-WJdT0C0UHy8ZaUqp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WJdT0C0UHy8ZaUqp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WJdT0C0UHy8ZaUqp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WJdT0C0UHy8ZaUqp .marker.cross{stroke:#333333;}#mermaid-svg-WJdT0C0UHy8ZaUqp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WJdT0C0UHy8ZaUqp p{margin:0;}#mermaid-svg-WJdT0C0UHy8ZaUqp .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WJdT0C0UHy8ZaUqp text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-WJdT0C0UHy8ZaUqp .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-WJdT0C0UHy8ZaUqp .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-WJdT0C0UHy8ZaUqp #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-WJdT0C0UHy8ZaUqp .sequenceNumber{fill:white;}#mermaid-svg-WJdT0C0UHy8ZaUqp #sequencenumber{fill:#333;}#mermaid-svg-WJdT0C0UHy8ZaUqp #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-WJdT0C0UHy8ZaUqp .messageText{fill:#333;stroke:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WJdT0C0UHy8ZaUqp .labelText,#mermaid-svg-WJdT0C0UHy8ZaUqp .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .loopText,#mermaid-svg-WJdT0C0UHy8ZaUqp .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-WJdT0C0UHy8ZaUqp .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-WJdT0C0UHy8ZaUqp .noteText,#mermaid-svg-WJdT0C0UHy8ZaUqp .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-WJdT0C0UHy8ZaUqp .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WJdT0C0UHy8ZaUqp .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WJdT0C0UHy8ZaUqp .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WJdT0C0UHy8ZaUqp .actorPopupMenu{position:absolute;}#mermaid-svg-WJdT0C0UHy8ZaUqp .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-WJdT0C0UHy8ZaUqp .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WJdT0C0UHy8ZaUqp .actor-man circle,#mermaid-svg-WJdT0C0UHy8ZaUqp line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-WJdT0C0UHy8ZaUqp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. Pod 创建阶段 2. 业务请求阶段 3. 配置变更 (异步) 创建 Pod A 触发 Webhook 注入 istio-proxy 容器 启动容器 & Init(iptables) gRPC: 获取配置 & CSR证书 返回路由规则 & mTLS证书 发起请求 (被iptables劫持) 本地执行路由/熔断策略 mTLS 加密通信 本地执行入站策略 返回响应 修改 VirtualService Watch 事件通知 xDS 推送新配置 热加载生效 (无重启)