After the kube-scheduler decides where to place a pod, the kubelet takes over.
Here's the full workflow:
- kube-apiserver receives a request to create a new pod (from kubectl, a controller, etc.)
- kube-scheduler notices the unscheduled pod and decides which node should run it
- kube-scheduler updates the pod definition with the chosen node name (
nodeName
field) via the API server - kubelet on the selected node is constantly watching the API server for pods assigned to its node
- kubelet sees the new pod assignment and takes responsibility for creating it
- kubelet instructs the container runtime (Docker, containerd, etc.) to pull the required images and start the containers
- 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:
- Ensures containers are running in a pod as expected
- Mounts volumes
- Downloads secrets
- Passes environment variables
- Reports node and pod status back to the control plane
- Performs liveness and readiness probes
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.