cloudflare-gateway-controller

GRPCRoute

The controller processes GRPCRoute resources attached to managed Gateways and sets conditions on .status.parents entries with .controllerName: cloudflare-gateway-controller.io/controller.

This document covers only the conditions set by this controller. For the full GRPCRoute spec, see the Gateway API documentation.

Example

The following example shows a GRPCRoute that routes gRPC traffic for app.example.com to a backend Service:

apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
  name: my-grpc-route
  namespace: default
spec:
  parentRefs:
    - name: my-gateway
  hostnames:
    - "app.example.com"
  rules:
    - backendRefs:
        - name: my-grpc-service
          port: 9090

When DNS is configured in the CloudflareGatewayParameters, the controller creates CNAME records for each hostname in the GRPCRoute.

An HTTPRoute and a GRPCRoute can share the same hostname on the same Gateway. The embedded reverse proxy distinguishes between them using the Content-Type header (application/grpc for gRPC). gRPC traffic is forwarded to backends using HTTP/2 cleartext (h2c).

Validations

The controller validates each GRPCRoute on every reconciliation. If any validation fails, the GRPCRoute is rejected with Accepted=False/UnsupportedValue.

Unsupported fields

The following fields are not supported and must not be set:

Backend references

Session persistence

Session persistence pins a client to the same backend across requests. The configuration is the same as for HTTPRoute.

Gateway API v1.6 removed sessionPersistence.idleTimeout; the controller no longer exposes idle timeout through GRPCRoute.

Namespace restrictions

The GRPCRoute must be in a namespace allowed by the Gateway’s listener allowedRoutes configuration. Routes from disallowed namespaces are rejected with Accepted=False/NotAllowedByListeners.

GRPCRoute Status

Conditions

A GRPCRoute enters various states during its lifecycle, reflected as Kubernetes Conditions on each .status.parents entry. It can be accepted, have its references resolved, have DNS records applied, or be ready.

Accepted GRPCRoute

Standard Gateway API condition. The controller marks a GRPCRoute as accepted when it passes validation.

When the GRPCRoute is accepted:

When the GRPCRoute is not accepted:

Reasons for rejection:

Resolved refs

Standard Gateway API condition. The controller reports whether all backendRef references could be resolved.

When all references are resolved:

When a reference cannot be resolved:

The RefNotPermitted reason indicates a cross-namespace backendRef is not permitted by a ReferenceGrant.

DNS records applied

Custom condition, not part of the Gateway API spec. Reports whether DNS CNAME records have been applied for the route’s hostnames. This condition is only present when DNS management is enabled (see CloudflareGatewayParameters for configuration details).

When DNS records are applied successfully:

In all-hostnames mode (default), the message lists all applied hostnames. In specific-zones mode, the message lists applied and skipped hostnames.

When DNS record creation or update fails:

This condition is removed from the status when DNS is disabled.

Ready GRPCRoute

Custom condition, not part of the Gateway API spec. kstatus-compatible condition. This condition starts from the parent Gateway’s Ready value but may be downgraded to Unknown/ProgressingWithRetry when the Gateway is ready but a DNS error occurred for this route’s hostnames.

When the Gateway is ready and DNS records (if configured) applied successfully:

When the Gateway has a terminal failure:

When the Gateway is waiting for the Deployment:

When the Gateway is retrying after transient errors, or the Gateway is ready but a DNS error occurred for this route: