Query parameter
Specify a set of URL query parameters which requests must match in entirety.
For more information, see the Kubernetes Gateway API documentation.
Before you begin
-
Follow the Get started guide to install kgateway.
-
Follow the Sample app guide to create a gateway proxy with an HTTP listener and deploy the httpbin sample app.
-
Get the external address of the gateway and save it in an environment variable.
export INGRESS_GW_ADDRESS=$(kubectl get svc -n kgateway-system http -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") echo $INGRESS_GW_ADDRESSkubectl port-forward deployment/http -n kgateway-system 8080:8080
Set up query parameter matching
-
Create an HTTPRoute resource for the
match.exampledomain that matches incoming requests with auser=mequery parameter.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-match namespace: httpbin spec: parentRefs: - name: http namespace: kgateway-system hostnames: - match.example rules: - matches: - queryParams: - type: Exact value: me name: user backendRefs: - name: httpbin port: 8000 EOF -
Send a request to the
/status/200path of the httpbin app on thematch.exampledomain without any query parameters. Verify that your request is not forwarded to the httpbin app because no matching query parameter is found.curl -vi http://$INGRESS_GW_ADDRESS:8080/status/200 -H "host: match.example:8080"curl -vi localhost:8080/status/200 -H "host: match.example"Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < date: Sat, 04 Nov 2023 03:45:39 GMT date: Sat, 04 Nov 2023 03:45:39 GMT < server: envoy server: envoy < content-length: 0 content-length: 0 -
Send a request to the
/status/200path of the httpbin app on thematch.exampledomain. This time, you provide theuser=mequery parameter. Verify that your request now succeeds and that you get back a 200 HTTP response code.curl -vi "http://$INGRESS_GW_ADDRESS:8080/status/200?user=me" -H "host: match.example:8080"curl -vi "localhost:8080/status/200?user=me" -H "host: match.example"Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < access-control-allow-credentials: true access-control-allow-credentials: true < access-control-allow-origin: * access-control-allow-origin: * < date: Sat, 04 Nov 2023 03:49:17 GMT date: Sat, 04 Nov 2023 03:49:17 GMT < content-length: 0 content-length: 0 < x-envoy-upstream-service-time: 1 x-envoy-upstream-service-time: 1 < server: envoy server: envoy
Cleanup
You can remove the resources that you created in this guide.kubectl delete httproute httpbin-match -n httpbin