Create static Pods
Static Pods are managed directly by the kubelet daemon on a specific node, without the API server observing them. Unlike Pods that are managed by the control plane (for example, a Deployment); instead, the kubelet watches each static Pod (and restarts it if it fails).
Static Pods are always bound to one Kubelet on a specific node.
The kubelet automatically tries to create a mirror Pod on the Kubernetes API server for each static Pod. This means that the Pods running on a node are visible on the API server, but cannot be controlled from there. The Pod names will be suffixed with the node hostname with a leading hyphen.
spec
of a static Pod cannot refer to other API objects
(e.g., ServiceAccount,
ConfigMap,
Secret, etc).
Before you begin
You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes that are not acting as control plane hosts. If you do not already have a cluster, you can create one by using minikube or you can use one of these Kubernetes playgrounds:
To check the version, enterkubectl version
.
This page assumes you're using
You can configure a static Pod with either a file system hosted configuration file or a web hosted configuration file. Manifests are standard Pod definitions in JSON or YAML format in a specific directory. Use the For example, this is how to start a simple web server as a static Pod: Choose a node where you want to run the static Pod. In this example, it's Choose a directory, say Configure your kubelet on the node to use this directory by running it with or add the Restart the kubelet. On Fedora, you would run: Kubelet periodically downloads a file specified by To use this approach: Create a YAML file and store it on a web server so that you can pass the URL of that file to the kubelet. Configure the kubelet on your selected node to use this web manifest by running it with Restart the kubelet. On Fedora, you would run: When the kubelet starts, it automatically starts all defined static Pods. As you have
defined a static Pod and restarted the kubelet, the new static Pod should
already be running. You can view running containers (including static Pods) by running (on the node): The output might be something like: You can see the mirror Pod on the API server: Labels from the static Pod are
propagated into the mirror Pod. You can use those labels as normal via
selectors, etc. If you try to use You can see that the Pod is still running: Back on your node where the kubelet is running, you can try to stop the container manually.
You'll see that, after a time, the kubelet will notice and will restart the Pod
automatically: The running kubelet periodically scans the configured directory (Create a static pod
Filesystem-hosted static Pod manifest
staticPodPath: <the directory>
field in the
kubelet configuration file,
which periodically scans the directory and creates/deletes static Pods as YAML/JSON files appear/disappear there.
Note that the kubelet will ignore files starting with dots when scanning the specified directory.
my-node1
.ssh my-node1
/etc/kubelet.d
and place a web server Pod definition there, for example /etc/kubelet.d/static-web.yaml
:# Run this command on the node where kubelet is running
mkdir /etc/kubelet.d/
cat <<EOF >/etc/kubelet.d/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
EOF
--pod-manifest-path=/etc/kubelet.d/
argument. On Fedora edit /etc/kubernetes/kubelet
to include this line:KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --pod-manifest-path=/etc/kubelet.d/"
staticPodPath: <the directory>
field in the
kubelet configuration file.# Run this command on the node where the kubelet is running
systemctl restart kubelet
Web-hosted static pod manifest
--manifest-url=<URL>
argument
and interprets it as a JSON/YAML file that contains Pod definitions.
Similar to how filesystem-hosted manifests work, the kubelet
refetches the manifest on a schedule. If there are changes to the list of static
Pods, the kubelet applies them.
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
--manifest-url=<manifest-url>
. On Fedora, edit /etc/kubernetes/kubelet
to include this line:KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --manifest-url=<manifest-url>"
# Run this command on the node where the kubelet is running
systemctl restart kubelet
Observe static pod behavior
# Run this command on the node where the kubelet is running
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
129fd7d382018 docker.io/library/nginx@sha256:... 11 minutes ago Running web 0 34533c6729106
crictl
outputs the image URI and SHA-256 checksum. NAME
will look more like:
docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
.
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web 1/1 Running 0 2m
kubectl
to delete the mirror Pod from the API server,
the kubelet doesn't remove the static Pod:kubectl delete pod static-web
pod "static-web" deleted
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web 1/1 Running 0 4s
# Run these commands on the node where the kubelet is running
crictl stop 129fd7d382018 # replace with the ID of your container
sleep 20
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
89db4553e1eeb docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106
Dynamic addition and removal of static pods
/etc/kubelet.d
in our example) for changes and adds/removes Pods as files appear/disappear in this directory.# This assumes you are using filesystem-hosted static Pod configuration
# Run these commands on the node where the kubelet is running
#
mv /etc/kubelet.d/static-web.yaml /tmp
sleep 20
crictl ps
# You see that no nginx container is running
mv /tmp/static-web.yaml /etc/kubelet.d/
sleep 20
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
f427638871c35 docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106