Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

NVIDIA GPU Operator for Kubernetes

By Kokil Thapa | Last reviewed: September 2026

Running GPU workloads on Kubernetes without a unified install path leaves you patching drivers on every node, chasing mismatched container runtimes, and debugging opaque scheduling failures. The NVIDIA GPU Operator for Kubernetes packages that work into a single controller-driven flow: it detects GPU hardware, installs matching drivers, configures the NVIDIA Container Toolkit, and registers the device plugin so pods can request nvidia.com/gpu resources. If you already understand GPU scheduling on Kubernetes, the operator is the production layer that makes those scheduling rules usable on real hardware. This guide covers architecture, Helm installation, verification, and the failures I see most often on bare-metal and cloud GPU nodes.

What is the NVIDIA GPU Operator for Kubernetes and what does it install?

The operator follows the same pattern described in Kubernetes operators that extend the API. It watches custom resources and reconciles a stack of DaemonSets and controllers on GPU-capable nodes. You do not SSH into each worker to install drivers when the operator is configured correctly.

At a high level, the stack has four layers that must align before a pod receives a GPU:

  • Host driver — kernel module matched to the GPU generation and host OS.
  • Container runtime hook — NVIDIA Container Toolkit integration with containerd or Docker.
  • Device plugin — exposes nvidia.com/gpu to the kubelet and scheduler.
  • GPU Feature Discovery (GFD) — labels nodes with GPU model, memory, and MIG profile data.
GPU Operator ArchitectureGPU Operator ControllerClusterPolicy CRDriver DaemonSetHost kernel moduleToolkit DaemonSetcontainerd hookDevice Pluginnvidia.com/gpuGPU Worker Nodekubelet + containerd + physical NVIDIA GPUGFD labels: gpu.product, memory, MIG
NVIDIA GPU Operator for Kubernetes reconciles driver, toolkit, device plugin, and feature discovery on each GPU node.

The primary custom resource is ClusterPolicy. It defines driver version, toolkit settings, MIG strategy, and whether the operator manages the driver or only the upper stack. Optional components include the DCGM exporter for metrics, the GPU validator for health checks, and the vGPU manager when you run virtual GPU profiles.

For teams building inference pipelines, this stack connects directly to patterns in serving ML models with GPU on Kubernetes and tools like KServe model serving on Kubernetes. The operator does not replace your ML framework. It makes the node ready so PyTorch, TensorRT, or CUDA base images start without custom init containers on every deployment.

Core components at a glance

ComponentRoleRuns as
gpu-operator controllerReconciles ClusterPolicy and deploys child resourcesDeployment in operator namespace
nvidia-driverInstalls and loads host GPU driverDaemonSet (privileged)
nvidia-container-toolkitInjects NVIDIA runtime into containerd/CRI-ODaemonSet
nvidia-device-pluginAdvertises GPU capacity to kubeletDaemonSet
gpu-feature-discoveryPublishes node labels for schedulingDaemonSet
dcgm-exporterPrometheus GPU metricsDaemonSet (optional)

The operator expects a supported Linux host OS and a container runtime the toolkit can patch. On bare metal, I treat GPU nodes like any other specialised worker: dedicated taints, separate node pools, and documented upgrade windows. That mirrors how I handle specialised workers during Linux system administration engagements where uptime matters more than bleeding-edge driver versions.

How do you install the NVIDIA GPU Operator on a Kubernetes cluster?

Helm is the supported install path for most clusters in 2026. The operator ships from NVIDIA's chart repository and targets Kubernetes 1.27+ on supported distributions including upstream Kubernetes, OpenShift, Rancher, and major cloud managed offerings with GPU instance types.

Prerequisites checklist

  1. GPU hardware visible on the host (lspci | grep -i nvidia on bare metal).
  2. Container runtime is containerd or CRI-O with a standard config path.
  3. Node OS matches the operator's supported matrix (Ubuntu 22.04/24.04 is common).
  4. Helm 3.x installed on your admin workstation.
  5. NVIDIA GPU nodes labelled or tainted so only GPU workloads land there.

If you run containerd without the toolkit, review NVIDIA Container Toolkit for Docker and GPU containers first. The operator installs the toolkit for you, but understanding the runtime hook helps when debugging mount or library path errors.

Helm install commands

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

kubectl create namespace gpu-operator

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --set driver.enabled=true \
  --set toolkit.enabled=true \
  --set devicePlugin.enabled=true \
  --set gfd.enabled=true \
  --wait

For OpenShift, use the certified operator bundle from OperatorHub instead of raw Helm. The reconciliation model is the same, but RBAC and SecurityContextConstraints differ.

Installation FlowHelm installgpu-operatorClusterPolicyCR createdReconcileDaemonSetsNode ReadyGPUs listedPer-GPU-node sequence1. Driver pod loads kernel module2. Toolkit patches containerd config3. Device plugin registers with kubelet4. GFD applies scheduling labels5. Validator confirms CUDA access
Helm deploys the NVIDIA GPU Operator, which reconciles ClusterPolicy into node-level DaemonSets until GPUs are schedulable.

Common Helm values for production

Pin the driver version when you need reproducible clusters across regions. Pre-installed drivers on cloud images may require driver.enabled=false so the operator only manages toolkit, plugin, and GFD.

helm upgrade gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --reuse-values \
  --set driver.version="580.65.06" \
  --set driver.kernelModuleType=open \
  --set mig.strategy=mixed \
  --set dcgmExporter.enabled=true \
  --set node-feature-discovery.enableNodeFeatureApi=true

Label GPU nodes before or after install. A typical pattern uses nvidia.com/gpu.present=true applied by GFD, plus a custom taint:

kubectl taint nodes gpu-node-01 nvidia.com/gpu=present:NoSchedule

Pair that taint with tolerations on GPU workloads. See taints and tolerations in Kubernetes for the scheduling mechanics. Without taints, CPU-only pods may land on expensive GPU nodes and waste capacity.

For local testing before production, Minikube vs Kind for local Kubernetes compares options. Neither fully replaces a real GPU node, but Kind with GPU passthrough helps validate manifests cheaply.

How does the NVIDIA GPU Operator differ from manual GPU driver setup?

Manual setup means installing drivers with apt or runfile, configuring containerd by hand, deploying the device plugin manifest, and repeating the process on every new node and every kernel upgrade. The operator centralises that into declarative config with rolling reconciliation.

Manual vs GPU OperatorManual per nodeSSH + driver installEdit containerd.tomlApply device plugin YAMLRepeat on kernel updateVersion drift across nodesNo unified health checksHigh ops burdenGPU OperatorClusterPolicy declares stateDaemonSets roll out stackAuto toolkit + pluginPinned driver versionsGFD labels for schedulingBuilt-in validator podsGitOps friendly
NVIDIA GPU Operator for Kubernetes replaces repetitive SSH-based GPU node bootstrap with declarative ClusterPolicy reconciliation.
CriteriaManual setupGPU Operator
Install time per node30–90 minutes with testingAutomated after initial Helm deploy
Driver consistencyDrift risk across nodesSingle ClusterPolicy version pin
Kernel upgradesManual rebuild or reinstallDriver DaemonSet reconciles
MIG configurationnvidia-smi CLI on each hostConfigMap + operator MIG manager
ObservabilityCustom scriptsDCGM exporter optional bundle
Best fitSingle-node dev, pre-baked AMIsMulti-node clusters, frequent scaling

Cloud providers often ship GPU-optimised AMIs with drivers pre-installed. In that case, disable operator-managed drivers and let the operator handle only toolkit, plugin, and GFD. Mixing a host driver installed outside the operator with an operator driver DaemonSet on the same node causes failures that look like random CUDA version mismatches.

The official NVIDIA GPU Operator documentation lists supported platforms and version matrices. Cross-check against your Kubernetes minor version before upgrading production clusters provisioned with Kubespray for Kubernetes deployment.

How do you verify GPU pods work after deploying the operator?

Verification has three layers: operator health, node capacity, and a running CUDA workload. Skip any layer and you will misdiagnose scheduling versus runtime problems.

Step 1: Confirm operator pods are ready

kubectl get pods -n gpu-operator
kubectl get clusterpolicy cluster-policy -o yaml

All DaemonSets on GPU nodes should show desired equals ready. Driver pods run privileged and may take several minutes on first boot while modules compile.

Step 2: Check node GPU capacity

kubectl describe node gpu-node-01 | grep -A5 Capacity
kubectl get nodes -L nvidia.com/gpu.product,nvidia.com/cuda.driver.version

You should see allocatable nvidia.com/gpu matching physical GPUs or MIG slices. The Kubernetes scheduler uses that allocatable value when binding pods. Wrong counts usually mean the device plugin failed registration.

Step 3: Run a CUDA smoke test pod

cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd-test
spec:
  restartPolicy: OnFailure
  tolerations:
  - key: nvidia.com/gpu
    operator: Exists
    effect: NoSchedule
  containers:
  - name: cuda-vectoradd
    image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
    resources:
      limits:
        nvidia.com/gpu: 1
EOF
kubectl logs cuda-vectoradd-test
kubectl delete pod cuda-vectoradd-test

Successful logs show vector addition completed on the GPU. If the pod stays Pending, inspect events for insufficient nvidia.com/gpu. If it CrashLoopBackOff, read debugging CrashLoopBackOff in Kubernetes and check driver pod logs first.

GPU Pod SchedulingGPU Podlimits: gpu: 1SchedulerFilter + bindGPU Nodeallocatable GPUDevice PluginAllocate() hookcontainerd + NVIDIA runtimeCUDA libs mounted into podWorkload runs on physical GPUDCGM metrics optional via exporter
After the NVIDIA GPU Operator for Kubernetes registers devices, the scheduler binds pods and the device plugin allocates GPU hardware at container start.

Set explicit resources.limits.nvidia.com/gpu on every GPU container. Requests should match limits for extended resources. Read Kubernetes resource limits and requests if your pods get OOM-killed despite free GPU capacity—CPU and memory starvation still happens on GPU nodes.

Export the resulting pod spec or node labels through a JSON formatter when you paste diagnostics into tickets. Clean JSON saves time when you hand issues to platform or hardware teams.

What are common NVIDIA GPU Operator failures and how do you fix them?

Most failures fall into driver conflicts, runtime misconfiguration, or scheduling mismatches. The operator surfaces them through pod events and ClusterPolicy status conditions rather than silent partial installs.

Driver already installed on the host

Symptoms include driver DaemonSet crash loops and messages about existing NVIDIA modules. Fix by either removing the host driver and letting the operator manage it, or setting driver.enabled=false in Helm values. Never run both.

Container runtime not patched

Pods start but fail with libcuda.so or unknown device errors. Check toolkit DaemonSet logs and confirm containerd was restarted after the hook was applied. The NVIDIA Container Toolkit install guide explains the expected runtime class and config snippets the operator generates automatically.

Device plugin not registering

Nodes show zero allocatable GPUs. Verify the device plugin pod is running on that node and kubelet logs contain no plugin registration errors. The upstream Kubernetes device plugin docs describe the registration handshake the NVIDIA plugin must complete.

MIG profile mismatches

When MIG is enabled, resource names change to sliced profiles like nvidia.com/mig-1g.5gb. Your pod limits must reference the exact extended resource the plugin exposes. Mixed MIG strategy on heterogeneous clusters needs node selectors on GFD labels.

Upgrade and rollback strategy

Upgrade the operator chart during a maintenance window. Driver upgrades unload modules and restart GPU workloads on that node. Cordone the node, drain GPU jobs, upgrade, validate with the CUDA sample pod, then uncordon. For cluster-wide issues, Helm rollback is faster than manual driver cleanup on each host.

Broader diagnostic patterns live in Kubernetes troubleshooting field guide and Kubernetes performance tuning. GPU-specific latency often traces to PCIe bandwidth, power limits, or sharing too many pods per GPU—not operator bugs.

Teams building ML platforms on top of this stack often pair the operator with Kubeflow ML pipelines on Kubernetes and GitOps controllers. The operator handles node readiness; pipelines handle experiment lifecycle. That separation keeps infrastructure upgrades from blocking data science releases.

If your organisation needs GPU-backed inference integrated into a business application rather than raw cluster ops, see how AI integration and automation services approach production API design. GPU clusters are expensive. Most SMB teams in Nepal and abroad should validate workload fit before committing to dedicated hardware at Rs 400,000–800,000 per GPU server (~USD 3,000–6,000).

For reference architectures on production clusters I've helped maintain, browse the project portfolio including platforms like Adventure Third Pole Trek where reliable background job processing mattered as much as raw compute. GPU nodes add similar operational discipline: backups, monitoring, and upgrade playbooks before you scale.

Key Takeaways

  • Install the NVIDIA GPU Operator for Kubernetes with Helm and a ClusterPolicy that matches your driver strategy—managed or pre-installed.
  • Taint GPU nodes and add tolerations so only GPU workloads consume expensive accelerators.
  • Verify with node allocatable counts, GFD labels, and a CUDA sample pod before promoting ML workloads.
  • Disable operator driver management when cloud AMIs already ship a matching driver to avoid module conflicts.
  • Pin driver versions in Helm values for reproducible multi-region clusters and simpler rollback.
  • Pair the operator with DCGM metrics and documented drain-and-upgrade procedures for production GPU nodes.

People Also Ask

Does the NVIDIA GPU Operator work with containerd?

Yes. Containerd is the default target for most upstream Kubernetes clusters in 2026. The operator deploys a toolkit DaemonSet that patches containerd configuration and sets the NVIDIA runtime handler. CRI-O is also supported on OpenShift and some security-hardened distributions.

Can you use the GPU Operator without Helm?

NVIDIA publishes static manifests and OpenShift Operator Lifecycle Manager bundles. Helm remains the most common path for vanilla Kubernetes because values files are easy to store in Git and diff during upgrades.

How many GPUs can one Kubernetes node expose?

The device plugin exposes one extended resource unit per physical GPU or per configured MIG slice. A node with four A100 GPUs shows four nvidia.com/gpu allocatable units unless MIG splits them into smaller advertised resources.

Is the GPU Operator required for Kubernetes GPU workloads?

No. You can manually install drivers, the container toolkit, and the device plugin. The operator is recommended when you operate multiple GPU nodes and want declarative, version-controlled reconciliation instead of repeated SSH bootstrap.

Run GPU Workloads With Confidence

The NVIDIA GPU Operator for Kubernetes turns GPU node bootstrap from a fragile manual checklist into declarative infrastructure. Start with a pinned Helm release, validate nodes with a CUDA smoke test, and document your taint and upgrade playbook before production ML traffic lands. When you need help connecting GPU-backed services to a Laravel API, eCommerce pipeline, or internal automation workflow, contact the team or explore related guides on the blog and the homepage. Solid GPU infrastructure pays off only when applications actually use it—plan the software path alongside the operator install.

Frequently Asked Questions

A cluster add-on that automates NVIDIA driver installation, container runtime configuration, device plugin deployment, and GPU feature discovery on GPU nodes so pods can request nvidia.com/gpu without manual per-host setup.

The stack has four required layers: a host driver DaemonSet, the NVIDIA Container Toolkit for containerd or CRI-O, the device plugin that exposes nvidia.com/gpu to the scheduler, and GPU Feature Discovery that labels nodes with GPU model and memory. Optional pieces include DCGM exporter for Prometheus metrics, a GPU validator, and vGPU manager for virtual GPU profiles. A central controller reconciles ClusterPolicy into these DaemonSets.

Helm 3.x is the supported path for most clusters in 2026. Add NVIDIA's chart repo at helm.ngc.nvidia.com/nvidia, create a gpu-operator namespace, then helm install with driver, toolkit, devicePlugin, and gfd enabled. OpenShift teams should use the certified OperatorHub bundle instead of raw Helm because RBAC and SecurityContextConstraints differ. Target Kubernetes 1.27 or newer on upstream Kubernetes, OpenShift, Rancher, or major cloud managed distributions with GPU instance types.

GPU hardware must be visible on the host, typically confirmed with lspci on bare metal. The container runtime should be containerd or CRI-O with a standard config path. Node OS must match the operator supported matrix; Ubuntu 22.04 and 24.04 are common choices. Helm 3.x goes on your admin workstation. Label or taint GPU nodes so only GPU workloads schedule there. Without taints, CPU-only pods can land on expensive GPU nodes and waste capacity.

Yes. Containerd is the default target for most upstream Kubernetes clusters in 2026, and CRI-O is supported on OpenShift and hardened distributions.

Manual setup means installing drivers with apt or runfile, patching containerd by hand, deploying the device plugin manifest, and repeating on every new node and kernel upgrade—often 30 to 90 minutes per node with testing. The operator centralises that into declarative ClusterPolicy reconciliation with a single Helm deploy. Driver consistency across nodes improves because one policy pins versions. Kernel upgrades trigger driver DaemonSet reconciliation instead of SSH rebuilds. MIG configuration moves from per-host nvidia-smi CLI work to ConfigMap plus operator MIG manager.

Cloud providers often ship GPU-optimised AMIs with drivers pre-installed. In that case set driver.enabled=false so the operator manages only the toolkit, device plugin, and GPU Feature Discovery. Never run both an operator driver DaemonSet and a separately installed host driver on the same node. That mix causes failures that look like random CUDA version mismatches and driver DaemonSet crash loops complaining about existing NVIDIA modules. Pick one driver source and stick with it cluster-wide.

ClusterPolicy is the primary custom resource the operator watches and reconciles. It defines driver version, toolkit settings, MIG strategy, and whether the operator manages the host driver or only the upper stack. Helm values map into ClusterPolicy, which the gpu-operator controller turns into DaemonSets and child resources on GPU-capable nodes. Check it with kubectl get clusterpolicy cluster-policy -o yaml alongside operator pod readiness when diagnosing partial installs. Status conditions surface reconciliation problems instead of silent failures.

Rs 400,000 to 800,000 per GPU server, roughly USD 3,000 to 6,000. Validate workload fit before buying.

Confirm operator pods are ready in the gpu-operator namespace and ClusterPolicy reconciles cleanly. Check node Capacity and Allocatable for nvidia.com/gpu, plus GFD labels like nvidia.com/gpu.product and nvidia.com/cuda.driver.version. Run a CUDA smoke test pod using nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 with resources.limits.nvidia.com/gpu set to 1 and a toleration for your GPU taint. Successful logs show vector addition completed on the GPU. Pending means scheduling; CrashLoopBackOff usually points to driver or runtime issues.

GPU instances are expensive and should not run general CPU workloads. A typical pattern applies nvidia.com/gpu.present=true via GPU Feature Discovery plus a custom taint such as nvidia.com/gpu=present:NoSchedule. GPU pods need matching tolerations. Without taints, the scheduler may place ordinary pods on GPU nodes, wasting accelerator capacity you pay for per hour or per server. This mirrors treating GPU nodes as specialised worker pools with documented upgrade windows, separate from general application nodes.

Driver conflicts occur when a host driver and operator driver coexist—remove one or set driver.enabled=false. Runtime misconfiguration shows libcuda.so or unknown device errors; check toolkit DaemonSet logs and confirm containerd restarted after the hook. Zero allocatable GPUs usually means the device plugin failed registration—verify its pod on the node and kubelet logs. MIG mismatches happen when pods request nvidia.com/gpu but the node exposes sliced resources like nvidia.com/mig-1g.5gb; match pod limits to the exact extended resource and use GFD labels with node selectors on heterogeneous clusters.

Schedule upgrades during a maintenance window because driver upgrades unload modules and restart GPU workloads on affected nodes. Cordone the node, drain GPU jobs, run helm upgrade—pinning driver.version such as 580.65.06 for reproducibility—validate with the CUDA sample pod, then uncordon. For cluster-wide chart problems, helm rollback is faster than manual driver cleanup on each host. First boot after install can take several minutes while privileged driver pods compile kernel modules. Document drain-and-upgrade playbooks before scaling GPU node pools across regions.

Pin driver.version for reproducible multi-region clusters and set driver.kernelModuleType=open where appropriate. Enable dcgmExporter for Prometheus GPU metrics. Set mig.strategy=mixed on heterogeneous clusters and enable node-feature-discovery.enableNodeFeatureApi for richer node labels. Keep toolkit, devicePlugin, and gfd enabled unless you have a deliberate reason not to. Use helm upgrade with --reuse-values when adjusting a single setting. Pair version pins with documented rollback so driver drift does not appear silently across node pools after autoscaling events.

Neither Minikube nor Kind fully replaces a real GPU node, but Kind with GPU passthrough helps validate manifests cheaply before production. Real verification still needs three layers from the article: operator health, node allocatable nvidia.com/gpu counts, and a running CUDA workload. Local clusters are useful for checking Helm values, tolerations, and pod specs, not for proving driver DaemonSet reconciliation or device plugin registration. Promote to a labelled GPU node pool only after the CUDA vectoradd sample completes successfully on actual hardware.

Share this article

0 Comments

Leave a comment

Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

Quick Contact Options
Choose how you want to connect me: