Skip to content

HTTP routing

The HTTPRoute resource allows you to match on HTTP traffic and direct it to Kubernetes backends. This guide shows how the HTTPRoute matches traffic on host, header, and path fields and forwards it to different Kubernetes Services.

The following diagram describes a required traffic flow across three different Services:

  • Traffic to foo.example.com/login is forwarded to foo-svc
  • Traffic to bar.example.com/* with a env: canary header is forwarded to bar-svc-canary
  • Traffic to bar.example.com/* without the header is forwarded to bar-svc

HTTP Routing

The dotted lines show the Gateway resources deployed to configure this routing behavior. There are two HTTPRoute resources that create routing rules on the same prod-web Gateway. This illustrates how more than one Route can bind to a Gateway which allows Routes to merge on a Gateway as long as they don't conflict. For more information on Route merging, refer to the HTTPRoute documentation.

The following prod-web Gateway is defined from the acme-lb GatewayClass. prod-web listens for HTTP traffic on port 80 and will bind to all Routes in the same Namespace that have the matching gateway: prod-web-gw label. Route labels and Gateway label selectors allow Routes and Gateways to be bound to each other by their respective owners.

apiVersion: networking.x-k8s.io/v1alpha1
kind: Gateway
metadata:
  name: prod-web
spec:
  gatewayClassName: acme-lb
  listeners:  
  - protocol: HTTP
    port: 80
    routes:
      kind: HTTPRoute
      selector:
        matchLabels:
          gateway: prod-web-gw

An HTTPRoute can match against a single set of hostnames. These hostnames are matched before any other matching within the HTTPRoute takes place. Since foo.example.com and bar.example.com are separate hosts with different routing requirements, each is deployed as its own HTTPRoute - foo-route and bar-route.

The following foo-route will match any traffic for foo.example.com and apply its routing rules to forward the traffic to the correct backend. Since there is only one match specified, only foo.example.com/login/* traffic will be forwarded. Traffic to any other paths that do not begin with /login will not be matched by this Route.

apiVersion: networking.x-k8s.io/v1alpha1
kind: HTTPRoute
metadata:
  name: foo-route
  labels:
    gateway: prod-web-gw
spec:
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - path:
        type: Prefix
        value: /login
    forwardTo:
    - serviceName: foo-svc
      port: 8080

Similarly, the bar-route HTTPRoute matches traffic for bar.example.com. All traffic for this hostname will be evaluated against the routing rules. The most specific match will take precedence which means that any traffic with the env: canary header will be forwarded to bar-svc-canary and if the header is missing or not canary then it'll be forwarded to bar-svc.

apiVersion: networking.x-k8s.io/v1alpha1
kind: HTTPRoute
metadata:
  name: bar-route
  labels:
    gateway: prod-web-gw
spec:
  hostnames:
  - "bar.example.com"
  rules:
  - matches:
    - headers:
        type: Exact
        values:
          env: canary
    forwardTo:
    - serviceName: bar-svc-canary
      port: 8080
  - forwardTo:
    - serviceName: bar-svc
      port: 8080
Back to top