This guide provides instructions for validating and testing your MaaS Platform deployment.
| Component | RHOAI | ODH |
|---|---|---|
| MaaS API | redhat-ods-applications | opendatahub |
| Kuadrant/RHCL | kuadrant-system | kuadrant-system |
| Gateway | openshift-ingress | openshift-ingress |
Follow these steps to validate your deployment and understand each component:
CLUSTER_DOMAIN=$(kubectl get ingresses.config.openshift.io cluster -o jsonpath='{.spec.domain}') && \
HOST="https://maas.${CLUSTER_DOMAIN}" && \
echo "Gateway endpoint: $HOST"!!! note
If you haven't created the maas-default-gateway yet, you can use the fallback:
bash HOST="https://gateway.${CLUSTER_DOMAIN}" && \ echo "Using fallback gateway endpoint: $HOST"
For OpenShift:
TOKEN_RESPONSE=$(curl -sSk \
-H "Authorization: Bearer $(oc whoami -t)" \
-H "Content-Type: application/json" \
-X POST \
-d '{"expiration": "10m"}' \
"${HOST}/maas-api/v1/tokens") && \
TOKEN=$(echo $TOKEN_RESPONSE | jq -r .token) && \
echo "Token obtained: ${TOKEN:0:20}..."!!! note For more information about how tokens work, see Understanding Token Management.
MODELS=$(curl -sSk ${HOST}/maas-api/v1/models \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" | jq -r .) && \
echo $MODELS | jq . && \
MODEL_NAME=$(echo $MODELS | jq -r '.data[0].id') && \
MODEL_URL=$(echo $MODELS | jq -r '.data[0].url') && \
echo "Model URL: $MODEL_URL"Send a request to the model endpoint (should get a 200 OK response):
curl -sSk -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"model\": \"${MODEL_NAME}\", \"prompt\": \"Hello\", \"max_tokens\": 50}" \
"${MODEL_URL}/v1/completions" | jqSend a request to the model endpoint without a token (should get a 401 Unauthorized response):
curl -sSk -H "Content-Type: application/json" \
-d "{\"model\": \"${MODEL_NAME}\", \"prompt\": \"Hello\", \"max_tokens\": 50}" \
"${MODEL_URL}/v1/completions" -vSend multiple requests to trigger rate limit (should get 200 OK followed by 429 Rate Limit Exceeded after about 4 requests):
for i in {1..16}; do
curl -sSk -o /dev/null -w "%{http_code}\n" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"model\": \"${MODEL_NAME}\", \"prompt\": \"Hello\", \"max_tokens\": 50}" \
"${MODEL_URL}/v1/completions"
doneCheck that all components are running:
kubectl get pods -n maas-api && \
kubectl get pods -n kuadrant-system && \
kubectl get pods -n kserve && \
kubectl get pods -n llmCheck Gateway status:
kubectl get gateway -n openshift-ingress maas-default-gatewayCheck that policies are enforced:
kubectl get authpolicy -A && \
kubectl get tokenratelimitpolicy -A && \
kubectl get llminferenceservices -n llmSee the deployment scripts documentation at scripts/README.md for more information about validation and troubleshooting.
For faster validation, you can use the automated validation script to run the manual validation steps more quickly:
./scripts/validate-deployment.shThe script automates the manual validation steps above and provides detailed feedback with specific suggestions for fixing any issues found. This is useful when you need to quickly verify deployment status, but understanding the manual steps above helps with troubleshooting.
TLS is enabled by default when deploying via the automated script or ODH overlay.
# View certificate details (RHOAI)
kubectl get secret maas-api-serving-cert -n redhat-ods-applications \
-o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
# Check expiry
kubectl get secret maas-api-serving-cert -n redhat-ods-applications \
-o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -enddate -nooutkubectl run curl --rm -it --image=curlimages/curl -- \
curl -vk https://maas-api.redhat-ods-applications.svc:8443/healthFor detailed TLS configuration options, see TLS Configuration.
-
Getting
501Not Implemented errors: Traffic is not making it to the Gateway.- Verify Gateway status and HTTPRoute configuration
-
Getting
401Unauthorized errors when trying to get a token: Authentication maas-api is not working.- Verify
maas-api-auth-policyAuthPolicy is applied - Check if your cluster uses a custom token review audience:
# Detect your cluster's audience AUD="$(kubectl create token default --duration=10m 2>/dev/null | \ cut -d. -f2 | jq -Rr '@base64d | fromjson | .aud[0]' 2>/dev/null)" echo "Cluster audience: ${AUD}"
If the audience is NOT
https://kubernetes.default.svc, patch the AuthPolicy:# For RHOAI: kubectl patch authpolicy maas-api-auth-policy -n redhat-ods-applications \ --type=merge --patch " spec: rules: authentication: openshift-identities: kubernetesTokenReview: audiences: - ${AUD} - maas-default-gateway-sa"
For ODH, use namespace
opendatahubinstead ofredhat-ods-applications. - Verify
-
Getting
401errors when trying to get models: Authentication is not working for the models endpoint.- Create a new token (default expiration is 10 minutes)
- Verify
gateway-auth-policyAuthPolicy is applied - Validate that
system:serviceaccounts:maas-default-gateway-tier-{TIER}haspostaccess to thellminferenceservicesresource- Note: this should be automated by the ODH Controller
-
Getting
404errors when trying to get models: The models endpoint is not working.- Verify
model-routeHTTPRoute exist and is applied - Verify the model is deployed and the
LLMInferenceServicehas themaas-default-gatewaygateway specified - Verify that the model is recognized by maas-api by checking the
maas-api/v1/modelsendpoint (see List Available Models)
- Verify
-
Rate limiting not working: Verify AuthPolicy and TokenRateLimitPolicy are applied
- Verify
gateway-rate-limitsRateLimitPolicy is applied - Verify TokenRateLimitPolicy is applied (e.g. gateway-default-deny or per-route policies)
- Verify the model is deployed and the
LLMInferenceServicehas themaas-default-gatewaygateway specified - Verify that the model is rate limited by checking the inference endpoint (see Test Rate Limiting)
- Verify that the model is token rate limited by checking the inference endpoint (see Test Rate Limiting)
- Verify
-
Routes not accessible (503 errors): Check MaaS Default Gateway status and HTTPRoute configuration
- Verify Gateway is in
Programmedstate:kubectl get gateway -n openshift-ingress maas-default-gateway - Check HTTPRoute configuration and status
- Verify Gateway is in