Basic example
Set up basic route delegation between a parent and two child HTTPRoute resources.
Set up basic route delegation between a parent and two child HTTPRoute resources.
The steps in this section use the Envoy-based kgateway proxy. The steps do not work with the agentgateway proxy.
Configuration overview
In this guide you walk through a basic route delegation example that demonstrates route delegation between a parent HTTPRoute resource and two child HTTPRoute resources that forward traffic to an httpbin sample app. The following image illustrates the resulting route delegation hierarchy:
parent HTTPRoute:
- The parent HTTPRoute resource delegates traffic as follows:
/anything/team1delegates traffic to the child HTTPRoute resourcechild-team1in namespaceteam1./anything/team2delegates traffic to the child HTTPRoute resourcechild-team2in namespaceteam2.
child-team1 HTTPRoute:
- The child HTTPRoute resource
child-team1matches incoming traffic for the/anything/team1/fooprefix path and routes that traffic to the httpbin app in namespaceteam1.
child-team2 HTTPRoute:
- The child HTTPRoute resource
child-team2matches incoming traffic for the/anything/team2/barexact prefix path and routes that traffic to the httpbin app in namespaceteam2.
Before you begin
Create the namespaces for
team1andteam2.kubectl create namespace team1 kubectl create namespace team2Deploy the httpbin app into both namespaces.
kubectl -n team1 apply -f https://raw.githubusercontent.com/kgateway-dev/kgateway.dev/main/assets/docs/examples/httpbin.yaml kubectl -n team2 apply -f https://raw.githubusercontent.com/kgateway-dev/kgateway.dev/main/assets/docs/examples/httpbin.yamlVerify that the httpbin apps are up and running.
kubectl get pods -n team1 kubectl get pods -n team2Example output:
NAME READY STATUS RESTARTS AGE httpbin-f46cc8b9b-bzl9z 3/3 Running 0 7s NAME READY STATUS RESTARTS AGE httpbin-f46cc8b9b-nhtmg 3/3 Running 0 6s
Setup
Create the parent HTTPRoute resource that matches incoming traffic on the
delegation.exampledomain. The HTTPRoute resource specifies two routes:/anything/team1: The routing decision is delegated to a child HTTPRoute resource in theteam1namespace./anything/team2: The routing decision is delegated to a child HTTPRoute resource in theteam2namespace.
kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: parent namespace: gloo-system spec: hostnames: - delegation.example parentRefs: - name: http rules: - matches: - path: type: PathPrefix value: /anything/team1 backendRefs: - group: gateway.networking.k8s.io kind: HTTPRoute name: "*" namespace: team1 - matches: - path: type: PathPrefix value: /anything/team2 backendRefs: - group: gateway.networking.k8s.io kind: HTTPRoute name: "*" namespace: team2 EOFCreate the child HTTPRoute resource for the
team1namespace that matches traffic on the/anything/team1/fooprefix and routes traffic to the httpbin app in theteam1namespace. The child HTTPRoute resource does not select a specific parent HTTPRoute resource. Because of that, the child HTTPRoute resource is automatically selected by all parent HTTPRoute resources that delegate traffic to this child.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: child-team1 namespace: team1 spec: rules: - matches: - path: type: PathPrefix value: /anything/team1/foo backendRefs: - name: httpbin port: 8000 EOFCreate the child HTTPRoute resource for the
team2namespace that matches traffic on the/anything/team2/barexact prefix and routes traffic to the httpbin app in theteam2namespace. The child HTTPRoute resource specifies a specific parent HTTPRoute resource by using thespec.parentRefsfield.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: child-team2 namespace: team2 spec: parentRefs: - name: parent namespace: gloo-system group: gateway.networking.k8s.io kind: HTTPRoute rules: - matches: - path: type: Exact value: /anything/team2/bar backendRefs: - name: httpbin port: 8000 EOFInspect the parent and child HTTPRoute resources.
kubectl get httproute child-team1 -n team1 kubectl get httproute child-team2 -n team2 kubectl get httproute parent -n gloo-systemSend a request to the
delegation.exampledomain along the/anything/team1/foopath. Verify that you get back a 200 HTTP response code.Example output:
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * content-type: application/json; encoding=utf-8 date: Mon, 06 May 2024 15:59:32 GMT x-envoy-upstream-service-time: 0 server: envoy transfer-encoding: chunkedSend another request to the
delegation.exampledomain along the/anything/team1/barpath. Verify that you get back a 404 HTTP response code, because this route is not specified in the child HTTPRoute resourcechild-team1.Example output:
HTTP/1.1 404 Not Found date: Mon, 06 May 2024 16:01:48 GMT server: envoy transfer-encoding: chunkedSend another request to the
delegation.exampledomain. This time, you use the/anything/team2/barpath that is configured on thechild-team2HTTPRoute resource. Verify that you get back a 200 HTTP response code.Example output:
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * content-type: application/json; encoding=utf-8 date: Mon, 06 May 2024 15:59:32 GMT x-envoy-upstream-service-time: 0 server: envoy transfer-encoding: chunkedSend another request along the
/anything/team2/bar/testpath. Because thechild-team2HTTPRoute resource matches traffic only on theanything/team2/barexact path, this request fails and a 404 HTTP response code is returned.Example output:
HTTP/1.1 404 Not Found date: Mon, 06 May 2024 16:01:48 GMT server: envoy transfer-encoding: chunked
Cleanup
You can remove the resources that you created in this guide.
kubectl delete gateway http -n gloo-system
kubectl delete httproute parent -n gloo-system
kubectl delete httproute child-team1 -n team1
kubectl delete httproute child-team2 -n team2
kubectl delete -n team1 -f https://raw.githubusercontent.com/kgateway-dev/kgateway.dev/main/assets/docs/examples/httpbin.yaml
kubectl delete -n team2 -f https://raw.githubusercontent.com/kgateway-dev/kgateway.dev/main/assets/docs/examples/httpbin.yaml
kubectl delete namespaces team1 team2