drained state and remains unavailable for scheduling until it’s undrained (resumed). Unlike Kubernetes node draining, which evicts running pods, Slurm draining doesn’t terminate running workloads. It only stops new jobs from being assigned to the node.
SUNK login nodes include built-in aliases for draining, undraining, and monitoring node states. These are available in every SUNK login node shell by default:
When nodes are drained automatically
Before you manually drain or undrain a node, it helps to understand the cases where SUNK drains nodes on its own and resolves them without user intervention. Two health-check systems are involved. SUNK runs Node Health Check (NHC) scripts in the job epilog, and a failed check drains the node. Separately, CoreWeave’s HPC Verification framework tests idle Nodes every hour, and a passing test is what returns an NHC-drained node to service. In some cases, CoreWeave’s services automatically drain, restart, recheck, and undrain the node with no action required from you. Nodes can also be drained in response to an underlying error or event, such as a failing prolog or epilog script. These cases can require troubleshooting to determine the underlying cause.Automatic undrain with health checks
When a drain reason includessunk:verify-undrain, SUNK automatically undrains the node after it passes the next hourly HPC Verification health check. No user action is required. If the node fails the health check, it remains drained and you must investigate the underlying issue.
This mechanism also applies when you manually drain a node. If you drain a node and include sunk:verify-undrain in the reason, SUNK automatically returns the node to service once it passes the next health check. This is useful when you want to temporarily remove a node from service and have it automatically return after CoreWeave’s health checks confirm the node is healthy.
For example, to drain a node and have it automatically undrain after a passing health check:
drained state, you can identify the drain reason to determine whether you need to take action. Outside the automated HPC Verification cycle, you can manually drain a node if you need to temporarily prevent it from accepting new jobs, such as during maintenance, and manually undrain the node to return it to service.
CoreWeave’s documentation also includes an overview of Slurm node states, and further information about nodes in the INVAL state.
Connect to the Slurm login pod
To drain and undrain nodes, first connect to the Slurm login pod. After connecting to the Slurm login node, you can use the built-in aliases andscontrol commands in the following sections to examine and manage drained nodes.
Identify the drain reason
Before deciding whether to undrain a node, check the drain reason so you know whether the node is recovering automatically or requires manual intervention. To find out why a node is in a drain state, use thescontrol show node command:
[NODE-NAME] with the actual name of the node you want to check, or remove the [NODE-NAME] entirely to list all nodes.
The output of these commands shows a reason for the node’s drain state. Based on the reason listed, you can determine whether the drained state is due to a Kubernetes event or a Slurm issue and proceed accordingly.
An asterisk
* alongside a node state indicates that the node isn’t responding. Nodes in a drain* or down* state have been removed from the cluster and can be ignored. You can see this suffix if you check the state while the pod isn’t yet fully connected.Aliases for node monitoring
CoreWeave provides several built-in aliases as part of the SUNK login node image for monitoring node states. These are available in every login node shell session. Thesn alias runs scontrol show node:
dl alias lists all nodes in drain and idle state, along with the reason:
dl alias is equivalent to:
dld alias lists all nodes in drain state (including those actively draining with running jobs):
sinfo -R isn’t an alias, but it works on any Slurm cluster. It lists every node in the down, drained, fail, or failing state with its reason:
Manually drain a Slurm node
Generally, SUNK automatically drains Slurm nodes when it finds an issue. If you plan to perform maintenance on a node or want to temporarily remove it from service, you can drain it manually. The simplest way to drain a node is with the built-indrain alias:
drain alias automatically prefixes the reason with your username, resulting in a drain reason in the following format. Replace [USERNAME] with your username and [REASON] with the reason you provide.
sunk:verify-undrain in the reason:
scontrol update directly:
[NODE-NAME] with the name of the node you’re draining.
Manually undrain a Slurm node
SUNK automatically undrains drained nodes withsunk:verify-undrain listed in the drain reason after they pass the next hourly HPC Verification health check, with no user action required. You can manually undrain these nodes if you don’t want to wait for the automation to undrain them.
If you manually drained the node and have already corrected any underlying issues, you can manually undrain the node at your discretion.
Undrain a single node
The simplest way to undrain a node is with the built-inundrain alias:
scontrol update directly to change the node state to resume:
[NODE-NAME] with the name of the node you’re undraining.
Monitor the node after undraining it. If the issue that caused the automatic drain persists, SUNK can automatically drain the node again the next time it attempts to run a job.
Undrain all drained nodes
To undrain all nodes currently in adrain or idle state, use the following command:
dl alias.
Undrain nodes by reason
Usegrep to undrain nodes that have been drained for a specific reason. Before you undrain nodes in this manner, confirm which nodes the script processes:
scheduler: k8s pod deletion timeout for job listed in the drain reason:
dl alias.
Common drain reasons
Drain reasons fall into a few groups by source: Kubernetes events (k8s:), Node Health Check failures (NHC:), prolog and epilog failures, and system conditions. Two quick rules cover most cases:
- A reason starting with
k8s:comes from a Kubernetes-related event, such as a node update. These are often temporary and resolve automatically. - A reason containing
sunk:verify-undrainmeans SUNK returns the node to service automatically after it passes the next hourly HPC Verification health check, which runs only while the node is idle. If the node fails the check, or never goes idle, it stays drained and needs investigation. You can view the health-check output in the Node Details Grafana dashboard, or with thesnalias.
A drain reason of
k8s: pod scheduled for deletion: rolling update indicates that the node is waiting to update and doesn’t accept new jobs to avoid disrupting active work. This often appears on Slurm nodes when the Kubernetes NodeSet is updated. After the Compute pod restarts, Slurm undrains the node without any action needed from you.k8s nor sunk:verify-undrain usually means no automation returns the node to service. The reason alone doesn’t tell you where the fault is, because Kubernetes drains cover hardware failures too, and Slurm drains can come from a transient scheduler problem. Identify the reason in the sections below, fix the underlying problem, then undrain the node yourself.
Drains performed using the drain alias or scontrol have a manually-entered reason.
For drain reasons that come from a prolog or epilog script, see Troubleshoot Prolog and Epilog failures.
The following sections describe the reasons you’re most likely to see and how to tell a node-local problem from a cluster-wide one.
Kubernetes drain reasons
Kubernetes drains fall into two groups: routine node reorganization and failures that start an automated repair.Routine Kubernetes actions
These reasons appear when a node leaves the NodeSet’s feasible pool or when the NodeSet is scaled down or updated.
Any of these reasons can appear with or without further detail. If the reason also contains
cordon, the Kubernetes Node was cordoned, either by automated repair or by hand. See Kubernetes failure cases.
Kubernetes failure cases
Kubernetes failure cases are mostly hardware failures. When a Node condition fires, CoreWeave’s node controller cordons the Kubernetes Node and, depending on the condition, reboots it or moves it to triage. The SUNK syncer mirrors the cordon into Slurm as a drain, so the reason takes the formk8s: cordon: [CORDON-REASON] while the Compute pod is running, and k8s: pod terminated: cordon: [CORDON-REASON] after the pod is gone.
Don’t undrain these nodes manually. Most return to production on their own once the repair succeeds. The exceptions are the administrator-initiated reasons: AdminTemporaryFailure, AdminMaintenanceMode, and AdminPermanentFailure stay in place until someone clears them. If a node stays drained for any other reason, the repair didn’t succeed and the underlying fault needs investigation.
The cordon reason names the fault. For the full list, what each reason indicates, and whether CoreWeave’s automation reboots the Node or moves it to triage, see Health and lifecycle cordon reasons. One reason is specific to SUNK:
How long to wait for a Kubernetes repair
A repair has two phases, and only the second has a predictable duration. First, most transitions wait for the Kubernetes Node to become idle, and that wait has no timeout. It lasts as long as your jobs keep running on the Node. Second, once the Node is idle, CoreWeave either reboots it or moves it to triage. To tell which, read the Node’s lifecycle state. Replace[KUBERNETES-NODE-NAME] with the name of the Kubernetes Node that hosts the Slurm node’s Compute pod:
kubectl access to the cluster, look the Node up in the Node Details Grafana dashboard instead. Its Logs panel group merges the Node’s Kubernetes events, including the lifecycle transition events described in Node state transitions in CKS, and the Summary group shows the Node’s active alerts and HPC Verification status.
- A reboot state, such as
production-reboot,production-powerreset, orproduction-powercycle: The Node reboots, then runs a verification test before it returns toproductionand the drain clears. As a rule of thumb, allow about an hour after the Node goes idle. If the test fails, or the Node hasn’t returned after about three hours, CoreWeave moves it to triage. triage: The Node leaves your cluster for repair, and CKS delivers a replacement. The Slurm node doesn’t come back. Its reason becomesk8s: pod terminated, andscontrol show nodeshowsBootTime=NoneandSlurmdStartTime=None. The replacement joins Slurm as a new node.
production, contact support with the node name and the full drain reason.
Slurm drain reasons
Slurm drains come primarily from problems that occur while jobs are running. Most carrysunk:verify-undrain and clear on their own after the next passing health check. If a node stays drained, find out why it failed and couldn’t recover.
Node Health Check (NHC) drains
A reason beginning withNHC: means a Node Health Check found a hardware or system problem. NHC is the open-source Node Health Check tool. SUNK runs it as one of the scripts in the epilog chain after a job that held the whole node, and only if no other job step is still running there, which is why these drains appear after a job finishes. The text after NHC: names the failed check. Most NHC drains carry sunk:verify-undrain, so they clear automatically once the node passes the next HPC Verification test, which is a separate, hourly check that CoreWeave runs on idle Nodes. If a node fails the same check repeatedly, the hardware needs attention. To view the health-check output for a drained node, use the sn alias or the Node Details Grafana dashboard. For how the syncer decides that a node can be undrained, see NHC drain and HPC verification.
These checks cover node hardware that CoreWeave maintains, so most NHC drains resolve without you doing anything. If a node stays drained after repeated checks, contact CoreWeave support with the node name and the full drain reason.
Memory and CPU configuration mismatches
Low RealMemory, Low socket*core*thread count, and Low CPUs all mean that the resources slurmd reports no longer match what Slurm has configured for the node. Undraining doesn’t help, because the node re-drains as soon as slurmd reports the mismatched count again.
Slurm saves a node’s configuration when the node first registers, so a node whose resources change afterward usually also lands in the INVAL state. See Address nodes in the INVAL state for how to compare slurmd -C output against slurm.conf and restart the daemons.
For a Low RealMemory drain where the configuration can’t be reconciled, delete the node from Slurm so that it re-registers with its current configuration:
COMPLETING state, SUNK v6.8.0 and later marks it DOWN automatically through the cleanup-completing automation. You can then delete it. On earlier versions, mark the node down yourself before deleting it:
CPU topology mismatch from a statically pinned Pod
For the full explanation of which Pods pin CPU cores and how to configure them, see Static CPU allocation and the SUNK Pod Scheduler.slurmd drains a node when the CPU count the kernel reports is no longer divisible by the configured Slurm topology. The usual cause is a Pod with Guaranteed QoS and a whole-number CPU request landing on the node. Under the kubelet’s static CPU manager policy, which CKS Nodes enable by default, the kubelet pins that whole CPU exclusively to the Pod and removes it from the shared pool. As a result, slurmd detects one fewer CPU than configured, such as 127 instead of 128.
The slurmd logs on the affected node show the mismatch directly:
127hw on a node with 128 CPUs confirms that a statically pinned Pod claimed one CPU.
To resolve the mismatch, follow these steps:
- Describe the underlying Kubernetes Node and look under Non-terminated Pods for a Pod whose CPU requests and limits are equal integers, such as
1/1. - Change that workload to a non-integer CPU request, such as
900m, or to Burstable QoS by making its requests and limits differ. Either change excludes the Pod from kubelet’s static CPU manager. - Restart
slurmdon each drained node so that it re-reads the corrected CPU count. - Confirm the topology in the
slurmdlogs, then undrain the node.
slurmd startup line reports the full hardware count, and the match no Sockets and Resetting CPUs errors no longer appear:
CPUs= value matches the node’s hardware again, and Sockets, Cores, and Threads multiply to it, so the configured topology divides evenly.
If you undrain the node before you fix the offending Pod, it re-drains within seconds.
Mass drain versus isolated drain
Whether one node drained or many drained at once is a strong signal of where the problem originates. Usedl or sinfo -R to count how many nodes share a drain reason and roughly when they drained. The following rules of thumb are how CoreWeave support triages drains. They hold in most cases, but they aren’t guarantees:
- One node, with an
NHC:GPU, InfiniBand, or filesystem check: Treat it as a node-local issue and wait for the verify-undrain cycle. - Many nodes drained close together with the same InfiniBand or NCCL (NVIDIA Collective Communications Library) check: Suspect a shared fabric event, such as a leaf or spine switch, rather than many simultaneous independent hardware failures. Don’t mass-undrain to “fix” it, because that can mask an ongoing event. Open a support ticket and include the shared reason and the affected node list.
- Many nodes drained with
prolog pre-hook failed: A Kubernetes API server or syncer failure can fail every in-flight pre-hook call at once. These nodes are healthy and safe to undrain in bulk once the API server and syncer are healthy again. See Undrain nodes by reason. - All or most nodes drained at the same time, whatever the reason: Check for a Slurm controller restart or a control-plane event before you investigate individual nodes. These drains are safe to undrain once the controller and syncer are healthy.