TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

GPU Operator Pod Components and Roles, and Do Hosts Need Drivers?

Status: Draft (2026-10-07). Pod names, types, init container orders, node labels, and installation option combinations are read-only observations from an actually running environment. The method of the operator mounting drivers as containers was not directly tested because this environment does not use it (unmeasured), and was instead verified through official documentation descriptions. Writing rule: Measured data is the default, and anything unmeasured is marked as "Unmeasured".

Table of Contents

When you first use GPU Operator, gpu-operator more than ten pods run in the namespace, making it difficult to tell what is what by names alone. This article answers two questions.

  1. What each pod does, on which node it runs, and what symptoms occur if it is missing.
  2. Can you use GPUs with only the GPU Operator without installing an NVIDIA driver on the host?

Short answer. Pods are broadly divided into controllers (Deployment), node labelers (NFD), and a bundle of DaemonSets running one per GPU node (driver, toolkit, device plugin, GFD, DCGM Exporter, validator). The host does not need a driver. This is because the operator mounts the driver as a container by default. Conversely, if you have already installed a driver on the host, a configuration that disables the operator's driver (driver.enabled=false) is possible and actually common. The two approaches differ in "who manages the driver's lifecycle".

1. Pods Created Upon Installation

This is the result of reading the gpu-operator namespace in an environment where GPU Operator (v26.3.3) is actually running. Since numbers (node counts) vary by environment, only the types and roles are summarized.

Pod (Resource Name) Type Where It Runs Role If Missing or Failed
gpu-operator Deployment One per cluster Controller. Reads ClusterPolicy , creates the DaemonSets below, and manages node labels (nvidia.com/gpu.deploy.*) Nothing new is deployed, and configuration changes are not applied
gpu-operator-node-feature-discovery-master, -gc Deployment One per cluster (or similar phrasing) Central component of NFD. Attaches hardware info sent by workers as labels (master) and cleans up stale objects of disappeared nodes (gc) Node labels are not updated
gpu-operator-node-feature-discovery-worker DaemonSet All nodes Reads and reports node PCI devices, kernel, etc. If an NVIDIA device is present, the feature.node.kubernetes.io/pci-10de.present label is created, and the operator identifies it as a GPU node based on this Not recognized as a GPU node, so the desired count of the DaemonSets below becomes 0
nvidia-driver-daemonset DaemonSet GPU nodes Installs the NVIDIA driver (kernel module) as a container. Can be disabled if a driver already exists on the host (Section 3) nvidia-smi fails and other pods hang during initialization
nvidia-container-toolkit-daemonset DaemonSet GPU nodes Registers the nvidia runtime handler in the container runtime (containerd) and installs tools to inject GPU devices and libraries into containers no runtime for "nvidia" is configured
nvidia-device-plugin-daemonset DaemonSet GPU nodes Registers with kubelet to advertise the nvidia.com/gpu count, and allocates devices using Allocate when a pod requests a GPU. Also monitors device health (XID) Node's nvidia.com/gpu is missing or decreases
gpu-feature-discovery DaemonSet GPU nodes Attaches GPU-specific labels (such asnvidia.com/gpu.product, nvidia.com/gpu.count ) like GPU model, count, memory, and driver version Model-specific scheduling labels disappear (GPU advertising itself is unaffected)
nvidia-dcgm-exporter DaemonSet GPU nodes Exposes GPU utilization, memory, temperature, power, and error metrics in Prometheus format Only observation is lost. CrashLoopBackOff if it cannot connect to a separate DCGM
nvidia-operator-validator DaemonSet GPU nodes Validates in order whether the installation was done correctly (Section 2) Tells you which component has an issue when a pod gets stuck in the validation phase
nvidia-cuda-validator Short-lived Pod Created during validation and completes upon finishing Actually runs a CUDA example once Validation failure
nvidia-mig-manager DaemonSet Nodes with MIG enabled Applies MIG profiles Meaningless on GPUs that cannot use MIG (disabled in this environment)
nvidia-device-plugin-mps-control-daemon DaemonSet Nodes with MPS enabled MPS control daemon. In this environment, the desired count is 0, so no pods exist Irrelevant if the feature is not used

In NVSwitch systems (such as HGX), Fabric Manager is additionally required. The operator's driver container installs this together when it detects an NVSwitch, and you must install it directly if you use a host driver (this is stated in official documentation and was not tested because this environment lacks NVSwitch, unmeasured).

2. Pods Wait for Each Other: Validation Chain

DaemonSets start all at once on a GPU node, but there is a dependency order. This is the order confirmed by the actual init container names of the pods.

Pod Init Container (Actual Name) Meaning
nvidia-operator-validator driver-validation → toolkit-validation → cuda-validation → plugin-validation It checks in order whether the driver is loaded, the toolkit is installed, the CUDA example runs, and the plugin advertises the device. Only when all of these pass does this container start.
nvidia-container-toolkit-daemonset driver-validation The toolkit is installed after waiting for the driver to be ready.
nvidia-device-plugin-daemonset, gpu-feature-discovery toolkit-validation(and config-manager-init) The plugin and GFD start only after toolkit verification is complete.
nvidia-dcgm-exporter (None, just this single container) It starts up without any separate waiting.

Therefore, if one stage is blocked, the subsequent pods remain at Init:0/1 , and the root of the problem lies in the earliest blocked stage. Diagnosis is performed from the front in the order of driver -> toolkit -> plugin .

The operator determines which DaemonSet to run on which node using node labels. If you check, every GPU node has the nvidia.com/gpu.deploy.driver, .container-toolkit, .device-plugin, .gpu-feature-discovery, .dcgm, .dcgm-exporter, .operator-validator, .node-status-exporter label attached as "true" , and each DaemonSet reads this label as a nodeSelector. If you want to turn off only one component on a specific node, you can change that node's corresponding label to false .

3. Is it required to have NVIDIA drivers on the host?

Yes, it is possible. Official documentation states that the default value of driver.enabled is true, toolkit.enabled and the default value of true and the operator installs the driver via a container (nvidia-driver-daemonset). Therefore, as long as the GPU-equipped node has an OS and a container runtime, the operator brings up the rest.

There are three configurations.

Configuration Helm 옵션 Driver Toolkit When to use
Operator manages everything Default Operator's driver container Operator When node OS is uniform and you want the operator to handle upgrades as well
Host driver only --set driver.enabled=false Pre-installed on host Operator When OSes are mixed or drivers are managed through a separate procedure (images, packages). The verification environment in this post uses this configuration
Both on host --set driver.enabled=false --set toolkit.enabled=false Host Host Pre-configured systems like DGX. The documentation notes that in this case, the default runtime should be set to nvidia specified

In the verified environment, ClusterPolicy is driver.enabled=false, toolkit.enabled=true, Device Plugin, GFD, and DCGM Exporter are enabled, MIG Manager is disabled, and as a result, nvidia-driver-daemonset was not created at all. Still, all validators passed and plugins on each GPU node are nvidia.com/gpu was advertised. In other words, the combination of "host driver + operator's toolkit, plugins, and metrics" actually works. At this time, the toolkit pod mounts the host root (/) and the driver installation path (/run/nvidia/driver), and before starting, checks whether the host driver is usable with driver-validation (Section 2).

When the host driver already exists and driver.enabled is not turned off, there is a description of automatic detection in the official documentation. It states that if the driver pod's init container detects a pre-installed driver, it labels the node to terminate the driver pod and does not schedule it again (this is based on reading the documentation and was not tested in this environment, unmeasured). Still, to make the intent clear, it is better to explicitly specify the configuration.

Cost of the driver container approach.

Cost of the host driver approach. The operator does not manage the lifecycle (upgrade, replacement) of the host driver. Instead, node OSes can be mixed, and the driver replacement procedure can be controlled using the team's existing methods (images, package management).

4. Until a pod receives a GPU

This is the flow after installation is complete.

  1. The device plugin registers with kubeletand passes the list of devices.
  2. Kubelet updates the node status capacity and allocatable .). The scheduler only looks at this number, not the device. It is an integer.nvidia.com/gpu: N).
  3. The scheduler only looks at this number, not the device. It is an integer.). The scheduler only looks at this number, not the device. It is an integer.NodeResourcesFit. The scheduler only looks at this number, not the device. It is an integer. limits . The scheduler only looks at this number, not the device. It is an integer.requests . The scheduler only looks at this number, not the device. It is an integer.
  4. kubelet calls Allocate , and receives device nodes, environment variables, mounts, and CDI names in response., and receives device nodes, environment variables, mounts, and CDI names in response.
  5. The container runtime injects the devices.. Starting with Operator 25.10.0, CDI (Container Device Interface) is the default, and regular workloads do not need runtimeClassName . Starting with Operator 25.10.0, CDI (Container Device Interface) is the default, and regular workloads do not need

If the connection to the plugin is lost, kubelet marks the device as unhealthy, drops allocatable to 0, and clears the resource name after a 5-minute grace period (described in kubelet source code). Therefore, even if the " " events are the same, the cause could be anywhere from the plugin, toolkit, driver, to scheduling constraints.Insufficient nvidia.com/gpu" events are the same, the cause could be anywhere from the plugin, toolkit, driver, to scheduling constraints.

5. Read-only commands for direct verification

# 오퍼레이터가 올린 파드와 노드별 분포
kubectl -n gpu-operator get deploy,ds
kubectl -n gpu-operator get po -o wide

# 오퍼레이터가 어떤 구성요소를 켰는가(ClusterPolicy)
kubectl get clusterpolicy -o jsonpath='{.items[0].spec.driver.enabled} {.items[0].spec.toolkit.enabled}{"\n"}'

# 노드별 GPU 광고량과 GPU 라벨
kubectl get nodes -o custom-columns=N:.metadata.name,CAP:.status.capacity.nvidia\.com/gpu,ALLOC:.status.allocatable.nvidia\.com/gpu
kubectl get nodes -L nvidia.com/gpu.present,nvidia.com/gpu.product

# 어떤 노드에 어떤 구성요소를 띄우도록 라벨이 붙었는가
kubectl get node <노드> -o json | grep -o 'nvidia.com/gpu.deploy[^,]*'

# 검증기가 막힌 곳(초기화 컨테이너 이름이 막힌 단계)
kubectl -n gpu-operator describe po -l app=nvidia-operator-validator | grep -A2 -i "init containers"

6. Common Misconceptions

Verified Versions and Dates, and Unverified Items

The environment reviewed on 2026-10-07 consists of GPU Operator v26.3.3, Container Toolkit v1.19.1, Device Plugin v0.19.3, NFD v0.18.3, and DCGM Exporter 4.5.3-4.8.2 (distroless image). The official documentation was reviewed by opening the installation guide and overview pages.

References

Sign in to like

Comments

No comments yet.

Sign in to leave a comment