参考:How to Create Static Pod in Kubernetes (Tutorial)
参考:官方文档-静态 Pod
在这篇指南中,我们将探讨如何在 Kubernetes 中创建静态 Pod,以及与其相关的配置。
什么是静态 Pod?
在 Kubernetes 中,静态 Pod 是一种概念,允许您部署不受 API 服务器管理的 Pod。
静态 Pod 直接由 Kubelet 组件管理。Kubelet 服务被部署时会带有配置路径,您可以在该路径下添加 Pod 清单,以便 Kubelet 进行部署。
尽管静态 Pod 不受 API 服务器管理,您仍然可以使用 kubectl
列出静态 Pod。这是因为当 Kubelet 部署静态 Pod 时,它会在 API 服务器上 创建一个镜像 Pod 。镜像 Pod 自身并不运行容器;它本质上是一个占位符,用于提供可见性。
尽管静态 Pod 对 API 服务器来说是可见的,但它无法对其进行控制。
是否可以在多个节点上调度静态 Pod?
不可以。静态 Pod 仅绑定到放置静态 Pod 清单的具体节点。如果您希望在多个节点上拥有静态 Pod,则需要在所有节点上放置该清单。
静态 Pod 的实际用途是什么?
主要用途是在集群引导过程中启动集群组件,比如 API 服务器、控制器管理器等。例如,在部署 Kubeadm 集群时,它会使用位于 /etc/kubernetes/manifest
目录下的静态 Pod 清单来创建所有集群组件。
在现实世界的应用场景中, 使用静态 Pod 的可能性极小 。
静态 Pod 的位置
为了创建静态 Pod,首先需要找到与 Kubelet 配置的 staticPodPath
参数。
默认的 staticPodPath
位置是 /etc/kubernetes/manifests
。您可以通过检查 Kubelet 配置来验证这一点。
执行以下命令来查找 Kubelet 配置文件的位置:
ps -aux | grep kubelet | grep config.yaml
从输出中可以看到,配置保存在 /var/lib/kubelet/config.yaml
文件中。
现在,打开文件并查找名为 staticPodPath
的参数,该参数指定了静态 Pod 清单的位置。您可以使用 grep
命令来找到确切的参数:
cat /var/lib/kubelet/config.yaml | grep staticbash'
如果您打开完整文件,在配置的末尾部分,您会找到如下所示的参数:
staticPodPath: "/etc/kubernetes/manifests"
创建静态 Pod
一旦您知道了静态 Pod 的路径,就可以使用 Pod 清单创建静态 Pod。
我们将创建一个简单的 Nginx 静态 Pod。
进入静态 Pod 清单目录。您会在与集群关联的所有节点上找到该目录。在这个示例中,我将在工作节点上部署静态 Pod。
cd /etc/kubernetes/manifests
使用以下内容创建名为 nginx.yaml
的 Pod 清单:
apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- image: nginx
name: webserver-container
现在,Kubelet 会创建名为 webserver
的静态 Pod 和一个镜像 Pod。由于我是登录在一个工作节点上,因此我没有 kubectl
访问权限。所以,我可以使用 crictl
工具来列出该特定节点上的 Pod。
crictl pods
您也可以使用 kubectl
列出 Pod:
kubectl get pods -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,STATUS:.status.phase
输出可能如下:
NAME NODE STATUS
webserver-node01 node01 Running
如果您查看输出,会注意到 webserver
Pod 名称已被修改为 webserver-node01
。在创建 Pod 时,Kubelet 会在清单中定义的实际 Pod 名称后面附加一个连字符 (-
) 和节点的主机名。
这样,API 服务器可以区分由 API 服务器管理的 Pod 和静态 Pod。同时,这也防止了在不同工作节点上可能存在相同名称的静态 Pod 之间的冲突。
如果您部署了一个 Kubeadm 集群,可以通过列出 kube-system
命名空间中的所有 Pod 来进一步验证这一点。作为 Pod 运行的所有控制平面组件都会在其名称后附加控制平面节点的名称。
执行以下命令来列出控制平面静态 Pod。请将 controlplane
替换为您控制平面节点的名称:
kubectl get po -n kube-system | grep "controlplane"
编辑和删除静态 Pod
您不能使用 kubectl
编辑或删除静态 Pod。
您需要编辑位于 /etc/kubernetes/manifests
目录中创建的静态 Pod 清单文件。
Kubelet 会自动应用对清单文件所做的更改。
要删除静态 Pod,只需删除清单文件即可:
cd /etc/kubernetes/manifests
rm -f nginx.yaml
结论
在现实世界的项目中,几乎不可能遇到需要使用静态 Pod 的用例。
然而,如果您正在准备 CKA(Certified Kubernetes Administrator)认证考试,静态 Pod 是一个重要的概念,您应该了解 Kubelet 静态 Pod 配置的位置。