Skip to main content
If you’ve deployed models on Kubernetes before, you’ve probably seen READY: False and had to wait. That’s normal — downloading and initializing a model from remote storage can take time. But what if READY stays False for many minutes? Or never becomes True? Kubernetes contains the diagnostic information you need — you just need to know where to look and how to interpret it.
The image shows a user icon labeled "Users" connected to a text document with Kubernetes and a magnifying glass symbol, likely illustrating user interaction with Kubernetes documentation or logs.
This article walks through two realistic failure scenarios when serving the Qwen model with KServe, and shows how to read the Kubernetes/KServe output to find root causes and fixes. One scenario involves an authentication/path issue that can be misleading at first. Quick first step — check the InferenceService status:
  • If READY is False and AGE is only tens of seconds, the service is usually still initializing (storage initializer downloading files).
  • If several minutes pass with no URL and READY: False, start troubleshooting — something likely failed.
The image shows the text "Qwen" with a star-like symbol above a brain icon labeled "Model." It has a dark background with "© Copyright KodeKloud" at the bottom left.
The AGE column is a helpful clue: if a service deployed five minutes ago is still False with no URL, it likely failed during initialization.
The image displays a user interface element titled "Kubectl" with a model icon and a "Still false" button, alongside an "Age Column" label.
Below are two common scenarios, how the failure appears, and how to fix it.

Scenario 1 — Broken storage URI (typo or wrong repo)

Apply a deliberately broken InferenceService to reproduce the error:
Short example output:
Describe the InferenceService for more detail:
Look at the status section, especially conditions. A healthy condition shows Status: True and Type: PredictorReady (or Ready). For failures, you’ll see Status: False and reason + message fields with diagnostic text. Example storage-initializer failure (truncated for clarity):
Important context: the combination of Repository Not Found and 401 can be confusing. It may indicate:
  • A typo in the storageUri (e.g., Instruct vs Instuct) — the path is wrong, so the API returns “not found”.
  • Or a private/gated repository that requires authentication (e.g., an HF_TOKEN).
When kubectl describe is ambiguous, inspect pod and init container logs:
With Hugging Face URIs, if you must be logged in on huggingface.co to view the model, KServe also needs credentials (for example, set HF_TOKEN). If the path is wrong, correct the storageUri in your manifest and reapply.

Scenario 2 — Out of memory (OOMKilled)

ML models include weights that must be loaded into RAM. If a container is constrained to less memory than required, the kubelet will kill it (OOMKilled). This leads to restarts and the Revision/Deployment failing to reach minimum availability, causing the InferenceService to remain False. Apply a manifest that intentionally causes OOM:
You may observe init containers or the main container being restarted with OOMKilled. Describing the InferenceService will show PredictorReady: False and messages about minimum availability or scheduling:
Deployment does not have minimum availability commonly indicates:
  • Kubernetes couldn’t schedule the pod because nodes lack sufficient memory.
  • Or the pod is repeatedly OOMKilled because requests/limits are too low.
Example manifest that intentionally sets too-small memory requests/limits:
Setting both requests and limits to 512Mi is too small for the Qwen model and will likely produce OOMKilled. A common starting point for Qwen is requests: 2Gi and limits: 4Gi. Adjust these values according to the model size and available node resources, or schedule on nodes with more memory.
The image displays a terminal output with information on a deployment, showing status updates and reasons for issues related to a predictor ingress and minimum replicas.
When you see Deployment does not have minimum availability, either increase the pod memory request/limit or provision nodes with sufficient memory so Kubernetes can schedule the pod.

Troubleshooting checklist (quick reference)

Read the conditions -> message field first. It’s the single most useful piece of information KServe provides about why an InferenceService isn’t becoming ready.
Practical troubleshooting based on messages:
  • If message indicates storage or repository errors:
    • Verify the storageUri for typos (e.g., Instruct vs Instuct).
    • If the model is private/gated, set HF_TOKEN in your environment or use a repo you have access to. See Hugging Face authentication docs: https://huggingface.co/docs/huggingface_hub/authentication
    • Inspect storage-initializer logs:
  • If message indicates scheduling/minimum availability or pods show OOMKilled:
    • Check pod status and events:
    • Increase resources.requests.memory and resources.limits.memory in your InferenceService manifest to meet the model’s RAM needs (for example, requests: "2Gi", limits: "4Gi" for Qwen as a starting point), then reapply.
After applying fixes, watch the InferenceService until READY becomes True:
If the conditions/events don’t provide enough detail, inspect pod logs (init and main containers). Storage initializer and predictor logs typically reveal the root cause: bad path, authentication failure, or memory allocation problems. Useful links and references: By following this checklist and reading the reason and message fields in KServe conditions, you can distinguish a slow initial load from an actual failure and take the correct corrective action.

Watch Video

Practice Lab