Skip to content

Kubernetes

This section covers running vLLM on Gaudi at fleet scale on Kubernetes: what a Gaudi pod needs, how to place pods so cards do not fragment, how to start, drain, roll and autoscale model servers that take minutes to load, and how to notice when one stops working while still looking healthy.

The practices come from operating a fleet of over a thousand Gaudi 2 cards (8 cards per node) serving dozens of models at once, from 1-card models with many replicas to models that need a whole node, all autoscaled. Each page states the rule, the reason for it and, where it helps, what went wrong without it.

The manifests and tools live in kubernetes/ in the repository. They use placeholders (<registry>/<image>:<tag>, <storage-class>) and the namespace llm; replace them for your cluster.

What a fleet needs, in order

Step What Page
1 Gaudi device plugin on every Gaudi node, the Habana container runtime, and a habana RuntimeClass Pod spec
2 A model-server pod template with the Gaudi settings, probes and drain Pod spec
3 A shared model store and a prefetch Job, so pods never download weights at start-up Start-up and warm-up
4 A bin-packing scheduler profile, so small models do not strand cards that big models need Scheduling
5 The stall-aware readiness probe, and a rule for when to cordon a node Health and failure
6 Graceful drain, one-pod-at-a-time rollouts, an autoscaler on the right metric Rollouts and scaling
7 A model-aware router and one consistent timeout chain Routing
8 Per-pod scraping and the alerts that catch silent failures Observability

Steps 1 to 3 are enough to serve one model. Steps 4 to 8 start to matter once several models share the fleet, replicas come and go, and users hold long streams open.

Decision guide

Symptom Likely cause Where to look
synStatus=8 [Device not found] Device acquire failed at start Missing RuntimeClass or hostIPC, host memory fragmentation, leaked allocations, a degraded card Pod spec, Health and failure
An 8-card model stays Pending while many cards are free Small pods spread over empty nodes Scheduling
A pod is Ready, /health is 200, but requests never finish Engine stall Health and failure
Streams stop mid-response during scale-down or rollouts No drain: vLLM aborts in-flight requests on SIGTERM by default Rollouts and scaling
A single-replica model goes fully down during a rollout maxUnavailable: 1 with one replica Rollouts and scaling
The autoscaler swings between floor and ceiling Loading pods in the metric, wrong metric or target Rollouts and scaling
Cold starts take an hour Per-node downloads, CPU throttling, a cold recipe cache Start-up and warm-up
Long non-streamed requests fail at exactly 300 s or 600 s A proxy or gateway timeout shorter than the rest of the chain Routing
One pod queues while its siblings idle Clients that bypass the router, or KV-heavy prompts on one pod Routing
Prometheus runs out of memory after autoscaler churn Per-pod series from pods that no longer exist Observability

Files

File What it is
manifests/runtimeclass.yaml The habana RuntimeClass
manifests/vllm-deployment.yaml Deployment and Service template for one model
manifests/model-store.yaml Shared model store PVC and a prefetch Job
manifests/gaudi-binpack-scheduler.yaml A second kube-scheduler that bin-packs Gaudi cards
manifests/hpa.yaml HorizontalPodAutoscaler on vllm:num_requests_running
manifests/aibrix-podautoscaler.yaml Optional AIBrix PodAutoscaler equivalent
manifests/pdb.yaml PodDisruptionBudget for a model
manifests/monitoring.yaml PodMonitor and alert rules (Prometheus Operator)
tools/vllm_stall_probe.py Stall-aware readiness probe
tools/hpu-acquire-check.sh Leaked-allocation audit and multi-process device acquire test
tools/hpu-fleet-sweep.sh Read-only per-card health census over SSH
tools/hpu-resource-audit.py Checks manifests for per-card proportional requests and Gaudi pod basics