HTTPRoute Support

The controller translates Gateway API HTTPRoutes into Vrata entities.

Mapping

Gateway APIVrata entity
HTTPRouteRouteGroup (1:1, carries hostnames)
HTTPRoute.spec.rules[]Route (1 per rule)
HTTPRoute.spec.rules[].matches[]Multiple Routes (1 per match)
HTTPRoute.spec.rules[].backendRefs[]Destination (deduplicated by Service name+namespace+port)
GatewayListener (1 per gateway listener)

Supported match types

TypeExampleVrata field
PathPrefix/apimatch.pathPrefix
Exact/healthmatch.path
RegularExpression/users/[0-9]+match.pathRegex
MethodPOSTmatch.methods
Header (exact)X-Tenant: acmematch.headers
Header (regex)X-Version: v[0-9]+match.headers with regex: true

Supported filters

FilterVrata action
RequestRedirectroute.redirect
URLRewriteroute.forward.rewrite
RequestHeaderModifierMiddleware type=headers

Ownership

Every entity the controller creates has a k8s: prefix in its name:

The controller only touches entities it owns. Manual API entities are never modified.

Garbage collection

The controller automatically cleans up Vrata when Kubernetes resources change:

Destination cleanup is always safe: a destination is only deleted when no route references it anymore. If two HTTPRoutes point to the same Service, deleting one won’t affect the other.

Cross-namespace references

If an HTTPRoute references a Service in a different namespace, the controller checks for a ReferenceGrant in the target namespace. If no matching grant exists, the entire HTTPRoute is skipped and its status is set to ResolvedRefs: False.

Same-namespace references always work without any ReferenceGrant.

Batch deployments

For large Helm releases that create many HTTPRoutes at once, you can group them into a single atomic snapshot using the vrata.io/batch annotation. See Batch Deployments.

Shared destinations

Multiple routes can reference the same Kubernetes Service. The controller maintains a reference count per destination. A destination is only deleted when no routes reference it anymore.

The refcount is rebuilt from the Vrata API on startup — no persistent storage needed.