Day 01 / 共 20 天 · 第 1 周 控制面全景
项目全景:服务网格控制面
欢迎来到 Istio——higress-group 系列第 2 站。学完 Envoy(数据面),现在看控制面。第一天建立全局图:控制面 vs 数据面、xDS 五兄弟、istiod 的三段式职责,以及它和你学过的 Envoy 怎么承接。
📍 你在控制面 istiod 之旅的位置(Day 1-10 主线:全景 → 启动 → 摄取 → xDS → 生成 → 下发,每天点亮当前格)
D1 全景·
D2 启动·
D3 配置CRD·
D4 服务注册·
D5 快照·
D6 xDS服务·
D7 生成·
D8 Builder·
D9 推送·
D10 连接
L01
Istio 是什么
🤔 痛点:微服务多了,网络治理成了噩梦
你有 50 个微服务,每个都要处理"找到别的服务、失败重试、超时、加密、限流、监控"。如果每个服务各写一套,重复、口径不一、想统一改一次要动 50 份代码——运维想哭。
💡 本质:把网络治理"下沉"成公共基础设施
Istio 就像给整条商业街配了一套统一的物业系统:每个店铺门口派一个贴身管家(Envoy sidecar)替它处理所有对外往来,再设一个总调度室(istiod)统一下发规矩。店家(业务代码)只管卖货,收发、验证、记账全交给管家。你已经学过管家(Envoy),这门课学总调度室(istiod)。
Istio 是最主流的服务网格(Go 编写)。它给你的微服务集群加上"流量治理 + 安全 + 可观测"能力——而且业务代码零改动。核心组件叫 istiod(一个"模块化单体",pilot.md:4),内含 Pilot(配置代理)、Citadel(证书)等。
服务网格 = "给微服务装的公共基础设施"
微服务多了,每个服务都要处理:怎么找到别的服务、失败重试、超时、加密通信、限流、监控…… 如果每个服务自己写这些,重复且易错。服务网格的思路:把这些"网络治理"能力下沉到每个服务旁边的一个代理(Envoy sidecar),由一个中央大脑(istiod)统一配置。业务只管业务,治理交给网格。Istio = 那个中央大脑 + 遍布各处的 Envoy 代理。你已经学了代理(Envoy),现在学大脑(istiod)。
L02
控制面 vs 数据面
架构文档 architecture/networking/pilot.md 是最佳起点。核心定位(pilot.md:15):
Envoy 是 xDS 客户端(消费者),istiod 是 xDS 服务端(发送者)。本仓库实现的正是"发送者"这一侧。
大脑(控制面)和手脚(数据面)
数据面(data plane)= 遍布各处的 Envoy,真正转发流量、执行策略——它是"手脚"。控制面(control plane)= istiod,决定"流量该怎么转、谁能访问谁、怎么加密",然后把决策下发给所有 Envoy——它是"大脑"。大脑不碰具体流量(那太慢),只负责"想清楚 + 分发指令"。手脚不做决策(那太分散),只负责"执行"。这个分离是现代云原生基础设施的黄金法则。你学 Istio,就是学这个大脑怎么工作。
一个大脑(istiod)用 xDS 给一群手脚(Envoy)下发配置;流量只在数据面之间流动,大脑不碰。
L03
xDS 五兄弟
大脑怎么给手脚下指令?靠 xDS 协议(一组 gRPC 流式 API)。Envoy 通过 xDS 向 istiod 索取配置(pilot.md:13):
| xDS | 下发 |
|---|---|
| LDS | 监听器(Listener) |
| RDS | 路由(Route) |
| CDS | 集群(Cluster) |
| EDS | 端点(Endpoint) |
| SDS | 证书(Secret) |
读法:这五个你在 Envoy 课 Day 11 学过(从接收端视角)!现在从发送端看:istiod 怎么生成这些配置并推给 Envoy。还有 ECDS(扩展配置)、NDS(DNS)等。理解"同一套 xDS,Envoy 收、istiod 发",就打通了两门课。
💡 记忆口诀:LR-CE-S
"听路由、找机器、发工牌"——LDS 听(监听端口)、RDS 路由(去哪个服务)、CDS 集群 + EDS 端点(这个服务有哪些机器/IP)、SDS 发工牌(证书)。一个请求进来的处理顺序也大致是这个链。
📝 举个例子:一次配置下发
你在集群里给
reviews 服务扩容,多了一个 Pod(IP 10.1.2.9)→ istiod 感知到端点变化 → 只需通过 EDS 给相关 Envoy 推一条 reviews 集群新增端点 10.1.2.9:9080 → Envoy 立刻把它加入负载均衡池。整个过程 Envoy 不用重启、监听器/路由都不动。💬 对话体
👶 小白:为什么要把配置拆成 LDS/RDS/CDS/EDS 五种,不能一份大配置全发吗?
👨🏫 老师:因为变化频率天差地别。端点(EDS)可能每秒都在变(扩缩容),但监听器(LDS)几乎不变。拆开后,端点一变只推 EDS 那一小条,不用重发整包——省带宽、Envoy 也不用大动干戈。这就是"按变化频率分层"。
👨🏫 老师:因为变化频率天差地别。端点(EDS)可能每秒都在变(扩缩容),但监听器(LDS)几乎不变。拆开后,端点一变只推 EDS 那一小条,不用重发整包——省带宽、Envoy 也不用大动干戈。这就是"按变化频率分层"。
L04
三段式职责
istiod 的代理配置职责分三段(pilot.md:8-11):
- Config Ingestion(配置摄取):从 20+ 种来源(K8s CRD、文件、xDS)读取,聚合成
ConfigStore(配置,Day 03)和ServiceDiscovery(服务发现,Day 04)。 - Config Translation(配置翻译):
Generators把输入翻译成 Envoy xDS(Day 07-08)。 - Config Serving(配置下发):接受 Envoy 的 gRPC 流,通过"请求"和"推送"下发(Day 06/09)。
读法:核心数据流(
pilot.md:143-162):Config Update → Debounce → Recompute PushContext → Push Queue → Push Job → Client。这条链是整个第 2 周的主线。摄取(W1)→ 翻译 + 下发(W2)。L05
带 Proxy 翻译
为什么每个 Envoy 收到的配置都不一样?
关键洞察(
pilot.md:104):xDS 翻译不是"一份配置发给所有人",而是针对每个客户端(proxy)单独翻译。因为 Istio 要根据每个 Envoy 的标签、命名空间、Sidecar 作用域决定"该给它哪些配置"——比如 A 服务的 Envoy 只需要知道它会调用的那几个服务,不需要全网格的配置。"带 Proxy 信息翻译"带来两个后果:①无法静态预生成(每个 proxy 不同);②需要缓存和"部分计算"优化(否则每次都全量算太慢)。这解释了第 2 周为什么有那么多缓存和优化逻辑。L06
目录地图
| 目录 | 内容 |
|---|---|
pilot/ | 控制面核心:cmd/pilot-discovery(istiod 入口) pkg/bootstrap(装配) pkg/xds(xDS 服务) pkg/networking/core(配置生成) pkg/model(数据模型) pkg/serviceregistry(服务发现) |
pkg/istio-agent/ | sidecar 里的 pilot-agent(Day 12) |
security/ | CA、证书、mTLS(Day 14) |
istioctl/ operator/ | CLI(Day 18)、安装(Day 19) |
architecture/ | 架构文档(networking/pilot.md 必读) |
读法:控制面核心几乎都在
pilot/pkg/。这是 higress-group 的 fork,代码里有 // Added by ingress 标记 Higress 的定制(Day 17/20 会重点讲)。L07
与 Envoy 承接
Istio 和 Envoy 怎么接上:
• Envoy 课你学了:Envoy 从 bootstrap 里的 ADS 地址连控制面,通过 xDS 收配置、执行。
• Istio 课你会学:istiod 就是那个"控制面"——它生成那些 xDS 配置。
• 中间还有 pilot-agent(Day 12):sidecar 里 Envoy 旁边的管家,拉起 Envoy、代理 xDS、发证书。
完整链路:你写 CRD(VirtualService 等)→ istiod 翻译成 xDS → 经 pilot-agent 转发 → Envoy 执行。这门课讲前半段(istiod 生成 + agent 转发),Envoy 课讲后半段(Envoy 执行)。两门课拼起来就是完整的服务网格。
• Envoy 课你学了:Envoy 从 bootstrap 里的 ADS 地址连控制面,通过 xDS 收配置、执行。
• Istio 课你会学:istiod 就是那个"控制面"——它生成那些 xDS 配置。
• 中间还有 pilot-agent(Day 12):sidecar 里 Envoy 旁边的管家,拉起 Envoy、代理 xDS、发证书。
完整链路:你写 CRD(VirtualService 等)→ istiod 翻译成 xDS → 经 pilot-agent 转发 → Envoy 执行。这门课讲前半段(istiod 生成 + agent 转发),Envoy 课讲后半段(Envoy 执行)。两门课拼起来就是完整的服务网格。
L08
今日小结 + 动手
🧠 今天你应该能回答
- 服务网格解决什么问题?istiod 是什么?
- 控制面 vs 数据面的分工?Istio 实现的是哪一侧?
- xDS 五兄弟各下发什么?和 Envoy 课怎么对应?
- istiod 三段式职责?核心数据流?
- 为什么每个 Envoy 收到的配置不同?(带 Proxy 翻译)
✋ 动手
cd /Users/bitmart/work/codes/github/higress-group/istio
sed -n '1,60p' architecture/networking/pilot.md
ls pilot/pkg/
ls pilot/cmd/
明天预告 · Day 02:istiod 启动——
pilot-discovery 二进制怎么 boot:main → NewServer(装配总入口)→ Start(监听 xDS gRPC)。看控制面怎么组装起来。