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(总调度室 / 大脑) 读 CRD/服务 → 想清楚 → 生成 xDS 配置 Envoy(管家A) 转发+限流+加密 Envoy(管家B) 转发+限流+加密 Envoy(管家C) 转发+限流+加密 数据面(手脚) xDS 下发配置
一个大脑(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 也不用大动干戈。这就是"按变化频率分层"。
L04

三段式职责

istiod 的代理配置职责分三段(pilot.md:8-11):

  1. Config Ingestion(配置摄取):从 20+ 种来源(K8s CRD、文件、xDS)读取,聚合成 ConfigStore(配置,Day 03)和 ServiceDiscovery(服务发现,Day 04)。
  2. Config Translation(配置翻译)Generators 把输入翻译成 Envoy xDS(Day 07-08)。
  3. 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 执行)。两门课拼起来就是完整的服务网格。
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 02istiod 启动——pilot-discovery 二进制怎么 boot:main → NewServer(装配总入口)→ Start(监听 xDS gRPC)。看控制面怎么组装起来。
← 总目录 Day 02 · istiod 启动 →