Static pods
Pods the kubelet runs directly, without the API.
In plain terms
A static pod runs straight from a note pinned to the node’s fridge — no manager involved. It’s how the control plane starts itself up before the manager even exists.
No API server, scheduler, or controller is involved — this is how kubeadm bootstraps the control plane.
A static pod is one the kubelet runs directly from a manifest file on the node — no API server, no scheduler, no controller involved. The kubelet watches a directory (default /etc/kubernetes/manifests) and runs whatever pod specs it finds there, restarting them if they exit.
terminal
$ ls /etc/kubernetes/manifests/etcd.yaml kube-apiserver.yamlkube-scheduler.yaml kube-controller-manager.yaml# the watched directory is set in the kubelet config:$ grep staticPodPath /var/lib/kubelet/config.yamlstaticPodPath: /etc/kubernetes/manifests
This is exactly how kubeadm bootstraps a control plane: the components ARE static pods. It solves a chicken-and-egg problem — the API server cannot schedule itself, so the kubelet runs it from a file. The API server shows a read-only mirror pod so you can see it, but you manage it by editing the manifest.
Edit the file, not the mirror
kubectl delete on a static pod’s mirror does nothing lasting — the kubelet recreates it immediately. Change the manifest on disk to change a static pod.