vLLM deployment (Kubernetes first, Docker lab, OpenShift sidebar)
Target audience: platform engineers bringing up vLLM on production Kubernetes (H100/H200/B200/B300 fleets), and individual researchers running 1-to-2-node Docker / Podman setups in a lab.
This skill is a pointer map. It points to the canonical sources — in the vLLM repo, in docs.vllm.ai, in the ecosystem repos, and to the load-bearing blog posts — rather than paraphrasing them. Paraphrase rots; pointers survive.
Decision guide — pick the path
| Situation |
Go to |
| Single node, 1 container, TP ≤ 8 |
references/docker-lab.md |
| Single host, 2 containers for PD disagg lab |
references/docker-lab.md (compose template) + references/disagg.md |
| k8s, single model fits 1 pod |
references/pod-shape.md + in-tree helm chart |
| k8s, model needs multi-node TP/PP |
references/multi-node.md (LWS + multi-node-serving.sh) |
| k8s fleet, router + LMCache + observability bundled |
vllm-production-stack (Helm) — see references/ecosystem.md |
| k8s fleet, disagg P/D + KV-aware + GAIE + SLA scheduler |
llm-d — see references/ecosystem.md |
| k8s fleet, ByteDance-scale multi-tenant LoRA + heterogenous GPU |
AIBrix — see references/ecosystem.md |
| NVIDIA reference stack on prem / EKS / AKS with NIXL |
NVIDIA Dynamo — see references/ecosystem.md |
| OpenShift / RHOAI |
references/openshift.md + RHAIIS images |
| Routing / load balancing across pods |
references/routing.md (GAIE, Envoy AI Gateway, Istio, production-stack router, semantic-router) |
| Air-gapped k8s or OCP |
references/openshift.md §air-gapped + vllm-configuration skill for HF mirror |
The three load-bearing facts
/dev/shm is the single most common cause of silent multi-GPU failure on k8s. On vanilla k8s there is no --ipc=host. Without a shared-memory volume, torch.distributed segfaults on the first all-reduce of a TP>1 pod. Mount an emptyDir with medium: Memory and sizeLimit: 10Gi at /dev/shm. Documented in vLLM's own k8s guide — see ``vllm repo: docs/deployment/k8s.md:209,289. Since v0.27.0 (#48879) a pre-flight free-space check turns the undersized case into an actionable startup RuntimeError instead of a later crash — but the trap it replaces is worth knowing, because a 64 MiB /dev/shm is big enough to boot (see references/pod-shape.md).
- Multi-node vLLM on k8s is Ray-on-LWS, not headless Service. The
parallel-config + pure headless-Service path exists but is not the vLLM-endorsed recipe. Use LeaderWorkerSet (kubernetes-sigs/lws) as the gang-scheduling primitive and examples/ray_serving/multi-node-serving.sh (which bootstraps Ray head/worker) as the entrypoint. Since Nov 2025 the ray symmetric-run pattern replaces the old head/worker split — see https://blog.vllm.ai/2025/11/22/ray-symmetric-run.html.
- The upstream
vllm/vllm-openai image runs as root. On OpenShift (and any k8s cluster with restricted-v2 PSA), that is a deploy-time failure. Either rebuild with chgrp -R 0 /root /tmp && chmod -R g=u /root /tmp, or use the Red Hat RHAIIS images (registry.redhat.io/rhaiis/vllm-cuda-rhel9:3.3.0), which are UID-agnostic by construction.
Minimum viable pod shape
# Deployment essentials — not a complete manifest. Full annotated template in references/pod-shape.md.
spec:
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:<pinned-tag> # do NOT use :latest
args: ["--model", "$(MODEL)", "--tensor-parallel-size", "8",
"--disable-access-log-for-endpoints", "/health,/metrics,/ping"]
env:
- {name: VLLM_HOST_IP, valueFrom: {fieldRef: {fieldPath: status.podIP}}}
- {name: HF_HOME, value: /models/.cache} # pre-warmed PVC or ModelCar
- {name: VLLM_NO_USAGE_STATS, value: "1"} # disable telemetry
- {name: VLLM_DO_NOT_TRACK, value: "1"}
# Multi-NIC (SR-IOV/RDMA): pin NCCL_SOCKET_IFNAME/NCCL_IB_HCA — see references/pod-shape.md
ports: [{containerPort: 8000, name: http}]
readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5, failureThreshold: 3}
livenessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 10, failureThreshold: 3, initialDelaySeconds: 600}
resources:
limits: {nvidia.com/gpu: 8}
volumeMounts:
- {name: dshm, mountPath: /dev/shm} # LOAD-BEARING
- {name: models, mountPath: /models}
volumes:
- name: dshm
emptyDir: {medium: Memory, sizeLimit: 10Gi} # LOAD-BEARING
- name: models
persistentVolumeClaim: {claimName: vllm-model-cache}
nodeSelector: {nvidia.com/gpu.product: NVIDIA-H200}
The initialDelaySeconds: 600 on the liveness probe is not excessive — cold model loads on a 405B FP8 take 8–12 min. A 30 s default makes the pod liveness-kill before it ever becomes ready. See VLLM_ENGINE_READY_TIMEOUT_S (default 600 s) in ``vllm repo: vllm/envs.py.
Full annotated manifest (all env vars, all probes, PVC vs ModelCar choice, nodeSelector per SM, RuntimeClass for nvidia), plus serve-args review (--enforce-eager trade-off, MoE --enable-expert-parallel/"ep2 dp2" layout checks) and compile-cache survival (VLLM_CACHE_ROOT), in references/pod-shape.md.
Sibling skill boundaries
This skill owns the pod/container/topology layer. It does not own:
- Metrics, alerts, SLO, PromQL, Grafana, OTLP, DCGM pairing — that is
vllm-observability. This skill points autoscaling at the metric names; vllm-observability owns their semantics and pitfalls.
- KV cache sizing, LMCache nvme/cpu/gds tiers, offloading backend choice — that is
vllm-caching. This skill covers which pod topology supports cross-pod KV transfer; vllm-caching covers how to size the tiers.
- Performance tuning, MoE fused-kernel autotune, TP/EP/DP decision trees, async scheduler, CUDA graph modes — that is
vllm-performance-tuning. This skill gets the pod running; that skill makes it fast.
- Benchmarking methodology,
vllm bench, request-rate-vs-concurrency semantics, goodput SLO — that is vllm-benchmarking.
- Env-var and YAML-config semantics, air-gapped HF mirror setup, ModelScope, trust_remote_code — that is
vllm-configuration. This skill shows where the env vars go in the pod spec; that one explains what they do.
- NVIDIA hardware SKU selection, HBM/power/NVLink, Blackwell gotchas per SM — that is
vllm-nvidia-hardware.
Structure of this skill
references/pod-shape.md — complete annotated Deployment manifest; env vars catalogue; probes; compile-cache survival; serve-args review; parser-plugin ConfigMap mount; nodeSelector per SM generation; PVC vs ModelCar trade-off; image tag discipline; vllm-openai entrypoint contract.
references/multi-node.md — LWS vs KubeRay; ray symmetric-run; NCCL on k8s (shm, SR-IOV, RoCE, InfiniBand, NCCL_SOCKET_IFNAME/NCCL_IB_HCA); the in-repo multi-node-serving.sh/run_cluster.sh; known issue list.
references/ecosystem.md — llm-d, vllm-production-stack, AIBrix, NVIDIA Dynamo, KServe vLLM runtime, vllm-semantic-router, Envoy AI Gateway — what each one is, current version, when to pick.
references/routing.md — Gateway API Inference Extension (InferencePool, InferenceModel, EPP), production-stack router, semantic-router, kgateway/Istio/NGF, OCP Route SSE timeout gotcha.
references/autoscaling.md — KEDA on vllm:num_requests_waiting, cooldown discipline (cooldownPeriod: 360), HPA with custom metrics, scale-to-zero, llm-d WVA.
references/disagg.md — cross-pod PD with NixlConnector, Mooncake, LMCache, MORI-IO; Dynamo's relation to vLLM's own connectors; topology recipes.
references/openshift.md — RHAIIS, RHOAI ServingRuntime templates, SCC, arbitrary UID, Routes 60 s timeout, NVIDIA GPU Operator on OCP, user-workload monitoring, air-gapped (oc-mirror v2, IDMS, ModelCar).
references/docker-lab.md — docker run canonical flags, --shm-size vs --ipc=host, --gpus, MIG strings, Podman/podman-compose, rootless friction, 2-node disagg compose template.
The vLLM in-repo deployment artifacts (cheat sheet)
| Path |
What it is |
docs/deployment/k8s.md |
Canonical K8s guide |
docs/deployment/docker.md |
Canonical Docker run reference |
docs/deployment/nginx.md |
Multi-server LB with Nginx |
docs/deployment/frameworks/lws.md |
LeaderWorkerSet recipe |
docs/deployment/frameworks/helm.md |
Helm chart usage |
docs/deployment/frameworks/kserve.md |
KServe runtime |
docs/deployment/integrations/{llm-d,production-stack,aibrix,dynamo,kubeRay,kthena,kubeai,kaito,llama-stack,llmaz}.md |
Ecosystem landing pages |
examples/online_serving/chart-helm/ |
In-tree Helm chart (v0.0.1, experimental) |
examples/ray_serving/multi-node-serving.sh |
Ray leader/worker bootstrap |
examples/online_serving/run_cluster.sh |
Docker-based Ray cluster (--shm-size 10.24g --ipc=host --gpus all) |
examples/online_serving/disaggregated_serving/ |
PD-split proxy demos (XpYd, KV events, Mooncake) |
examples/online_serving/disaggregated_prefill.sh |
PD launcher |
vllm/envs.py |
Canonical env-var catalogue |
vllm/distributed/kv_transfer/ |
KV connector implementations (LMCache, Mooncake, MORI-IO, NIXL, P2P-NCCL, HF3FS) |
vllm/entrypoints/serve/instrumentator/health.py |
/health endpoint (200 healthy, 503 EngineDeadError) |
Dockerfile{,.rocm,.cpu,.tpu,.xpu,.nightly_torch,.ppc64le,.s390x} |
Image variants |
All paths relative to vLLM repo root (https://github.com/vllm-project/vllm).
Operator smoke test — is this pod observable and multi-node-capable?
One-shot smoke test covering all critical checks:
${CLAUDE_SKILL_DIR}/scripts/deployment-smoke.sh <pod-name> [namespace]
The script validates pod health, /health, /v1/models, /dev/shm sizing, /metrics surface, NCCL env on multi-GPU pods, usage-stats opt-out, and image-tag discipline. Output is color-coded pass/warn/fail; exits non-zero on critical failure. If any check fails, the corresponding reference file has a diagnostic flow.
Critical pitfalls (the short list — full treatment in references)
- No
/dev/shm emptyDir. Silent NCCL segfault on first all-reduce. See references/pod-shape.md.
- Default liveness probe.
initialDelaySeconds: 30 vs 8–12 min cold load → pod liveness-kill loop. Fix: initialDelaySeconds: 600, or cleaner, a startupProbe with a 15-min budget — both in references/pod-shape.md.
:latest image tag. Breaks on every vLLM release. Pin to a version tag and roll forward deliberately.
- Root-UID image on OpenShift. Use RHAIIS images or rebuild. See
references/openshift.md.
- KEDA threshold 1–2 on
num_requests_waiting. Thrashing. Use 5–10 per replica and cooldownPeriod: 360. See references/autoscaling.md.
- OCP Route 60 s idle timeout. Kills long SSE streams. Annotate
haproxy.router.openshift.io/timeout: 10m.
- Missing
NCCL_SOCKET_IFNAME on multi-NIC hosts. NCCL picks the wrong interface and hangs on bootstrap. Pin explicitly.
- Using the in-tree
chart-helm (v0.0.1) in production. It is marked experimental. For production, use vllm-production-stack Helm or llm-d Helm.
- Telemetry to
stats.vllm.ai. Opt out with VLLM_NO_USAGE_STATS=1 VLLM_DO_NOT_TRACK=1 — especially in regulated/air-gapped environments.
- Assuming Gateway API is GA on every OCP. It is GA on OCP 4.19+, dev-preview on 4.17. Check the cluster version.
External references
Canonical entry: https://docs.vllm.ai/en/stable/deployment/ — topic URLs live in the reference files (references/ecosystem.md, references/multi-node.md, references/openshift.md).
Sibling skills: vllm-observability, vllm-caching, vllm-performance-tuning, vllm-benchmarking, vllm-configuration, vllm-nvidia-hardware, helm, openshift-app.
Also in the vllm plugin: vllm-quantization decides the weight format the
manifest's image tag and memory budget have to match (pick it before sizing
gpu_memory_utilization, not after), and vllm-gemma-4-31b is a worked
operating point for one model — useful as a filled-in example of the flags this
skill leaves generic.
1---2name: vllm-deployment3description: Use this skill when authoring, reviewing, or fixing a vLLM Kubernetes manifest, Docker/Podman pod, or OpenShift ServingRuntime — even when the user does not say "vllm". Triggers on: lab cluster performance practices, cache mount + survival across pod restarts (/root/.cache, VLLM_CACHE_ROOT, TORCHINDUCTOR_CACHE_DIR, TRITON_CACHE_DIR, "do we have caches saved"), HF_TOKEN secret in pod env, liveness + readiness probe tuning (initialDelaySeconds, failureThreshold, "pod takes 12 min to boot"), serve_args review, --enforce-eager rationale, MoE deployment ("ep2 dp2", --enable-expert-parallel, expert-parallel sizing), TP/PP sizing, ConfigMap parser-plugin mount, image tag selection, cold-boot reduction, multi-node LWS + Ray, control planes (llm-d, production-stack, AIBrix, NVIDIA Dynamo, KServe), KEDA autoscaling, GAIE routing, disaggregated prefill/decode (Nixl/Mooncake/LMCache/MORI-IO), RHAIIS on OpenShift (SCC, arbitrary UID, Routes 60s, ModelCar, air-gapped). Lead with operator intent, not vendor names.4---56# vLLM deployment (Kubernetes first, Docker lab, OpenShift sidebar)78Target audience: platform engineers bringing up vLLM on production Kubernetes (H100/H200/B200/B300 fleets), and individual researchers running 1-to-2-node Docker / Podman setups in a lab.910This skill is a **pointer map**. It points to the canonical sources — in the vLLM repo, in docs.vllm.ai, in the ecosystem repos, and to the load-bearing blog posts — rather than paraphrasing them. Paraphrase rots; pointers survive.1112## Decision guide — pick the path1314| Situation | Go to |15|---|---|16| Single node, 1 container, TP ≤ 8 | `references/docker-lab.md` |17| Single host, 2 containers for PD disagg lab | `references/docker-lab.md` (compose template) + `references/disagg.md` |18| k8s, single model fits 1 pod | `references/pod-shape.md` + in-tree helm chart |19| k8s, model needs multi-node TP/PP | `references/multi-node.md` (LWS + `multi-node-serving.sh`) |20| k8s fleet, router + LMCache + observability bundled | `vllm-production-stack` (Helm) — see `references/ecosystem.md` |21| k8s fleet, disagg P/D + KV-aware + GAIE + SLA scheduler | `llm-d` — see `references/ecosystem.md` |22| k8s fleet, ByteDance-scale multi-tenant LoRA + heterogenous GPU | `AIBrix` — see `references/ecosystem.md` |23| NVIDIA reference stack on prem / EKS / AKS with NIXL | `NVIDIA Dynamo` — see `references/ecosystem.md` |24| OpenShift / RHOAI | `references/openshift.md` + RHAIIS images |25| Routing / load balancing across pods | `references/routing.md` (GAIE, Envoy AI Gateway, Istio, production-stack router, semantic-router) |26| Air-gapped k8s or OCP | `references/openshift.md` §air-gapped + `vllm-configuration` skill for HF mirror |2728## The three load-bearing facts29301. **`/dev/shm` is the single most common cause of silent multi-GPU failure on k8s.** On vanilla k8s there is no `--ipc=host`. Without a shared-memory volume, `torch.distributed` segfaults on the first all-reduce of a TP>1 pod. Mount an `emptyDir` with `medium: Memory` and `sizeLimit: 10Gi` at `/dev/shm`. Documented in vLLM's own k8s guide — see ``vllm` repo: docs/deployment/k8s.md:209,289`. Since **v0.27.0 (#48879)** a pre-flight free-space check turns the *undersized* case into an actionable startup `RuntimeError` instead of a later crash — but the trap it replaces is worth knowing, because a 64 MiB `/dev/shm` is big enough to boot (see `references/pod-shape.md`).312. **Multi-node vLLM on k8s is Ray-on-LWS, not headless Service.** The `parallel-config` + pure headless-Service path exists but is not the vLLM-endorsed recipe. Use LeaderWorkerSet (`kubernetes-sigs/lws`) as the gang-scheduling primitive and `examples/ray_serving/multi-node-serving.sh` (which bootstraps Ray head/worker) as the entrypoint. Since Nov 2025 the `ray symmetric-run` pattern replaces the old head/worker split — see `https://blog.vllm.ai/2025/11/22/ray-symmetric-run.html`.323. **The upstream `vllm/vllm-openai` image runs as root.** On OpenShift (and any k8s cluster with `restricted-v2` PSA), that is a deploy-time failure. Either rebuild with `chgrp -R 0 /root /tmp && chmod -R g=u /root /tmp`, or use the Red Hat RHAIIS images (`registry.redhat.io/rhaiis/vllm-cuda-rhel9:3.3.0`), which are UID-agnostic by construction.3334## Minimum viable pod shape3536```yaml37# Deployment essentials — not a complete manifest. Full annotated template in references/pod-shape.md.38spec:39 template:40 spec:41 containers:42 - name: vllm43 image: vllm/vllm-openai:<pinned-tag> # do NOT use :latest44 args: ["--model", "$(MODEL)", "--tensor-parallel-size", "8",45 "--disable-access-log-for-endpoints", "/health,/metrics,/ping"]46 env:47 - {name: VLLM_HOST_IP, valueFrom: {fieldRef: {fieldPath: status.podIP}}}48 - {name: HF_HOME, value: /models/.cache} # pre-warmed PVC or ModelCar49 - {name: VLLM_NO_USAGE_STATS, value: "1"} # disable telemetry50 - {name: VLLM_DO_NOT_TRACK, value: "1"}51 # Multi-NIC (SR-IOV/RDMA): pin NCCL_SOCKET_IFNAME/NCCL_IB_HCA — see references/pod-shape.md52 ports: [{containerPort: 8000, name: http}]53 readinessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 5, failureThreshold: 3}54 livenessProbe: {httpGet: {path: /health, port: http}, periodSeconds: 10, failureThreshold: 3, initialDelaySeconds: 600}55 resources:56 limits: {nvidia.com/gpu: 8}57 volumeMounts:58 - {name: dshm, mountPath: /dev/shm} # LOAD-BEARING59 - {name: models, mountPath: /models}60 volumes:61 - name: dshm62 emptyDir: {medium: Memory, sizeLimit: 10Gi} # LOAD-BEARING63 - name: models64 persistentVolumeClaim: {claimName: vllm-model-cache}65 nodeSelector: {nvidia.com/gpu.product: NVIDIA-H200}66```6768The `initialDelaySeconds: 600` on the liveness probe is not excessive — cold model loads on a 405B FP8 take 8–12 min. A 30 s default makes the pod liveness-kill before it ever becomes ready. See `VLLM_ENGINE_READY_TIMEOUT_S` (default 600 s) in ``vllm` repo: vllm/envs.py`.6970Full annotated manifest (all env vars, all probes, PVC vs ModelCar choice, nodeSelector per SM, RuntimeClass for `nvidia`), plus serve-args review (`--enforce-eager` trade-off, MoE `--enable-expert-parallel`/"ep2 dp2" layout checks) and compile-cache survival (`VLLM_CACHE_ROOT`), in `references/pod-shape.md`.7172## Sibling skill boundaries7374This skill owns the **pod/container/topology** layer. It does not own:7576- **Metrics, alerts, SLO, PromQL, Grafana, OTLP, DCGM pairing** — that is `vllm-observability`. This skill points autoscaling at the metric names; `vllm-observability` owns their semantics and pitfalls.77- **KV cache sizing, LMCache nvme/cpu/gds tiers, offloading backend choice** — that is `vllm-caching`. This skill covers which pod topology supports cross-pod KV transfer; `vllm-caching` covers how to size the tiers.78- **Performance tuning, MoE fused-kernel autotune, TP/EP/DP decision trees, async scheduler, CUDA graph modes** — that is `vllm-performance-tuning`. This skill gets the pod running; that skill makes it fast.79- **Benchmarking methodology, `vllm bench`, request-rate-vs-concurrency semantics, goodput SLO** — that is `vllm-benchmarking`.80- **Env-var and YAML-config semantics, air-gapped HF mirror setup, ModelScope, trust_remote_code** — that is `vllm-configuration`. This skill shows where the env vars go in the pod spec; that one explains what they do.81- **NVIDIA hardware SKU selection, HBM/power/NVLink, Blackwell gotchas per SM** — that is `vllm-nvidia-hardware`.8283## Structure of this skill8485- **`references/pod-shape.md`** — complete annotated Deployment manifest; env vars catalogue; probes; compile-cache survival; serve-args review; parser-plugin ConfigMap mount; nodeSelector per SM generation; PVC vs ModelCar trade-off; image tag discipline; `vllm-openai` entrypoint contract.86- **`references/multi-node.md`** — LWS vs KubeRay; `ray symmetric-run`; NCCL on k8s (shm, SR-IOV, RoCE, InfiniBand, `NCCL_SOCKET_IFNAME`/`NCCL_IB_HCA`); the in-repo `multi-node-serving.sh`/`run_cluster.sh`; known issue list.87- **`references/ecosystem.md`** — llm-d, vllm-production-stack, AIBrix, NVIDIA Dynamo, KServe vLLM runtime, vllm-semantic-router, Envoy AI Gateway — what each one is, current version, when to pick.88- **`references/routing.md`** — Gateway API Inference Extension (`InferencePool`, `InferenceModel`, EPP), production-stack router, semantic-router, kgateway/Istio/NGF, OCP Route SSE timeout gotcha.89- **`references/autoscaling.md`** — KEDA on `vllm:num_requests_waiting`, cooldown discipline (`cooldownPeriod: 360`), HPA with custom metrics, scale-to-zero, llm-d WVA.90- **`references/disagg.md`** — cross-pod PD with NixlConnector, Mooncake, LMCache, MORI-IO; Dynamo's relation to vLLM's own connectors; topology recipes.91- **`references/openshift.md`** — RHAIIS, RHOAI ServingRuntime templates, SCC, arbitrary UID, Routes 60 s timeout, NVIDIA GPU Operator on OCP, user-workload monitoring, air-gapped (oc-mirror v2, IDMS, ModelCar).92- **`references/docker-lab.md`** — `docker run` canonical flags, `--shm-size` vs `--ipc=host`, `--gpus`, MIG strings, Podman/podman-compose, rootless friction, 2-node disagg compose template.9394## The vLLM in-repo deployment artifacts (cheat sheet)9596| Path | What it is |97|---|---|98| `docs/deployment/k8s.md` | Canonical K8s guide |99| `docs/deployment/docker.md` | Canonical Docker run reference |100| `docs/deployment/nginx.md` | Multi-server LB with Nginx |101| `docs/deployment/frameworks/lws.md` | LeaderWorkerSet recipe |102| `docs/deployment/frameworks/helm.md` | Helm chart usage |103| `docs/deployment/frameworks/kserve.md` | KServe runtime |104| `docs/deployment/integrations/{llm-d,production-stack,aibrix,dynamo,kubeRay,kthena,kubeai,kaito,llama-stack,llmaz}.md` | Ecosystem landing pages |105| `examples/online_serving/chart-helm/` | In-tree Helm chart (v0.0.1, experimental) |106| `examples/ray_serving/multi-node-serving.sh` | Ray leader/worker bootstrap |107| `examples/online_serving/run_cluster.sh` | Docker-based Ray cluster (`--shm-size 10.24g --ipc=host --gpus all`) |108| `examples/online_serving/disaggregated_serving/` | PD-split proxy demos (XpYd, KV events, Mooncake) |109| `examples/online_serving/disaggregated_prefill.sh` | PD launcher |110| `vllm/envs.py` | Canonical env-var catalogue |111| `vllm/distributed/kv_transfer/` | KV connector implementations (LMCache, Mooncake, MORI-IO, NIXL, P2P-NCCL, HF3FS) |112| `vllm/entrypoints/serve/instrumentator/health.py` | `/health` endpoint (200 healthy, 503 EngineDeadError) |113| `Dockerfile{,.rocm,.cpu,.tpu,.xpu,.nightly_torch,.ppc64le,.s390x}` | Image variants |114115All paths relative to vLLM repo root (https://github.com/vllm-project/vllm).116117## Operator smoke test — is this pod observable and multi-node-capable?118119One-shot smoke test covering all critical checks:120121```bash122${CLAUDE_SKILL_DIR}/scripts/deployment-smoke.sh <pod-name> [namespace]123```124125The script validates pod health, `/health`, `/v1/models`, `/dev/shm` sizing, `/metrics` surface, NCCL env on multi-GPU pods, usage-stats opt-out, and image-tag discipline. Output is color-coded pass/warn/fail; exits non-zero on critical failure. If any check fails, the corresponding reference file has a diagnostic flow.126127## Critical pitfalls (the short list — full treatment in references)1281291. **No `/dev/shm` emptyDir.** Silent NCCL segfault on first all-reduce. See `references/pod-shape.md`.1302. **Default liveness probe.** `initialDelaySeconds: 30` vs 8–12 min cold load → pod liveness-kill loop. Fix: `initialDelaySeconds: 600`, or cleaner, a `startupProbe` with a 15-min budget — both in `references/pod-shape.md`.1313. **`:latest` image tag.** Breaks on every vLLM release. Pin to a version tag and roll forward deliberately.1324. **Root-UID image on OpenShift.** Use RHAIIS images or rebuild. See `references/openshift.md`.1335. **KEDA threshold 1–2 on `num_requests_waiting`.** Thrashing. Use 5–10 per replica and `cooldownPeriod: 360`. See `references/autoscaling.md`.1346. **OCP Route 60 s idle timeout.** Kills long SSE streams. Annotate `haproxy.router.openshift.io/timeout: 10m`.1357. **Missing `NCCL_SOCKET_IFNAME` on multi-NIC hosts.** NCCL picks the wrong interface and hangs on bootstrap. Pin explicitly.1368. **Using the in-tree `chart-helm` (v0.0.1) in production.** It is marked experimental. For production, use vllm-production-stack Helm or llm-d Helm.1379. **Telemetry to `stats.vllm.ai`.** Opt out with `VLLM_NO_USAGE_STATS=1 VLLM_DO_NOT_TRACK=1` — especially in regulated/air-gapped environments.13810. **Assuming Gateway API is GA on every OCP.** It is GA on OCP 4.19+, dev-preview on 4.17. Check the cluster version.139140## External references141142Canonical entry: https://docs.vllm.ai/en/stable/deployment/ — topic URLs live in the reference files (`references/ecosystem.md`, `references/multi-node.md`, `references/openshift.md`).143144Sibling skills: `vllm-observability`, `vllm-caching`, `vllm-performance-tuning`, `vllm-benchmarking`, `vllm-configuration`, `vllm-nvidia-hardware`, `helm`, `openshift-app`.145146Also in the `vllm` plugin: `vllm-quantization` decides the weight format the147manifest's image tag and memory budget have to match (pick it before sizing148`gpu_memory_utilization`, not after), and `vllm-gemma-4-31b` is a worked149operating point for one model — useful as a filled-in example of the flags this150skill leaves generic.