vllm-deployment — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vllm-deployment (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
| 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, Agent Router (formerly 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 |
--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:210,290. 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`).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.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.# 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.
For "review / audit this manifest", "cross-check flags", "caches saved?": mark every row pass, fail or n/a, citing the manifest line it rests on. Then run the smoke test below against the live pod for the runtime half.
| Check | Passes when | Detail |
|---|---|---|
/dev/shm | emptyDir {medium: Memory} mounted at /dev/shm, sizeLimit ≥ 10Gi on TP>1 | references/pod-shape.md §/dev/shm |
| Image | pinned version tag, never :latest; weight format matches the tag (vllm-quantization) | pitfall 3 |
| Caches | HF_HOME on a PVC or ModelCar; /root/.cache mounted (arbitrary-UID images: VLLM_CACHE_ROOT at a mounted path), PVC if it must survive rescheduling; TORCHINDUCTOR_CACHE_DIR not set | references/pod-shape.md §Compile-cache survival |
| HF token | HF_TOKEN / HUGGING_FACE_HUB_TOKEN from secretKeyRef, never a literal value: | references/pod-shape.md template |
| Probes | readiness and liveness on /health; cold-boot budget from a startupProbe or liveness initialDelaySeconds: 600 | pitfalls 2, 11 |
| Shutdown | --shutdown-timeout N set and terminationGracePeriodSeconds ≥ N + 30 | pitfall 12 |
| Parallelism | TP × PP × DP equals the pod's nvidia.com/gpu limit; MoE EP flags agree with it | references/pod-shape.md §Serve-args review |
| serve_args | no --enforce-eager in production; every flag exists at the pinned tag (references/upgrading.md) | references/pod-shape.md §Serve-args review |
| Network | VLLM_HOST_IP from status.podIP; NCCL_SOCKET_IFNAME pinned on multi-NIC hosts | pitfall 7, references/multi-node.md |
| Telemetry | VLLM_NO_USAGE_STATS=1 and VLLM_DO_NOT_TRACK=1 | pitfall 9 |
| Platform | OpenShift: non-root image and Route timeout annotation; KEDA: threshold 5–10, cooldownPeriod: 360 | pitfalls 4–6 |
This skill owns the pod/container/topology layer. It does not own:
vllm-observability. This skill points autoscaling at the metric names; vllm-observability owns their semantics and pitfalls.vllm-caching. This skill covers which pod topology supports cross-pod KV transfer; vllm-caching covers how to size the tiers.vllm-performance-tuning. This skill gets the pod running; that skill makes it fast.vllm-benchmarking.vllm-configuration. This skill shows where the env vars go in the pod spec; that one explains what they do.vllm-nvidia-hardware.vllm-openai entrypoint contract.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.InferencePool, EPP), production-stack router, semantic-router, kgateway/Istio/NGF, OCP Route SSE timeout gotcha.vllm:num_requests_waiting, cooldown discipline (cooldownPeriod: 360), HPA with custom metrics, scale-to-zero, llm-d KEDA-on-EPP (WVA deprecated).docker run canonical flags, --shm-size vs --ipc=host, --gpus, MIG strings, Podman/podman-compose, rootless friction, 2-node disagg compose template.| 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/integrations/{llm-d,production-stack,aibrix,dynamo,kserve,kuberay,kthena,kubeai,kaito,llamastack,llmaz}.md | Ecosystem landing pages (KServe runtime is integrations/kserve.md) |
examples/deployment/chart-helm/ | In-tree example Helm chart (chart-vllm 0.0.2) |
examples/ray_serving/multi-node-serving.sh | Ray leader/worker bootstrap |
examples/ray_serving/run_cluster.sh | Docker-based Ray cluster (--network host --shm-size 10.24g --gpus all) |
examples/disaggregated/disaggregated_serving/ | PD-split proxy demos (XpYd, KV events, MoRI-IO proxy) |
examples/disaggregated/{mooncake_connector,lmcache}/ | PD launchers (run_mooncake_connector.sh, disagg_prefill_lmcache_v1/disagg_example_nixl.sh) |
vllm/envs.py | Canonical env-var catalogue |
vllm/distributed/kv_transfer/ | KV connector implementations (LMCache, Mooncake, MORI-IO, NIXL, HF3FS, Offloading, FlexKV) — P2P-NCCL was removed in v0.24.0 |
vllm/entrypoints/serve/instrumentator/health.py | /health endpoint (200 healthy, 503 EngineDeadError) |
docker/Dockerfile{,.rocm,.cpu,.xpu,.zen,.rock,.ppc64le,.s390x} | Image variants |
All paths relative to vLLM repo root (https://github.com/vllm-project/vllm).
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.
references/pod-shape.md.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.references/openshift.md.cooldownPeriod: 360. See references/autoscaling.md.haproxy.router.openshift.io/timeout: 10m.examples/, not a supported release artifact. For production, use vllm-production-stack Helm or llm-d Helm.VLLM_NO_USAGE_STATS=1 VLLM_DO_NOT_TRACK=1 — especially in regulated/air-gapped environments./health probe set — not the requested YAML with caveats. A generation probe (/v1/completions, /v1/chat/completions) queues behind real traffic and times out on a busy pod, so kubelet restarts healthy pods under load, each a full cold boot. Keep liveness on /health: it returns 503 once the engine core is dead (EngineDeadError); the API server exits ~5 s after engine death unless VLLM_KEEP_ALIVE_ON_ENGINE_DEATH=1. Dead engine still Ready → that env is set, readiness is not on /health, or the engine is hung, not dead. Keep readiness (drops the pod from Service endpoints) and liveness (restarts it) separate. Catch hung-but-alive with a /metrics alert (requests running > 0, generation-token rate flat), not a probe.--shutdown-timeout N is set (default 0 = abort; N>0 drains up to N s and rejects new requests). Set N to the longest generation served (60–120 s) and the pod grace to N + ~30 s for teardown. Never cut the pod grace to speed eviction: a terminating pod leaves Service endpoints at once, and the grace applies to every rollout, drain and scale-down. For a fast kill on liveness failure only, set livenessProbe.terminationGracePeriodSeconds.Current release: v0.32.0 (2026-10-18). Write vllm/vllm-openai:v0.32.0 (or the tag the operator runs) into every command and manifest, never :latest or a <tag> placeholder.
Before bumping the image tag, read references/upgrading.md: the v0.28.0–v0.32.0 changes that alter a manifest or its rollout (CORS closed by default, a removed env var that now silently does nothing, deprecated python -m entrypoints, Model Runner V2 default, a YaRN --max-model-len that must be recomputed).
Canonical entry: https://docs.vllm.ai/en/stable/ (there is no /deployment/ index page — deployment/k8s/ and deployment/docker/ are direct) — 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.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.