Manual scheduling
nodeName, and what to do when no scheduler runs.
In plain terms
Manual scheduling is walking past the host and sitting yourself at a specific table. Handy when the host is out sick — but you’ve skipped every check they would have done for you.
You can bypass the scheduler entirely by setting nodeName in the pod spec — the kubelet on that node simply runs the pod. It is rare in production, but essential to understand: it is what static pods do, and it is your fallback when the scheduler itself is down.
pod.yaml
apiVersion: v1kind: Podmetadata: { name: web }spec:nodeName: node-2 # skip the scheduler; the kubelet just runs itcontainers: [{ name: app, image: nginx }]
With no scheduler running, every new pod stays Pending forever because nothing assigns it a node — and setting nodeName by hand is the workaround. This is a favorite exam scenario: “the scheduler is broken, get this pod running anyway.”
nodeName skips every check
Manual scheduling ignores taints, affinity, and even resource fit — the kubelet will try to run the pod regardless. Use it deliberately, not as a habit.