【Envoy Gateway】排障坐标系:未 Accepted、空 IR、xDS NACK 与旧快照
内容提要
本文介绍Envoy Gateway排障方法,提出五轴坐标系:附着/status、IR、xDS、Envoy数据面、东西向。强调先定位故障轴再处理,避免盲目修改YAML。核心是区分status条件(Accepted/Programmed/ResolvedRefs)与实际数据面状态,注意NACK、IR空、observedGeneration不匹配等陷阱,并指出Programmed不等于流量已切换。
延伸解读
先定位故障轴,再动 YAML
排障时先判断问题属于附着/status、IR、xDS、Envoy 数据面还是东西向,避免盲目修改 YAML 或重装控制器。例如,HTTPRoute 已 apply 但 404,可能是 parentRefs 未附着或同 listener 规则阴影,而非数据面问题。先核对 status.conditions 和 observedGeneration,再决定下一步。
status 绿不等于流量已切换
Programmed 条件只表示配置已送出,不保证 Envoy 已服务新快照。xDS NACK 后代理可能停在上一份 known-good,或 Worker 尚未 warming 完成。因此,即使 status 显示 Accepted 和 Programmed,仍需检查 IR 是否为空、xDS 是否 ACK,以及数据面实际状态。
注意 v1.9.0 的破坏性变更
v1.9.0 中 TCPRoute/UDPRoute 仅 reconcile v1 版本,未装对应 CRD 会静默跳过;SecurityPolicy 等 mergeType 只能挂 xRoute;xDS 默认接收上限从 4MiB 提到 32MiB。这些变更可能导致策略不生效或配置推送失败,排障时需核对版本相关行为。
Q&A
Envoy Gateway 排障时,为什么 HTTPRoute 已 apply 但仍然 404?
可能原因包括:parentRefs 未附着、ResolvedRefs 为假、同 listener 上另一条规则把匹配阴影掉(RouteRulesOverlap),或者 xDS NACK 后代理停在上一份 known-good。应先定位故障轴,再处理,避免盲目修改 YAML。
Envoy Gateway 中 status 条件 Accepted、Programmed、ResolvedRefs 分别代表什么?
Accepted 表示语义/句法可接受,会产生某些数据面配置,且被控制器接受,但不等于整份 YAML 合法或已推到 Envoy。Programmed 表示已解析并已送给数据面,'很快'就绪,但不等于 Envoy Worker 已在服务新快照。ResolvedRefs 表示对象内引用都存在且合法,为假时仍可能 Accepted=True。
为什么 Envoy Gateway 的 status 显示 Programmed=True,但流量仍走旧路由?
Programmed=True 只表示配置已送出,不声明数据面此刻已就绪。可能原因包括:xDS NACK 后代理停在上一份 known-good,或 Worker 还没 warming 完。应检查 xDS 流、NACK 指标和 Envoy 数据面状态。
Envoy Gateway 中 xDS NACK 是什么?如何排查?
NACK 是带 ErrorDetail 的 DiscoveryRequest,表示 Envoy 拒绝了上一份更新。v1.9.0 新增 xdsNACKTotal 指标,Prometheus 导出名为 xds_nack_total。排查时先读 type URL,确定 NACK 打在 Listener 还是 Cluster/Secret,再检查资源树和配置。
Envoy Gateway 中 IR 为空是什么意思?如何检查?
IR 为空表示 Translator 计算的结果是不生成对应 Listener/Route。status 绿只证明 Translator 计算过条件,IR 空证明没有生成配置。检查方法:使用 egctl x translate --to ir 查看翻译结果,确认对象是否在 Kubernetes Provider 的 watch 里。
Envoy Gateway 中 RouteRulesOverlap 警告是什么?如何影响路由?
RouteRulesOverlap 是 v1.9.0 新增的警告,表示同 listener 上匹配条件完全相同。匹配更宽的规则可能把更具体的规则盖住,导致 404 或打到错误后端。排障时应先读警告条件,再检查路由表。
Envoy Gateway 中 observedGeneration 不匹配 metadata.generation 意味着什么?
observedGeneration 不匹配表示 status 是旧世代的,可能原因是控制器没追上,或对象已离开该实现的 scope。排障时应核对 observedGeneration 是否等于 metadata.generation,若不匹配则 status 不可信。
Envoy Gateway 中跨 namespace 引用失败如何排查?
跨 namespace 引用失败通常是因为没有 ReferenceGrant,导致 backendRefs / Secret 在 ResolvedRefs 上失败。应先检查 ReferenceGrant 是否存在,而不是怀疑 IR 或数据面。