kubectl describe pod [POD-NAME] -n [NAMESPACE] to see the admission message, and squeue -u root to find the placeholder Slurm job. Common fixes: right-size requests to fit below the node’s Kubernetes-allocatable capacity, set sunk.coreweave.com/exclusive to a valid value, and don’t use exclusive: "ok" for GPU Pods.
This article helps you diagnose Kubernetes Pods that fail to start or behave unexpectedly under the SUNK Pod Scheduler. Use it when a Pod with your SUNK schedulerName is stuck, gets rejected right after scheduling, or appears briefly and vanishes.
For how the scheduler works and how to configure a Pod, see Schedule Kubernetes Pods with the SUNK Pod Scheduler. This article assumes that setup and focuses on failures.
What you see
Match your symptom to the section that follows:- The Pod is rejected with
OutOfcpuorOutOfmemoryright after it lands on a node: see OutOfcpu or OutOfmemory after scheduling. - The Pod appears briefly, then disappears, and events mention an invalid exclusive value: see Invalid exclusive value.
- A GPU Pod collides with a Slurm job over GPUs: see GPU double allocation.
- Pods spread across nodes and leave GPUs stranded during scale-up: see Fragmentation under scale-up.
- A multi-volume Pod (such as a LeaderWorkerSet) stays in
ContainerCreatingand reports no events: see Duplicate volume declarations.
How a SUNK-scheduled Pod works
When a Pod sets your SUNKschedulerName, the SUNK Pod Scheduler creates a placeholder Slurm job for it. Slurm determines node placement, GPU allocation, and resource tracking. Kubernetes then runs the Pod on the chosen node. Failures usually come from the two systems accounting for resources independently.
To map a Pod back to its placeholder Slurm job, list the queue with the job name and submitting user shown:
[NAMESPACE]/[POD-NAME], so the NAME column maps a job back to its Pod directly.
The SUNK Pod Scheduler submits placeholder jobs, not you. Unless the Pod sets sunk.coreweave.com/user-id, the job is submitted as root, so you can also filter with squeue -u root. If your Pods do set user-id, filter on that user instead.
To view the Pod’s admission and scheduling messages, describe the Pod:
OutOfcpu or OutOfmemory after scheduling
Slurm admits the Pod and places it on a node, then the kubelet rejects it withOutOfcpu, OutOfmemory, or UnexpectedAdmissionError.
What this means. Slurm and Kubernetes count resources independently, so Slurm can pick a node that looks free to it but whose Kubernetes-allocatable capacity is already partly spent on system Pods and the slurmd container. The kubelet then rejects the Pod on its own admission check.
What to do. Right-size the Pod’s requests so they fit below the node’s Kubernetes-allocatable capacity, and make Slurm memory-aware.
Check what slurmd actually requests before you try to lower it. On current SUNK versions, enabling the Pod Scheduler applies a low-profile overlay that sets slurmd requests to 10 CPU and 10Gi and leaves its limits untouched, whatever compute.lowProfileRequests is set to. If your cluster already shows those values, the headroom is there and the Pod’s own requests are what need to change.
For the full procedure and examples, see Reserve resources for system Pods.
Invalid exclusive value
The Pod appears for a moment, then disappears, and events or scheduler logs reportSlurmJobSubmitFailed with an invalid exclusive value.
What this means. On SUNK v5.7.0 and later, the sunk.coreweave.com/exclusive annotation accepts only a fixed set of string values ("none", "ok", "user", "mcs", "topo"). Any other non-empty value makes the placeholder Slurm job submission fail, so the Pod never runs. The usual culprits are a typo and the boolean "true" that older SUNK versions accepted. An annotation set to an empty string is ignored rather than rejected, and the Pod submits with the partition’s own sharing setting.
What to do. Set sunk.coreweave.com/exclusive to one of the valid values. For the meaning of each value and when to use it, see Exclusive annotation values. Invalid values for other annotations also cause the Pod to fail scheduling.
GPU double allocation
A GPU Pod and a Slurm job each claim the same GPUs on a node. What this means. Slurm manages GPUs through GRES, which assigns specific GPU indices to each job. Settingexclusive: "ok" on a GPU Pod opens the node to any other job. That can collide with Slurm’s GRES accounting, leaving two workloads contending for the same physical GPUs.
What to do. For GPU Pods, never use exclusive: "ok". Use:
exclusive: "none"when the Pod uses all GPUs on the node (full-node isolation).exclusive: "user"with a dedicateduser-idwhen multiple Pods each use a subset of the node’s GPUs.
Fragmentation under scale-up
During autoscaling, Pods spread across partially used nodes and leave GPUs stranded. What this means. The SUNK Pod Scheduler doesn’t bin-pack. Slurm selects nodes by its internal ordering, which can spread Pods across several partially used nodes instead of filling one before moving to the next. Withexclusive: "user" or "none", a node holding even one Pod can block other users’ jobs, so unused GPUs on it become inaccessible.
What to do. This is a known limitation, not a misconfiguration. To reduce its impact:
- Consider a dedicated NodeSet for inference Pods so they don’t fragment training capacity.
- Plan exclusive mode with fragmentation in mind. See Scale-up and scale-down behavior.
Duplicate volume declarations
A multi-volume Pod, often part of a LeaderWorkerSet or a templated workload, stays inContainerCreating indefinitely and reports no events.
What this means. Declaring the same PersistentVolumeClaim (PVC) as two separate volume entries in one Pod spec can silently break subPath mounts. The kubelet fails to create the mount points but emits no Kubernetes event, so kubectl describe pod shows nothing and the CSI driver logs a successful attach. Slurm may also show the placeholder job submitting and canceling in a loop, sometimes with OutOfmemory errors from the retries. That is a symptom rather than the cause.
What to do:
-
Declare each PVC once in
volumes, then reference it with multiplevolumeMounts(usingsubPathfor distinct locations) rather than listing the PVC twice. Look for two entries underspec.volumesthat have differentnamevalues but the samepersistentVolumeClaim.claimName. -
Confirm the diagnosis in the kubelet’s logs for the node, because the Pod’s own events stay empty. Look for a line of this form:
What this is not
The following points clarify common misconceptions:OutOfcpuafter scheduling isn’t a Slurm bug. It’s the kubelet enforcing Kubernetes accounting that Slurm doesn’t share. The fix is right-sizing requests, not retrying.- The SUNK Pod Scheduler isn’t a gang scheduler. It schedules each Pod as a separate Slurm job and doesn’t support multi-node PodGroups. It’s best for single-node workloads such as inference.
- Kubernetes scheduling features (
podAffinity,podAntiAffinity,topologySpreadConstraints) aren’t honored. Slurm makes placement decisions. Node-level affinity such asgpu.nvidia.com/modelis honored.
When to file a support ticket
Open a support ticket in any of these situations:- Pods are rejected with
OutOfcpuorOutOfmemoryeven after you right-sized requests and made Slurm memory-aware. - Placeholder Slurm jobs are created but the corresponding Pods never run, and the exclusive value and other annotations are valid.
- GPU contention persists despite using
exclusive: "none"or"user"correctly.
kubectl describe pod, and squeue output showing the placeholder job (squeue -u root, unless your Pods set sunk.coreweave.com/user-id).
Related pages
- Schedule Kubernetes Pods with the SUNK Pod Scheduler: scheduler setup, annotations, and known limitations.
- Manage resources with the SUNK Pod Scheduler: exclusive values, GPU allocation, and system-Pod reservations.
- Static CPU allocation and the SUNK Pod Scheduler: Guaranteed-QoS CPU pinning that drains nodes.
- SUNK troubleshooting: all SUNK triage flows.