nvidia/deploy-k8s-gpu-cluster
Deploy a Kubernetes GPU cluster with DeepOps (Kubespray + GPU Operator) and prove it schedules GPU pods. Use when asked to deploy or rebuild Kubernetes on GPU servers with this repository.
npx skills add https://github.com/NVIDIA/deepops --skill deploy-k8s-gpu-cluster
installs may reboot them; no active users or workloads).
user.
submodules/kubespray initialized — Kubernetes playbooks fail on missingkubespray_defaults role imports without it.
git submodule update --init --recursive
./scripts/setup.sh
cp -r config.example config
config/inventory: control plane nodes under[kube_control_plane] and [etcd], workers under [kube_node] (a
single machine can hold all three roles).
python3 scripts/validation/deepops_doctor.py --remote --json
ansible-playbook -l k8s_cluster playbooks/k8s-cluster.yml
This runs Kubespray and installs the NVIDIA GPU Operator. Expect
roughly 45–90 minutes on a first run.
python3 scripts/validation/validate_k8s.py --json --cuda-smoke
Require "ok": true with nodes_ready == nodes_total,
gpus_allocatable > 0, and cuda_smoke_ok: true.
Kubespray is rerun-safe. A converged rerun reports changed=0.
kubespray_defaults: the submodule isnot initialized; run git submodule update --init --recursive.
gpus_allocatable: 0: the GPU Operator stack is not ready. Checkkubectl get pods -A | grep -i nvidia — the driver DaemonSet can take
10+ minutes on first deploy; if pods are crash-looping, follow
skills/diagnose-driver-install/.
Pending: `kubectl -n deepops-validatedescribe pod deepops-validate-cuda` — usually no allocatable GPU
(see above) or an image pull problem on airgapped networks (use
--cuda-image to point at a mirrored image).
playbook for the single-node case; if pods stay Pending on a multi-role
node, check taints with kubectl describe node <name> | grep -i taint.
Take nvidia/deploy-k8s-gpu-cluster from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.