100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace

How Does the Kubernetes Scheduler Assign Pods to Nodes?

Learn how the Kubernetes scheduler filters and scores nodes, and how taints, tolerations, and affinity rules shape Pod placement.

mediumQ62 of 224 in DevOps Est. time: 6 minsLast updated:
Open Code Lab

Expected Interview Answer

The Kubernetes scheduler watches for Pods with no assigned node, filters out nodes that cannot satisfy the Pod’s requirements, scores the remaining nodes, and binds the Pod to the highest-scoring node — without ever running the Pod itself.

The scheduler runs a two-phase algorithm: filtering (predicates) eliminates nodes that fail hard constraints such as insufficient CPU/memory requests, node selectors, taints without matching tolerations, or affinity/anti-affinity rules, and scoring (priorities) ranks the surviving nodes using weighted functions like resource balance, spreading Pods across zones, and image locality. The highest-scoring node wins, and the scheduler writes that binding decision back to the API server as an update to the Pod’s spec.nodeName field; it never contacts the node directly. The kubelet on that node is what then actually pulls images and starts containers. Taints on nodes and tolerations on Pods work together to repel Pods from nodes unless explicitly tolerated, which is how dedicated node pools (e.g. GPU nodes) are protected from unrelated workloads, while affinity/anti-affinity rules pull Pods toward or away from other Pods or nodes based on labels.

  • Efficiently packs workloads based on real resource requests
  • Respects hard constraints like taints, tolerations, and node selectors
  • Spreads replicas across zones/nodes for resilience via anti-affinity
  • Decouples placement decisions from actual container execution

AI Mentor Explanation

The scheduler is like a team selector deciding which net a new trainee practices in. First it filters out nets that are already fully booked or reserved for fast bowlers only when the trainee is a spinner (hard constraints). Among the remaining nets, it scores each by how close they are to the trainee’s usual coach and how evenly practice load is spread across all nets, then assigns the trainee to the best-scoring net. The selector never personally supervises the practice session — that job belongs to the net’s own coach, just as the kubelet runs the actual workload.

Step-by-Step Explanation

  1. Step 1

    Detect unscheduled Pods

    The scheduler watches the API server for Pods with an empty spec.nodeName.

  2. Step 2

    Filter nodes

    Predicates eliminate nodes failing hard constraints: resources, taints/tolerations, selectors, affinity rules.

  3. Step 3

    Score remaining nodes

    Priority functions rank surviving nodes by resource balance, spreading, and image locality.

  4. Step 4

    Bind the Pod

    The scheduler writes the winning node into the Pod spec via the API server; the kubelet there starts the containers.

What Interviewer Expects

  • Understanding the two-phase filter-then-score algorithm
  • Knowledge of taints/tolerations vs affinity/anti-affinity as different mechanisms
  • Awareness that the scheduler only decides placement, never runs containers
  • Ability to give a real example, like isolating GPU nodes with taints

Common Mistakes

  • Confusing taints/tolerations (repel) with affinity (attract)
  • Thinking the scheduler executes or monitors the running Pod
  • Forgetting resource requests (not limits) drive the filtering decision
  • Ignoring that scheduling can fail and leave a Pod stuck Pending

Best Answer (HR Friendly)

The scheduler’s job is purely to decide placement — for every new workload, it looks at all the available machines, rules out any that cannot meet the requirements, ranks the rest by how good a fit they are, and picks the best one. It never actually runs anything itself; it just makes the placement decision and hands it off.

Code Example

Taint a GPU node and tolerate it from a Pod
# Taint applied to the node (kubectl taint nodes gpu-node-1 workload=gpu:NoSchedule)
apiVersion: v1
kind: Pod
metadata:
  name: gpu-training-job
spec:
  tolerations:
    - key: "workload"
      operator: "Equal"
      value: "gpu"
      effect: "NoSchedule"
  containers:
    - name: trainer
      image: ml-trainer:1.0
      resources:
        requests:
          nvidia.com/gpu: 1

Follow-up Questions

  • What happens when no node satisfies a Pod’s scheduling constraints?
  • What is the difference between node affinity and Pod anti-affinity?
  • How would you dedicate a set of nodes to a specific team’s workloads?
  • What is a custom scheduler and when would you write one?

MCQ Practice

1. What are the two phases of the Kubernetes scheduling algorithm?

The scheduler first filters out ineligible nodes, then scores the remaining ones to pick the best fit.

2. What do taints and tolerations together control?

A taint repels Pods from a node unless the Pod has a matching toleration, commonly used to dedicate nodes to specific workloads.

3. Does the scheduler run or monitor the Pod after binding it to a node?

The scheduler only makes the placement decision; the kubelet on the chosen node actually starts and monitors the containers.

Flash Cards

What are the two scheduling phases?Filtering (hard constraints) then scoring (ranking eligible nodes).

What do taints do?Repel Pods from a node unless they have a matching toleration.

What does affinity do?Attracts or repels Pods toward/away from nodes or other Pods based on labels.

Does the scheduler run the Pod?No — it only decides placement; the kubelet executes it.

1 / 4

Continue Learning