NVSentinel Configuration Documentation

August 24, 2026 ยท View on GitHub

This directory contains technical configuration guides for NVSentinel operators and system administrators.

Global Configuration

Global settings apply across all NVSentinel modules and are configured under the global: section in the Helm values.

Image Configuration

Image tag for all NVSentinel modules.

global:
  image:
    tag: "main"

Dry Run Mode

Run all modules in dry-run mode where actions are logged but not executed.

global:
  dryRun: false

Metrics Port

Prometheus metrics port used by all modules.

global:
  metricsPort: 2112

Change Stream Resume Tokens

Watcher-based components persist change stream resume tokens so they can resume from the last processed event after a restart. To skip accumulated events and start from the current stream head, scale the component to zero, patch its key in the runtime resume-control ConfigMap from RESUME to CREATE, then restore its replicas. The component deletes only its own resume token, records a cold-start cutoff timestamp, skips startup cold-start recovery for that run, opens its watcher from the current stream head, and writes its key back to RESUME. Future restarts still run cold-start recovery, but only for records newer than the recorded cutoff.

Helm does not create the resume-control ConfigMap. Components create it at runtime if it is missing, so GitOps tools such as Argo CD do not revert operator patches to its data. When a component starts and its key is missing, it writes its key as RESUME; the ConfigMap therefore self-populates with explicit per-component state over time.

Example one-shot reset for node-drainer:

REPLICAS=$(kubectl -n nvsentinel get deployment node-drainer -o jsonpath='{.spec.replicas}')
kubectl -n nvsentinel scale deployment/node-drainer --replicas=0
kubectl -n nvsentinel rollout status deployment/node-drainer --timeout=180s
kubectl -n nvsentinel get configmap resume-control >/dev/null 2>&1 || \
  kubectl -n nvsentinel create configmap resume-control
kubectl -n nvsentinel patch configmap resume-control \
  --type merge \
  -p '{"data":{"node-drainer":"CREATE"}}'
kubectl -n nvsentinel scale deployment/node-drainer --replicas="${REPLICAS:-1}"
kubectl -n nvsentinel rollout status deployment/node-drainer --timeout=180s

This applies to fault-quarantine, node-drainer, fault-remediation, and health-events-analyzer.

Node Scheduling

Control where NVSentinel pods are scheduled.

global:
  # For GPU-bound pods (health monitors, metadata collector)
  nodeSelector: {}
  tolerations: []
  affinity: {}
  
  # For system pods (fault-quarantine, node-drainer etc)
  systemNodeSelector: {}
  systemNodeTolerations: []

Pod Priority

NVSentinel pods set no priorityClassName by default, so each takes the priority of the cluster's globalDefault PriorityClass if one is configured, and 0 otherwise. A pod can preempt another only when its own priority is higher, so on a saturated cluster the scheduler leaves these pods Pending rather than preempting a lower-priority workload, and a node can end up with no health monitor while the workload still reports healthy.

Assign a priority class to avoid that. The split matches the node-scheduling values above: priorityClassName covers the node-level agents (the health monitor, metadata collector and NIC health monitor DaemonSets, the preflight image cache, plus platform-connectors), systemPriorityClassName covers the control-plane components (labeler, health-events-analyzer, fault-quarantine, node-drainer etc).

global:
  priorityClassName: ""        # node-level agents (DaemonSets)
  systemPriorityClassName: ""  # control-plane components (Deployments)

Both default to empty, which leaves the field off the pod spec entirely and preserves the existing behaviour. Any component can also be set individually, and the global takes precedence when both are set, consistent with how tolerations behaves:

gpu-health-monitor:
  priorityClassName: my-gpu-agent-priority

The priority classes must already exist in the cluster. system-node-critical and system-cluster-critical are built in; anything else has to be created first.

A higher priority is necessary but not sufficient: preemption also needs an evictable lower-priority pod on a node that would then fit, and a class with preemptionPolicy: Never only improves queue order without evicting anything. Both built-in classes above preempt.

Image Pull Secrets

Credentials for pulling images from private registries.

global:
  imagePullSecrets: []

Tracing

Enable OpenTelemetry distributed tracing to get end-to-end visibility into health event processing across all modules.

global:
  tracing:
    enabled: false       # Enable/disable tracing for all components
    endpoint: ""         # OTLP gRPC address of your OpenTelemetry Collector (e.g., "alloy.observability.svc.cluster.local:4317")
    insecure: true       # Set to false if the collector endpoint uses TLS

For full details, see Distributed Tracing.

Audit logging

Enable file-based audit logs of HTTP write operations (POST, PUT, PATCH, DELETE) to the Kubernetes and CSP APIs, with rotation and optional request-body capture.

global:
  auditLogging:
    enabled: true
    logRequestBody: false
    maxSizeMB: 100
    maxBackups: 7
    maxAgeDays: 30
    compress: true

For full details, see Audit Logging.

Module-Specific Configuration

Each module has additional configuration options documented in its dedicated guide: