The scheduler is a controller too
The scheduler is not a special subsystem. It is a controller whose definition of correct is "every pod has a node assigned", and its reconciliation is to pick one and write it into the API.
It runs in two phases.
Filtering eliminates nodes that cannot host the pod: insufficient unreserved capacity, a taint the pod does not tolerate, a node selector that does not match, a required port already taken.
Scoring ranks the survivors, favouring nodes with more free room, nodes that already have the image cached, and spreading across failure domains.
The highest-scoring node wins and its name is written to the pod's spec. The scheduler then stops thinking about that pod entirely, and the kubelet on that node, watching for pods assigned to it, picks it up.
The crucial detail for everything that follows: filtering uses requests, not actual usage. A node running at 5% CPU whose pods have collectively requested all of its capacity is full as far as the scheduler is concerned. Capacity in Kubernetes means unrequested capacity, not idle capacity.

