26 四周学习计划与自测答案¶
本章目标:把一次阅读变成可持续练习,每周都留下能解释的结果。每天可投入 45–90 分钟时可按四周推进;时间更少可以拉长周期,保持概念与实验成对出现。不要把阅读速度作为唯一进度指标。
第一周:能解释一台代理¶
前两天读第 01–03 章。分别画一张 HTTP 链路图和组件职责图,标出连接地址、Host、上游、下游、配置流和业务流。第三天读资源图,把 Listener、HCM、Route、Cluster、Endpoint 关系写成带实际名字的五行记录。第四、五天运行静态实验,依次观察业务请求、server_info、config_dump、clusters。第六天做一次蓝绿切换和一次后端失败练习。第七天整理笔记并回答基础题。
本周产物:一份不依赖命令历史的实验说明。另一个初学者能按你的说明从零启动,且你能解释每个端口属于谁。若访问失败时仍只能说“网关坏了”,应先完成第 24 章前半部分,再进入下一周。
第二周:能解释配置分发¶
先读第 08–10 章,掌握 xDS 资源、Go 消息与 Any。不要求背下所有 protobuf 字段,重点是“资源名字怎样引用”“哪一个类型被封装进 Any”。随后读第 11–13 章并运行动态实验。提交 green、非法 purple、再恢复 blue,记录管理响应、版本和业务响应。最后读第 14–15 章,用源码确认一个你亲自观察到的行为。
本周产物:一张协议时序图和一条源码阅读笔记。图中标出客户端订阅、服务端版本、nonce 与 ACK/NACK;笔记必须写清函数实际保证什么,以及不保证什么。阅读 Consistent() 时应能指出它验证 EDS/RDS 关系的边界,而不是只说“检查所有配置正确”。
第三周:能解释网关意图¶
前两天补 Kubernetes 与 Gateway API 基础。把 namespace、Deployment、Service、EndpointSlice 与 GatewayClass、Gateway、HTTPRoute 分成两张图再连接起来。随后运行 EG 实验,检查正确 Host、未知 Host、请求头路由与限流。学习 TLS 时为入口生成独立测试证书,正确使用域名和信任根验证,不要用跳过校验的成功作为证书正确的证据。
本周产物:从 HTTPRoute 到后端响应的证据链。至少包含 parent 接入情况、引用解析、控制器和数据平面区分、实际后端端点与请求结果。读源码导读时找到 Gateway API translator 与 xDS translator 的输入输出,解释中间表示为什么存在。
第四周:能独立验证和排障¶
完成第 25 章综合项目,并选择两个故障:一个在配置层,例如错误 backendRef;一个在运行层,例如后端不可用。每次只引入一个变量,先保存证据,再修复并验证。回顾 EG 升级与自建控制平面生产边界,写一份“教学实验缺少什么”的清单,区分当前缺少的能力与所处组织真正需要的能力。
本周产物:一份综合项目笔记、两份故障复盘、一个下一步阅读问题。问题应足够具体,例如“为什么 snapshot 发布后有些资源 watch 仍不立即响应”,而不是“我要读懂整个 Envoy”。然后用源码索引沿调用链寻找答案。
十二道自测题¶
- Host 和连接目的 IP 为什么可以不同?
- Listener 与 Cluster 各管理哪一段连接?
- route_config、RDS 和 RouteConfiguration 的关系是什么?
- go-control-plane 根模块与 envoy 子模块为什么要分开看版本?
- Node.ID 不匹配会导致什么?
- version_info 与 nonce 各用来识别什么?
- NACK 后旧配置为何可能继续服务?
- ADS 与 Snapshot 是否构成跨资源全局事务?
- Service 有对象但 EndpointSlice 没有可用地址时意味着什么?
- HTTPRoute 能否无条件引用另一个 namespace 的 Service?
- 给 Gateway 配证书是否保护了到后端的连接?
- 为什么 ACK、status 和真实请求都值得保留?
参考答案
- IP/端口决定网络连接目标,Host/authority 描述 HTTP 目标网站;共享入口可按 Host 区分站点。
- Listener 接收下游连接;Cluster 定义上游连接目标和相关策略。
- RouteConfiguration 是资源类型,可内嵌静态 route_config,也可通过 RDS 动态发现。
- 仓库包含多 Go 模块、独立 tag 和依赖,latest release 可能属于子模块,不能把名字直接当根模块版本。
- 基于 ID 的分组无法找到预期 snapshot;gRPC 能连通也可能无配置。认证与 ID 仍需独立设计。
- version_info 表达资源集合的版本标识;nonce 关联某个响应及随后客户端反馈,二者不能互换。
- Envoy 对无效更新保留已接受状态的行为帮助维持服务;但新节点、初始就绪、TTL 等情况仍有额外约束。
- 不构成。资源类型与代理可能在不同时间收敛,需要兼容过渡状态。
- 可能 selector 没选到 Pod、Pod 未 Ready、端口或控制器状态有问题;存在 Service 不能证明有可用后端。
- 不能。需满足字段支持、跨 namespace 授权等条件,通常由目标 namespace 的 ReferenceGrant 明确许可;与 Route 接入 Gateway 的 allowedRoutes 是不同授权。
- 不保护。下游 TLS 终止与上游 TLS 配置独立。
- 它们分别证明协议接受、平台协调状态和选定场景的数据平面行为,覆盖不同范围。
下一步读什么¶
平台使用者可以继续学习多团队 Gateway 授权、证书自动化、限流服务与观测部署;控制平面开发者可以继续研究 Delta、资源生命周期、分组规模、缓存并发和分布式状态;希望贡献 EG 的读者可以从已有 translator 测试用例入手,加一个最小输入,观察 IR 与 xDS 输出,而不是先通读整个仓库。
阅读后续资料时,继续保留版本坐标与验证习惯。理解一个功能的最小可靠方式,是能说明它的输入、转换、输出、失败情况和验证证据。