【Envoy Gateway】Gateway API Translator 与 IR:对象如何变成 XdsIR / InfraIR
内容提要
Envoy Gateway通过Translator将Gateway API资源转换为XdsIR和InfraIR两种中间表示,以解耦配置与Envoy资源树。翻译按固定顺序执行,依赖上下文,并在翻译过程中同步计算状态。XdsIR供xDS Translator使用,InfraIR供Infra Manager管理舰队。即使Gateway失败,仍保留其IR槽位,避免误删基础设施。翻译顺序错误会导致hostname交集、Policy附着和overlap检查不完整。
延伸解读
IR 键的陷阱
XdsIRMap 和 InfraIRMap 的键默认是 {GatewayNamespace}/{GatewayName},但开启 mergeGateways 后会合并到 {GatewayClassName} 下。排障时若用错键,可能误以为 IR 为空,实际数据在 class 级键下。这一点在查看 IR 日志或调试时尤其重要,避免因键不匹配而得出错误结论。
翻译顺序即依赖图
翻译顺序不是实现细节,而是依赖图。例如 ListenerSet status 必须在 ProcessListeners 之后计算,overlap 检查必须在 BackendTrafficPolicies 之后,因为 CONNECT upgrade 会改变 path matcher。若顺序错误,hostname 交集、Policy 附着和 overlap 检查会看到不完整的世界,导致状态误判。
failed Gateway 仍占 IR 槽
即使 Gateway 校验失败,InitIRs 仍会为其创建 IR 槽位,这是为了避免 Infra Manager 误删已托管的基础设施。因此,在排障时,如果看到 Gateway 状态为 Accepted=False,但 InfraIR 仍有对应条目,这是正常现象,不应视为异常。
status 与配置同源
status 在 Translate 过程中同步计算,而不是事后根据 xDS 状态倒推。这意味着即使 Gateway 条件显示 Accepted,XdsIR 中可能仍无对应 listener(如 TLS 校验失败),或 IR 校验失败导致未下发。排障时需区分“没写进去”和“写了但被 Validate 挡住”两种情况。
Q&A
Envoy Gateway 中 XdsIR 和 InfraIR 分别是什么?
XdsIR 是代理配置的中间表示,保存即将变成 xDS 的代理意图,如 HTTP/TCP/UDP listeners、路由、集群和策略;InfraIR 是托管数据面基础设施的中间表示,包含 Proxy 的 metadata、端口、协议等,供 Infra Manager 管理 Deployment/Service。
为什么 Envoy Gateway 需要引入 IR 而不是直接使用 Gateway API 字段生成 Envoy 配置?
因为 Gateway API 与 Envoy 资源树的基数不同,直接映射无法处理 listener 折叠和冲突规则;同时 IR 解耦了外部资源与 Envoy 配置,使 Provider 可替换,并确保 status 与配置同源。
Envoy Gateway 的翻译顺序是怎样的?为什么顺序很重要?
翻译顺序固定,先处理 Gateway listeners,再处理各类 Routes,最后处理 Policies 和全局资源。顺序很重要,因为后续步骤依赖前面的 listener 上下文,顺序错误会导致 hostname 交集、Policy 附着和 overlap 检查不完整。
在 Envoy Gateway 中,为什么 Gateway 失败时仍会保留其 IR 槽位?
为了避免误删基础设施。即使 Gateway 失败,其 InfraIR 槽位仍被保留,防止删除事件拆掉这些 Gateway 已托管的基础设施,导致 Pod 被意外删除。
Envoy Gateway 中 status 是如何计算的?
status 在 Translate 过程中同步计算,每一步都可以同时产生 IR 与 status。翻译器根据 listener 处理结果、Route 匹配情况等更新 Gateway、listener 和 Route 的状态,而不是在 xDS ACK 之后倒推。
为什么会出现“YAML 有 hostnames,但 IR 无对应 HTTP route”的情况?
这通常是因为 parentRef 未匹配到任何已校验的 listener 且 hostname 无交集,或者 listener 未通过兼容性/TLS 校验。此时 parent status 可能记录 Accepted=False 或未附着,但 IR 中不会写入对应 route。
Envoy Gateway 中 XdsIR 和 InfraIR 的键是如何确定的?
默认键是 {GatewayNamespace}/{GatewayName},当 mergeGateways 开启时,合并到 {GatewayClassName}。排障时需注意键的选择,否则可能误以为 IR 为空。