Skip to main content
Version: Latest

Test a Kubernetes Gateway Deployment

Use this checklist after installing Semantic Router behind Istio, Envoy Gateway, Gateway API Inference Extension, or another supported gateway.

1. Resolve the real gateway address

Do not copy an IP or NodePort from another cluster. Inspect the Service created for your Gateway:

kubectl get gateway -A
kubectl get service -A | grep -i gateway

For Minikube, the helper can print a reachable URL:

export GATEWAY_URL="$(minikube service inference-gateway-istio --url | head -n 1)"

For a LoadBalancer Service, use its assigned hostname or IP. For a local-only cluster, port-forward the Gateway Service and set GATEWAY_URL to the forwarded address.

test -n "$GATEWAY_URL" && printf 'Gateway: %s\n' "$GATEWAY_URL"

2. Check Gateway API status

kubectl get gateway,httproute -A
kubectl describe httproute <route-name> -n <namespace>

The route should be accepted and its backend references resolved. In an LLM-D deployment, also inspect the InferencePool and EPP scheduler selected by each route.

3. List exposed models

curl -fsS "$GATEWAY_URL/v1/models"

Confirm that the response contains the physical or virtual model names expected by the active Router configuration.

4. Send a direct-model request

Replace physical-model with a provider model exposed by the config:

curl -fsS -D /tmp/direct-headers.txt \
"$GATEWAY_URL/v1/chat/completions" \
-H 'Content-Type: application/json' \
-d '{
"model": "physical-model",
"messages": [{"role": "user", "content": "Reply with one short sentence."}],
"max_tokens": 64,
"temperature": 0
}'

A direct provider name should reach that provider without running recipe signals, decisions, route plugins, cache, learning, or session routing.

5. Send a routed request

Replace virtual-model with an entrypoint or automatic alias configured for the deployment:

curl -fsS -D /tmp/routed-headers.txt \
"$GATEWAY_URL/v1/chat/completions" \
-H 'Content-Type: application/json' \
-d '{
"model": "virtual-model",
"messages": [{"role": "user", "content": "Explain why 2 + 2 equals 4."}],
"max_tokens": 128,
"temperature": 0
}'

Inspect the response and routing headers supported by your deployment. Confirm that the selected provider is valid for the matched decision; do not assume a particular category or backend solely from the prompt wording.

6. Verify the backend path

Correlate the request with Gateway, Router, and provider logs. A successful HTTP response alone does not prove that the intended route or scheduler handled it.

kubectl logs -n <router-namespace> deployment/<router-deployment> --since=5m
kubectl logs -n <gateway-namespace> deployment/<gateway-deployment> --since=5m

Keep request and response bodies out of shared logs when they may contain sensitive data.

Failure guide

SymptomCheck first
No external connectionGateway Service address, LoadBalancer/NodePort, firewall
HTTPRoute not acceptedParent reference, listener hostname, allowed routes
Backend reference unresolvedService/InferencePool name, namespace, port
/v1/models works but completions failprovider readiness, served model name, credentials
Direct request works but virtual model failsentrypoint, recipe, signals/decisions, default model
Response succeeds through wrong poolroute match, selected-model headers, EPP/Gateway logs

Delete temporary header files after inspection if they may contain sensitive metadata.