After the kube-scheduler decides where to place a pod, the kubelet takes over.

Here's the full workflow:

  1. kube-apiserver receives a request to create a new pod (from kubectl, a controller, etc.)
  2. kube-scheduler notices the unscheduled pod and decides which node should run it
  3. kube-scheduler updates the pod definition with the chosen node name (nodeName field) via the API server
  4. kubelet on the selected node is constantly watching the API server for pods assigned to its node
  5. kubelet sees the new pod assignment and takes responsibility for creating it
  6. kubelet instructs the container runtime (Docker, containerd, etc.) to pull the required images and start the containers
  7. kubelet continuously monitors the pod's containers and reports status back to the API server

The kubelet is like the "node manager" - it's an agent running on every node in the cluster that:

So to directly answer your question: the kubelet follows up on the scheduler's decision and does the actual work of creating pods on its node, using the container runtime as the final executor.