Description
HTTPRoute resources can be left with a stale status.parents[].conditions[Accepted]=False condition (reason NoMatchingListenerHostname) after the underlying Gateway listener has been changed to match the route's hostname. The data plane is healthy and serving traffic on the affected hostnames, but the route's status object never re-emits because status reconciliation appears to be gated on the route's own metadata.generation changing — listener-side changes alone do not retrigger status emission for affected routes.
Environment
- Envoy Gateway: v1.7.0 (Helm chart
gateway-helm from docker.io/envoyproxy)
- Provider: Kubernetes
- Gateway API: v1
- Single Gateway with multiple listeners; many HTTPRoutes attached via
parentRefs
Reproduction
- Have HTTPRoute
X bound to Gateway/main where no listener matches X's hostname. Status condition correctly reports:
type: Accepted
status: "False"
reason: NoMatchingListenerHostname
- Update
Gateway/main to add a listener whose hostname matches X.
- Observe that the data plane begins serving
X's hostname correctly — routing works end-to-end.
- Inspect
kubectl get httproute X -o yaml: the Accepted=False/NoMatchingListenerHostname condition is still present indefinitely. observedGeneration reflects the route's last generation, not the listener change.
- Workaround: bumping any annotation on
X (e.g. kubectl annotate httproute X foo=bar --overwrite) forces a new metadata.generation, which triggers status reconciliation and the condition flips to Accepted=True.
Expected behavior
When listener configuration changes such that a previously-rejected route can now be accepted (or vice versa), the controller should re-evaluate route status and re-emit the Accepted condition for affected routes, without requiring a generation bump on the route itself.
Impact
- Operators monitoring HTTPRoute status for health get false negatives.
- Any tooling that reads
status.parents[].conditions[] to determine route health (dashboards, gating in CI, alerting) must either ignore the condition or implement its own annotation-bump workaround.
- Particularly painful in fleets with many routes — we hit this on 37 routes simultaneously after a Gateway listener consolidation.
Workaround
We bumped a focusapiary.org/status-refresh: \"2026-04-25\" annotation on all 37 affected routes to force generation churn. Reference (private repo): https://git.developerdojo.org/FocusApiary/envoy-gateway-k8s/-/merge_requests/17
Happy to gather additional logs or test patches if helpful.
Description
HTTPRoute resources can be left with a stale
status.parents[].conditions[Accepted]=Falsecondition (reasonNoMatchingListenerHostname) after the underlying Gateway listener has been changed to match the route's hostname. The data plane is healthy and serving traffic on the affected hostnames, but the route's status object never re-emits because status reconciliation appears to be gated on the route's ownmetadata.generationchanging — listener-side changes alone do not retrigger status emission for affected routes.Environment
gateway-helmfromdocker.io/envoyproxy)parentRefsReproduction
Xbound toGateway/mainwhere no listener matchesX's hostname. Status condition correctly reports:Gateway/mainto add a listener whose hostname matchesX.X's hostname correctly — routing works end-to-end.kubectl get httproute X -o yaml: theAccepted=False/NoMatchingListenerHostnamecondition is still present indefinitely.observedGenerationreflects the route's last generation, not the listener change.X(e.g.kubectl annotate httproute X foo=bar --overwrite) forces a newmetadata.generation, which triggers status reconciliation and the condition flips toAccepted=True.Expected behavior
When listener configuration changes such that a previously-rejected route can now be accepted (or vice versa), the controller should re-evaluate route status and re-emit the
Acceptedcondition for affected routes, without requiring a generation bump on the route itself.Impact
status.parents[].conditions[]to determine route health (dashboards, gating in CI, alerting) must either ignore the condition or implement its own annotation-bump workaround.Workaround
We bumped a
focusapiary.org/status-refresh: \"2026-04-25\"annotation on all 37 affected routes to force generation churn. Reference (private repo): https://git.developerdojo.org/FocusApiary/envoy-gateway-k8s/-/merge_requests/17Happy to gather additional logs or test patches if helpful.