Kubeadm 启动原理之静态 Pod 技术
1. 作用
静态 Pod 是一种特殊的 Kubernetes Pod 类型,允许你在不通过 kubectl
命令来创建 Pod 的情况下,通过直接将 Pod 资源清单放置在 Kubelet 可识别的目录中来创建 Pod。Kubelet 会定期检查该目录并自动管理这些 Pod。对于 kubeadm 部署方式来说,静态 Pod 技术尤为重要,它能够在集群中管理系统级别的 Pod(如 kube-apiserver
、etcd
、kube-controller-manager
、kube-scheduler
等)。
2. 查看 Kubelet 对应的静态 Pod 存储目录
Kubelet 会监控一个静态 Pod 目录,其中存放的是所有静态 Pod 的资源清单文件。你可以通过查看 Kubelet 的配置文件来确认这个目录的位置。例如,运行以下命令查看静态 Pod 路径:
grep staticPodPath /var/lib/kubelet/config.yaml
输出会显示类似以下内容:
staticPodPath: /etc/kubernetes/manifests
这表示静态 Pod 的文件会存放在 /etc/kubernetes/manifests
目录中。
3. 查看 kubeadm 使用的静态 Pod 文件
Kubeadm 部署的 Kubernetes 集群会在 /etc/kubernetes/manifests
目录下存放相关的静态 Pod 文件。可以使用 kubectl get pods -n kube-system
来查看正在运行的 Pod,通常这些 Pod 由 kubeadm 创建并作为静态 Pod 启动。
示例输出:
kubectl get pods -n kube-system
你会看到类似的输出,其中包含如 etcd
、kube-apiserver
、kube-controller-manager
和 kube-scheduler
等系统级别的 Pod。
查看静态 Pod 目录下的 YAML 文件:
ll /etc/kubernetes/manifests
这会列出所有与静态 Pod 相关的文件,例如:
-rw------- 1 root root 2280 Jul 29 16:38 etcd.yaml
-rw------- 1 root root 4025 Jul 29 16:38 kube-apiserver.yaml
-rw------- 1 root root 3546 Jul 29 16:38 kube-controller-manager.yaml
-rw------- 1 root root 1465 Jul 29 16:38 kube-scheduler.yaml
4. 自定义静态 Pod
你可以创建自己的静态 Pod 资源清单并将其放入静态 Pod 目录中。例如,以下是一个自定义的 Pod 配置文件:
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-v1
spec:
nodeName: worker232
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: xiuxian
将这个文件保存为 /etc/kubernetes/manifests/01-pods-xiuxian-single.yaml
。Kubelet 会自动监控这个目录并启动 Pod。
cp /oldboyedu/manifests/pods/01-pods-xiuxian-single.yaml /etc/kubernetes/manifests/
通过 kubectl get pods -o wide
可以查看到新创建的 Pod。
5. 将静态 Pod 部署到多个节点
你可以将静态 Pod 配置文件复制到多个节点,从而在不同的节点上启动相同的静态 Pod。通过 scp
命令将 YAML 文件复制到不同节点的 /etc/kubernetes/manifests/
目录:
scp /oldboyedu/manifests/pods/01-pods-xiuxian-single.yaml worker232:/etc/kubernetes/manifests/
scp /oldboyedu/manifests/pods/01-pods-xiuxian-single.yaml worker233:/etc/kubernetes/manifests/
然后通过 kubectl get pods -o wide
可以看到这些 Pod 被分配到不同的节点上。
6. 删除静态 Pod 资源
删除静态 Pod 资源文件时,Kubelet 会停止对应的 Pod。如果删除了 /etc/kubernetes/manifests
中的 YAML 文件,Kubelet 会检测到文件缺失并删除该 Pod。比如:
rm -f /etc/kubernetes/manifests/01-pods-xiuxian-single.yaml
删除后,运行 kubectl get pods -o wide
会显示 Pod 状态为 Completed
或不再存在。
7. Kubelet 启动和自启动
静态 Pod 需要通过 Kubelet 自动加载资源,因此在 Kubelet 配置中要确保其自启动并正确运行。否则,集群会因为静态 Pod 的丢失而出现故障。
例如,查看 kube-apiserver
是否启动失败,如果删除了某个关键静态 Pod 文件,集群将无法正常工作。
8. 修改 NodePort 端口范围
默认情况下,NodePort 的端口范围是 30000 到 32767。如果需要修改,可以在 kube-apiserver
的配置中添加 --service-node-port-range
参数,设置新的端口范围。例如,将端口范围改为 3000 到 50000:
containers:
- command:
- kube-apiserver
- --service-node-port-range=3000-50000
修改后,重新加载 kube-apiserver
配置以使更改生效。
总结
通过静态 Pod 技术,Kubelet 可以方便地管理 Kubernetes 集群的基础设施组件(如 etcd
、kube-apiserver
等)。这种方式不仅简化了 Pod 的创建和管理,而且为 Kubernetes 集群的稳定性提供了保障。