Your pod has just been written to etcd. The API server returned 201 Created . The pod exists. But spec.nodeName is still empty, and that is the entire reason this post exists. A pod with no node is not a real workload. It is a row in a database. Something has to look at it, decide which machine should run it, and atomically claim that machine. That something is kube-scheduler , and the way it makes the decision is more interesting than "pick the node with the most free CPU." There are thirteen separate stages in modern scheduling. The Filter stage alone runs fourteen in-tree plugins, each one capable of disqualifying a candidate node with a single Unschedulable verdict. There is no appeal, no second chance, no "best effort." Either every plugin says yes, or that node is out. This post walks every stage end-to-end against the v1.36 source code, with verbatim outputs from a real cluster at the bottom. %[ https://youtu.be/N-dDSCVWdqU ] TL;DR, the 13 stages PreEnqueue.…