首页 / Kubernetes (k8s) 入门教程 / 静态 Pod

Kubernetes (k8s) 入门教程

静态 Pod

本教程共 65 篇 · 第 23 篇 · 更新于 2026-08-14 · 约 10 分钟阅读

Kubernetes静态PodkubeletstaticPodPath控制平面

本节目标:学完你能说清静态 Pod 和普通 Pod 的根本区别——它不经 API Server,直接由 kubelet 管,并知道它是怎么被用来托管控制平面组件的。

你前面见的 Pod,都是”写清单 → apiserver 收下 → 调度器安排 → kubelet 执行”。静态 Pod 走的是另一条路:它根本不进 apiserver,是节点上的 kubelet 自己看着本地文件起的。

23-1 什么是静态 Pod

静态 Pod(Static Pod)由特定节点上的 kubelet 守护进程直接管理,不经过 API Server。你不会用 kubectl apply 去创建它(虽然能用 kubectl 看)。

它就像 kubelet 的”私有家务”:kubelet 读到本地有个 Pod 清单,就把它跑起来;清单删了,Pod 就停。

Note

静态 Pod 永远绑定在”某一个节点”的 kubelet 上,不会在节点间迁移。这是它和普通 Pod 最大的不同。

23-2 kubelet 怎么管它

kubelet 的配置里有个字段 staticPodPath,指向一个目录。kubelet 定期扫描这个目录,把里面的 YAML/JSON 文件当成静态 Pod 清单。

目录里出现新文件 → 起 Pod;文件被删 → 停 Pod;文件改了 → 重建 Pod。

# kubelet 配置片段(kubelet-config.yaml)
staticPodPath: /etc/kubernetes/manifests

在 kubeadm 搭建的集群里,这个目录默认就是 /etc/kubernetes/manifests。你往里放文件,控制平面组件就起来了。

Warning

kubelet 扫描目录时会读取所有非点开头的文件,不看扩展名。备份清单千万别存 .yaml.backup 这种名字——它照样会被读,可能造成同名 Pod 定义冲突。备份请移到目录外。

23-3 两种创建方式

方式一:文件系统清单(最常用)。直接把 Pod 的 YAML 放进 staticPodPath 目录。

# /etc/kubernetes/manifests/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: my-web
spec:
  containers:
  - name: web
    image: nginx:1.27
    ports:
    - containerPort: 80

方式二:HTTP 托管。kubelet 也能配置从某个 HTTP 地址拉清单。适合集中下发配置的场景,但用得少。

23-4 怎么查看静态 Pod

虽然不经 apiserver 创建,但 kubelet 会镜像一个同名的 Pod 对象到 apiserver,好让你能用 kubectl 看到它。镜像对象只读,删它没用——得去节点上删源文件。

kubectl get pod
# static-web-node01   1/1   Running   ...

名字通常带节点后缀(如 static-web-node01),一眼能认出是静态 Pod。

kubectl describe pod static-web-node01
Tip

想改静态 Pod,直接编辑节点上的源 YAML 文件。kubelet 检测到变化会自动重建。用 kubectl edit 改那个镜像对象是不生效的。

23-5 典型用途

静态 Pod 最大的用处是自托管控制平面

你想:控制平面的组件(apiserver、scheduler、controller-manager)本身也得跑成 Pod。但它们不能依赖 apiserver 来调度自己——鸡生蛋蛋生鸡。所以 kubeadm 把这些组件写成静态 Pod,由 kubelet 直接拉起,不依赖控制平面自己。

ls /etc/kubernetes/manifests/
# kube-apiserver.yaml
# kube-controller-manager.yaml
# kube-scheduler.yaml
# etcd.yaml

这也是为什么节点宕机后,这些核心组件能随 kubelet 自动恢复。

23-6 常见坑

一是改了源文件 Pod 没变。确认文件在 staticPodPath 目录内、且不以点开头,kubelet 才扫得到。

二是误以为 kubectl delete 能删静态 Pod。删了 apiserver 里的镜像对象,kubelet 一同步又给你建回来。正解是删节点上的源文件。

三是把业务 Pod 写成静态 Pod。它不能跨节点调度、不受 Deployment 管理,运维起来很别扭。业务请用普通工作负载。

Note

日常管理几乎碰不到静态 Pod。你只要知道”它存在、它管控制平面、它不听 apiserver 的”就够了。真要排查控制平面起不来,第一步就是去节点看 /etc/kubernetes/manifests/ 里的文件。

学完 6 种 Pod 与工作负载,可能有点乱。第 24 章给你一张选型表,一眼知道该用哪个。