【Envoy 数据面】Warming、SDS 与热更新:ACK 为何不等于新路由上量

💡 原文中文,约5400字,阅读约需13分钟。
📝

内容提要

ACK仅表示协议校验通过,配置生效还需Cluster/Listener warming及依赖就绪。新建Cluster warming前不可见,更新则旧实例服务至原子切换。SDS未就绪与失败语义不同,后者可能开端口但reset。xDS热更新覆盖多数配置,二进制及进程级状态才需Hot restart。排障时注意控制面顺序、长连接绑定及实例差异。

🔎

延伸解读

ACK 只是协议校验,生效还需 warming

ACK 仅表示协议校验通过,配置生效还需 Cluster/Listener warming 及依赖就绪。新建 Cluster 在 warming 完成前不可见,引用它的路由会返回 404 或 503;更新 Cluster 时旧实例继续服务,直到新实例原子切换。排障时若遇到“ACK 了但路由未生效”,应优先检查 warming 状态和依赖是否就绪,而非纠结 nonce 或版本号。

SDS 未就绪与失败语义不同

SDS 未就绪时,Downstream Listener 不开端口,Upstream Cluster 不用于路由;而 SDS 失败(连接失败或坏数据)时,Listener 可能开端口但连接被 reset,Cluster 可能被路由但请求被拒绝。因此,若出现“端口开了却瞬间 reset”或“路由命中但上游拒绝”,应先排查 SDS 状态,而不是只查 RDS ACK。

xDS 热更新与 Hot restart 的边界

xDS 热更新覆盖 EDS、RDS、多数 CDS/LDS 及 SDS 证书,但二进制、部分 tracing driver 等进程级状态仍需 Hot restart。工程上应优先用 xDS + warming 解决配置变更,避免不必要的 Hot restart,因为后者涉及父子双进程和连接排空窗口,代价更高。

排障清单:ACK 后路由未生效的常见原因

常见原因包括:RDS ACK 但目标 Cluster 仍在 warming(EDS/健康检查未完)导致 503/404;LDS ACK 但 Listener 仍等首包 Route/SDS;控制面顺序反了(先 RDS 后 CDS/EDS)造成短暂黑洞;长连接上的请求仍绑定更新前的路由对象;以及看错实例(ACK 在 A 节点,流量在 B 节点)。

Q&A

Envoy 中 ACK 表示什么?为什么 ACK 之后流量可能还是旧的?

ACK 仅表示协议校验通过,即配置的隔离校验通过并意图应用,但不代表配置已成功应用。配置生效还需要 Cluster/Listener warming 以及依赖(如 EDS、RDS、SDS)就绪。因此,即使控制面 ACK,金丝雀路由可能因为目标 Cluster 仍在 warming 或依赖未就绪而暂时未生效。

Envoy 中新建 Cluster 和更新 Cluster 在 warming 行为上有什么区别?

新建 Cluster 在 warming 完成前对其余组件不可见,引用它的 HTTP 路由会得到 404 或 503;更新 Cluster 时,旧 Cluster 继续服务,新实例 warming 完成后原子替换,避免服务中断。

Envoy 中 SDS 未就绪和 SDS 失败后的行为有何不同?

SDS 未就绪时,Downstream Listener 不标 active 且不开端口,Upstream Cluster 不标 active 且不用于路由;SDS 失败(如连接失败或坏数据)后,Listener 可能标 active 并开端口,但连接会被 reset,Upstream Cluster 可能标 active 但请求被拒绝。

Envoy 中哪些配置可以通过 xDS 热更新,哪些需要 Hot restart?

EDS、RDS、多数 CDS、LDS 以及 SDS 证书(成功推送后)可以通过 xDS 热更新;Admin、部分 tracing driver、二进制以及 Listener socket_options 等需要 Hot restart 或全量重启。

Envoy 中 Listener warming 与 Cluster warming 有何不同?

Listener warming 在拿到对应的 Route 后完成,即使管理端未再推 Route,也可用先前已发送的 RouteConfiguration 完成 warming;Cluster warming 则要求管理端提供新的 ClusterLoadAssignment 响应,即便 endpoint 集合未变。

Envoy 中 SDS 证书轮转有哪些路径?

SDS 证书轮转优先通过 gRPC SDS 推送,新 secret 到达后 Envoy 可立即用于新握手;文件系统旋转时,默认真目录上的 move/rename(IN_MOVED_TO),v1.39.0 起可额外订阅 IN_MODIFY 适配原地写文件。

Envoy 中 ACK 后仍使用旧路由的常见原因有哪些?

常见原因包括:RDS ACK 但目标 Cluster 仍在 warming(EDS/健康检查未完)导致 503/404;LDS ACK 但 Listener 仍等首包 Route/SDS;控制面顺序反了(先 RDS 后 CDS/EDS)导致短暂黑洞;长连接上的请求仍绑定更新前选中的路由对象;看错实例(ACK 在 A 节点,流量在 B 节点)。

🏷️

标签

➡️

继续阅读