服务网格 06:路由规则怎样变成代理配置
声明“给 v2 一部分流量”以后,谁真正执行
前面已建立 frontend → orders → inventory-v1 / inventory-v2 的服务链,并在 第 03 篇拆开独立代理的 route、cluster 与 endpoint。sidecar 模式下,应用继续用原来的上游地址,配置却需要从 Kubernetes 资源变成 orders 旁的 Envoy 可执行的路由。Istiod 负责观察和生成配置,不是业务请求必经的转发节点。读者需要知道 Service 与 Envoy route 的不同,并能用请求 ID 定位实际库存实例。
这张图中上方为控制路径,下方为请求路径;两个箭头不能合并。“资源已提交”“代理已确认”“配置已存在”“本次请求匹配”是四种不同命题。
五步收集证据
- 声明:
VirtualService表达匹配/路由意图,DestinationRule可定义 v1/v2 subset;分别核对资源的 generation、host、port、规则所在作用域、子集标签。API 接受对象,只证明资源提交成功。错误 host 或不匹配的请求头即使语法合法,也可能让目标请求始终沿旧路径。 - 控制器处理:Istiod 观察配置与服务发现变化,按关联代理的范围构造 xDS 所需资源。哪些 namespace、工作负载和网关能看到规则,须按实际 Istio 版本及安装方式核对;不能从“某一个代理同步了”推广到所有代理。
- 下发:对本次 orders Pod 对应的代理看 xDS 资源版本及 ACK/NACK、拒绝原因。ACK 表达对相应响应的确认,不证明依赖资源已完成 warming、所有配置可用或测试请求按预期路由。
- 数据面:用代理当前配置快照核对 virtual host、route、cluster、endpoint 是否对应 v2,并检查 v2 后端是否实际存在。即使配置快照正确,仍不能证明流量通过了该代理。
- 执行:发同一 SKU、分别带/不带特定请求头的两个请求 ID,联合代理访问日志、v1/v2 应用日志、响应中的
inventory_version与副作用账本断言实际命中情况。旧连接复用和多个 orders Pod 都会影响观察范围,不能以一条 200 宣告所有实例收敛。
对于错写 subset 标签而导致无 v2 endpoint、或 route 的 host 与实际请求不匹配这两种情况,排查起点不同:先比较请求 Host 与当前 route,再查 cluster/endpoint,而不是直接调权重。下一篇将拆解 xDS 的更新依赖与拒绝,不把 ACK 当作万能“已生效”信号。
可复跑对照与当前缺口
先在隔离集群固定 Kubernetes/Istio 与镜像 digest,部署相同合成服务链并验证第 04 篇的 sidecar 捕获;先只让 v1 接收请求,再只让带 x-canary: yes 的请求命中 v2,最后把 subset 标签故意改错。分别保存上述五层、输入请求/退出码及后端账本;成功场景要在 v2 实际日志出现相同请求 ID,失败断言对错误命中返回非零。在 examples/service-mesh/ 的只读环境入口为:
1 | |
此命令只作 context/Service/EndpointSlice/Pod 前置检查,不是完整路由实验。本环境的 examples/service-mesh/evidence/02/20261001T130351Z-2539112/ 记录 kubectl 缺失、退出 127;第 03 篇独立 Envoy 二进制亦未下载完。因此 Kubernetes 资源提交、控制器处理、xDS 下发、代理当前配置和代理请求路径全部 NOT_RUN,不能报告 v2 命中比例;复跑缺口见 writing-plans/service-mesh/research/06.md。
练习与参考解答
- 看到代理同步状态正常,v2 日志却没有目标请求,应怎样定位?参考解答:锁定真实发请求的 orders Pod/代理,查该代理 route、cluster、endpoint 与实际请求 Host/头/端口是否匹配,再关联代理与两个库存后端的请求 ID。同步状态不等于该请求选择了 v2。
- 造一个“合法配置但仍落 v1”的反例。参考解答:v2 route 只匹配
x-canary: yes,实际发往inventory的请求却没带头;分别发送有头和无头的相同 SKU、不同 ID,并检查 route 快照与后端日志,才能证明是匹配条件而非配置完全没下发。未运行前不预填结果。
官方资料与系列导航
- Istio 流量治理、VirtualService 与 DestinationRule:声明入口;具体字段/默认值需在冻结版本核对。
- Istio proxy-config:检查当前代理配置,不代替请求日志。
- Envoy v1.37.0 xDS 协议:资源更新和 ACK/NACK 的语义。
系列导航:00 基线 → 01 治理位置 → 02 Service → 03 Envoy → 04 Sidecar → 05 启停 → 06 路由配置(本文)→ 07 xDS 更新、依赖与拒绝。
