docs(gpu-operator): add native-pod Talos reference manifests

Add reference manifests (not templates) under
packages/system/gpu-operator/examples/ documenting one working
configuration for running CUDA workloads directly in pods on a Talos
cluster, with DCGM metrics that drive the gpu/gpu-performance
dashboard.

- values-native-talos.yaml: Cozystack Package values that disable the
  sandbox path, enable the device plugin, and wire DCGM to the custom
  metrics ConfigMap.
- dcgm-custom-metrics.yaml: ConfigMap extending the default DCGM CSV
  with profiling, ECC, throttling and energy counters used by the
  dashboard and recording rules.
- nvidia-driver-compat.yaml: DaemonSet that stages libnvidia-ml.so.1
  and nvidia-smi from the Talos glibc tree into a location the
  gpu-operator validator inspects. Workaround for
  NVIDIA/gpu-operator#1687.
- README.md: explains why these are shipped as references rather than
  first-class templates (sandbox vs native is a deployment choice),
  and how the pieces connect.

The out-of-the-box values-talos.yaml still targets the sandbox (VFIO
passthrough) scenario. Operators who want native pod GPU workloads can
start from these references.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Arsolitt <arsolitt@gmail.com>
This commit is contained in:
Arsolitt 2026-04-17 16:56:03 +03:00
parent d1d19e9978
commit 5d6654c6f4
No known key found for this signature in database
GPG key ID: 4D8302CE6A9247C4
4 changed files with 268 additions and 0 deletions

View file

@ -0,0 +1,69 @@
# GPU operator — native pod workload on Talos (reference)
The files in this directory are **not** templates. They are reference
artifacts that document one working configuration for running GPU
workloads directly in pods on a Talos-based Cozystack cluster, together
with the DCGM metrics needed by the `gpu/gpu-performance` Grafana
dashboard.
The out-of-the-box `values-talos.yaml` for this package targets the
sandbox (VFIO passthrough to KubeVirt VMs) scenario. The files here
illustrate an alternative — running CUDA workloads in regular pods with
the NVIDIA device plugin — and the workarounds it currently requires on
Talos.
## Files
- [`values-native-talos.yaml`](./values-native-talos.yaml) — Cozystack
`Package` values that disable sandbox workloads, enable the device
plugin, point `hostPaths.driverInstallDir` at the staging location
used by the compat DaemonSet, and wire DCGM to the custom metrics
ConfigMap.
- [`dcgm-custom-metrics.yaml`](./dcgm-custom-metrics.yaml) — `ConfigMap`
with a DCGM metrics CSV that adds profiling, ECC, throttling and
energy counters on top of the upstream defaults. Required by the
recording rules in `packages/system/monitoring-agents/alerts/gpu-recording.rules.yaml`
and by several panels in the `gpu/gpu-performance` dashboard.
- [`nvidia-driver-compat.yaml`](./nvidia-driver-compat.yaml) — DaemonSet
that stages `libnvidia-ml.so.1` and `nvidia-smi` from the Talos glibc
tree into a path where the NVIDIA GPU Operator validator expects
them. See the "Why the compat DaemonSet exists" section below.
## Why these are reference, not templates
Shipping these as first-class templates would silently impose
assumptions that do not hold for every user:
- Whether the NVIDIA Talos system extension is installed on the nodes.
- Whether GPUs are exposed directly to pods or passed through to VMs.
- The exact path the installed driver ends up at (depends on the
extension version and Talos release).
The sandbox-oriented `values-talos.yaml` remains the default. Operators
who want native pod GPU workloads can start from this directory and
adapt as needed.
## Why the compat DaemonSet exists
The NVIDIA GPU Operator validator checks for `libnvidia-ml.so.1` and
`bin/nvidia-smi` in the path given by `hostPaths.driverInstallDir`.
Talos installs them under `/usr/local/glibc/usr/lib/` and
`/usr/local/bin/`, which the validator does not look at. Until upstream
addresses [NVIDIA/gpu-operator#1687][1], the DaemonSet copies those
files into a directory the validator does inspect and creates the
`.driver-ctr-ready` flag file so the validator proceeds.
[1]: https://github.com/NVIDIA/gpu-operator/issues/1687
## How the dashboard and recording rules fit in
- `dashboards/gpu/gpu-performance.json` expects `DCGM_FI_*` metrics,
including profiling series (`DCGM_FI_PROF_PIPE_TENSOR_ACTIVE`,
`DCGM_FI_PROF_GR_ENGINE_ACTIVE`) and throttling counters
(`DCGM_FI_DEV_POWER_VIOLATION`, `DCGM_FI_DEV_THERMAL_VIOLATION`).
These are only emitted when DCGM Exporter is started with the custom
CSV in `dcgm-custom-metrics.yaml`.
- `packages/system/monitoring-agents/alerts/gpu-recording.rules.yaml`
precomputes cluster-wide and per-namespace aggregations used by the
overview panels of the dashboard. The rules are safe to ship on any
cluster — they evaluate to empty series when DCGM is not scraped.

View file

@ -0,0 +1,82 @@
# Custom DCGM Exporter metrics CSV. Referenced from
# examples/values-native-talos.yaml via dcgmExporter.config.name.
#
# Extends the upstream default set with profiling counters, ECC, page
# retirement, row remap, energy and throttling violations — everything
# the gpu/gpu-performance dashboard and the GPU recording rules in
# monitoring-agents expect.
apiVersion: v1
kind: ConfigMap
metadata:
name: dcgm-custom-metrics
namespace: cozy-gpu-operator
data:
dcgm-metrics.csv: |
# Format
# If line starts with a '#' it is considered a comment
# DCGM FIELD, Prometheus metric type, help message
# Clocks
DCGM_FI_DEV_SM_CLOCK, gauge, SM clock frequency (in MHz).
DCGM_FI_DEV_MEM_CLOCK, gauge, Memory clock frequency (in MHz).
# Temperature
DCGM_FI_DEV_MEMORY_TEMP, gauge, Memory temperature (in C).
DCGM_FI_DEV_GPU_TEMP, gauge, GPU temperature (in C).
# Power
DCGM_FI_DEV_POWER_USAGE, gauge, Power draw (in W).
DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION, counter, Total energy consumption since boot (in mJ).
# PCIE
DCGM_FI_DEV_PCIE_REPLAY_COUNTER, counter, Total number of PCIe retries.
# Utilization (the sample period varies depending on the product)
DCGM_FI_DEV_GPU_UTIL, gauge, GPU utilization (in %).
DCGM_FI_DEV_MEM_COPY_UTIL, gauge, Memory utilization (in %).
DCGM_FI_DEV_ENC_UTIL, gauge, Encoder utilization (in %).
DCGM_FI_DEV_DEC_UTIL, gauge, Decoder utilization (in %).
# Errors and violations
DCGM_FI_DEV_XID_ERRORS, gauge, Value of the last XID error encountered.
# Memory usage
DCGM_FI_DEV_FB_FREE, gauge, Framebuffer memory free (in MiB).
DCGM_FI_DEV_FB_USED, gauge, Framebuffer memory used (in MiB).
DCGM_FI_DEV_FB_RESERVED, gauge, Framebuffer memory reserved (in MiB).
# ECC (supported on datacenter-class GPUs such as A10)
DCGM_FI_DEV_ECC_SBE_VOL_TOTAL, counter, Total number of single-bit volatile ECC errors.
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL, counter, Total number of double-bit volatile ECC errors.
DCGM_FI_DEV_ECC_SBE_AGG_TOTAL, counter, Total number of single-bit persistent ECC errors.
DCGM_FI_DEV_ECC_DBE_AGG_TOTAL, counter, Total number of double-bit persistent ECC errors.
# Retired pages
DCGM_FI_DEV_RETIRED_SBE, counter, Total number of retired pages due to single-bit errors.
DCGM_FI_DEV_RETIRED_DBE, counter, Total number of retired pages due to double-bit errors.
DCGM_FI_DEV_RETIRED_PENDING, counter, Total number of pages pending retirement.
# Row remapping (not applicable to GDDR6 but left for datacenter GPUs)
DCGM_FI_DEV_UNCORRECTABLE_REMAPPED_ROWS, counter, Number of remapped rows for uncorrectable errors.
DCGM_FI_DEV_CORRECTABLE_REMAPPED_ROWS, counter, Number of remapped rows for correctable errors.
DCGM_FI_DEV_ROW_REMAP_FAILURE, gauge, Whether remapping of rows has failed.
# Throttle / violation counters (crucial for SLA and tenant monitoring)
DCGM_FI_DEV_POWER_VIOLATION, counter, Throttling duration due to power constraints (in us).
DCGM_FI_DEV_THERMAL_VIOLATION, counter, Throttling duration due to thermal constraints (in us).
DCGM_FI_DEV_SYNC_BOOST_VIOLATION, counter, Throttling duration due to sync-boost constraints (in us).
DCGM_FI_DEV_BOARD_LIMIT_VIOLATION, counter, Throttling duration due to board limit constraints (in us).
DCGM_FI_DEV_LOW_UTIL_VIOLATION, counter, Throttling duration due to low utilization (in us).
DCGM_FI_DEV_RELIABILITY_VIOLATION, counter, Throttling duration due to reliability constraints (in us).
# NVLink — enable only for GPUs that actually have NVLink (A10 has none).
# DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL, counter, Total number of NVLink bandwidth counters for all lanes.
# DCP (profiling) metrics — supported from Ampere onwards.
DCGM_FI_PROF_GR_ENGINE_ACTIVE, gauge, Ratio of time the graphics engine is active.
DCGM_FI_PROF_SM_ACTIVE, gauge, The ratio of cycles an SM has at least 1 warp assigned.
DCGM_FI_PROF_SM_OCCUPANCY, gauge, The ratio of number of warps resident on an SM.
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE, gauge, Ratio of cycles the tensor (HMMA) pipe is active.
DCGM_FI_PROF_DRAM_ACTIVE, gauge, Ratio of cycles the device memory interface is active sending or receiving data.
DCGM_FI_PROF_PCIE_TX_BYTES, counter, The number of bytes of active PCIe tx (transmit) data including both header and payload.
DCGM_FI_PROF_PCIE_RX_BYTES, counter, The number of bytes of active PCIe rx (read) data including both header and payload.

View file

@ -0,0 +1,72 @@
# Workaround for https://github.com/NVIDIA/gpu-operator/issues/1687
#
# On Talos, the NVIDIA system extension installs driver files under
# /usr/local/glibc/usr/lib/ and /usr/local/bin/. The GPU Operator
# validator only looks for libnvidia-ml.so.1 and bin/nvidia-smi under
# the path configured as hostPaths.driverInstallDir. This DaemonSet
# stages the required files into /var/nvidia-driver on each node and
# creates the .driver-ctr-ready flag so the validator proceeds.
#
# Paired with examples/values-native-talos.yaml, which sets
# hostPaths.driverInstallDir to /var/nvidia-driver.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-driver-compat
namespace: cozy-gpu-operator
labels:
app: nvidia-driver-compat
spec:
selector:
matchLabels:
app: nvidia-driver-compat
template:
metadata:
labels:
app: nvidia-driver-compat
spec:
hostPID: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
initContainers:
- name: create-driver-tree
image: busybox:1.37
command:
- sh
- -c
- |
set -e
GLIBC_LIB="/host/usr/local/glibc/usr/lib"
SRC_BIN="/host/usr/local/bin"
DST="/host/var/nvidia-driver"
mkdir -p "$DST/bin"
if [ -f "$GLIBC_LIB/libnvidia-ml.so.1" ]; then
cp -f "$GLIBC_LIB/libnvidia-ml.so.1" "$DST/libnvidia-ml.so.1"
echo "Copied libnvidia-ml.so.1"
fi
if [ -f "$SRC_BIN/nvidia-smi" ]; then
cp -f "$SRC_BIN/nvidia-smi" "$DST/bin/nvidia-smi"
chmod +x "$DST/bin/nvidia-smi"
echo "Copied nvidia-smi"
fi
mkdir -p /host/run/nvidia/validations
touch /host/run/nvidia/validations/.driver-ctr-ready
echo "Created driver-ctr-ready flag"
echo "Done"
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
containers:
- name: pause
image: registry.k8s.io/pause:3.10
volumes:
- name: host-root
hostPath:
path: /

View file

@ -0,0 +1,45 @@
# Cozystack Package values for running GPU workloads natively in pods
# on Talos. This is the counterpart to values-talos.yaml, which targets
# the sandbox (VFIO passthrough) scenario.
#
# Prerequisites:
# - NVIDIA Talos system extension installed on GPU nodes.
# - examples/nvidia-driver-compat.yaml deployed to stage driver files
# where the gpu-operator validator looks for them.
# - examples/dcgm-custom-metrics.yaml applied so DCGM Exporter exports
# the full set of metrics used by the dashboard and recording rules.
apiVersion: cozystack.io/v1alpha1
kind: Package
metadata:
name: cozystack.gpu-operator
spec:
variant: default
components:
gpu-operator:
values:
gpu-operator:
# The compat DaemonSet stages libnvidia-ml.so.1 and nvidia-smi
# under /var/nvidia-driver. Point the validator at that path.
hostPaths:
driverInstallDir: "/var/nvidia-driver"
# Disable the sandbox path — workloads run in pods, not VMs.
sandboxWorkloads:
enabled: false
vfioManager:
enabled: false
# The Talos extension provides the driver and runtime hooks,
# so the operator's own toolkit and driver components must be
# switched off to avoid conflicting installations.
toolkit:
enabled: false
devicePlugin:
enabled: true
# Export full set of DCGM metrics using the ConfigMap in
# examples/dcgm-custom-metrics.yaml.
dcgmExporter:
serviceMonitor:
enabled: true
interval: "15s"
honorLabels: true
config:
name: dcgm-custom-metrics