Kubernetes: Creating a Static Pod

kind static pod Kubernetes Pod

3 min read | by Jordi Prats

Static pods are managed directly by the kubelet without relying on the Kubernetes API server. Unlike regular pods, static pods are defined as manifest files placed in a specific directory on the node.

Since static pods are bound to a specific node, they are suffixed with the node hostname in the pod name. In this post, we will create a static pod in a kind cluster by mounting a directory from the host to the kubelet's static pod directory.

First we'll have to create a file with the static pod definition, then we'll create a kind cluster with a configuration that mounts the directory containing the static pod manifest.

apiVersion: v1
kind: Pod
metadata:
  name: demo-static-pod
  namespace: kube-system
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

We need to add this file to the /etc/kubernetes/manifests directory on the node that we want it to run. To do this in a kind cluster, we can mount a directory from the host to the control plane node:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraMounts:
      - hostPath: /Users/jordiprats/tmp/kind-static
        containerPath: /etc/kubernetes/manifests

We can not create the cluster using:

kind create cluster -n static --config static-kind.yaml

Once created, we can check if the pod is running in the kube-system namespace:

$ kubectl get pods -n kube-system
NAME                                           READY   STATUS    RESTARTS   AGE
coredns-668d6bf9bc-6d4g6                       1/1     Running   0          24s
coredns-668d6bf9bc-776l6                       1/1     Running   0          24s
demo-static-pod-static-control-plane           1/1     Running   0          34s
etcd-static-control-plane                      1/1     Running   0          31s
kindnet-rlljv                                  1/1     Running   0          24s
kube-apiserver-static-control-plane            1/1     Running   0          31s
kube-controller-manager-static-control-plane   1/1     Running   0          31s
kube-proxy-h2ktn                               1/1     Running   0          24s
kube-scheduler-static-control-plane            1/1     Running   0          31s

As you can see, the Pod name is suffixed with the node hostname, in this case static-control-plane. In addition, the Pod definition will contain additional annotations and a owner reference to the node:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/config.hash: e316cce1f609de50dda0b065f293a8e1
    kubernetes.io/config.mirror: e316cce1f609de50dda0b065f293a8e1
    kubernetes.io/config.seen: "2025-02-15T16:17:52.340240888Z"
    kubernetes.io/config.source: file
  creationTimestamp: "2025-02-15T16:18:40Z"
  name: demo-static-pod-static-control-plane
  namespace: kube-system
  ownerReferences:
  - apiVersion: v1
    controller: true
    kind: Node
    name: static-control-plane
    uid: 4c700dd7-c4e7-4042-8be8-ac4f70ff7313
  resourceVersion: "548"
  uid: 9818e55d-84ca-478a-9d23-a27d804ec7ea
spec:
(...)

Posted on 24/02/2025

Categories