如何在具有无盘工作节点的 kubernetes 集群中安全地挂载 NFS /var/lib/kubelet?

How can I safely NFS mount /var/lib/kubelet in a kubernetes cluster with diskless worker nodes?

背景:

我有一个裸机 Kubernetes 集群。主节点是有磁盘的,但是所有工作节点都是无磁盘的,并且 PXE 从提供其 OS 映像和非易失性 NFS 安装点的机器启动。

我们很早就发现我们需要某种非易失性存储,以便无盘节点可以存储它们的配置、kubernetes 秘密、SSL 密钥等...如果没有非易失性存储,节点将拥有每次重启都会被删除并重新加入集群,这显然很痛苦。

因此我们为 /etc/kubernetes 和 /var/lib/kubelet 创建了 NFS 挂载分区,以便节点可以记住它们是谁,并在重启后重新加入集群。

问题:

但是,我们 运行 遇到了 kubeadm 的问题:它 unmounts/remounts /var/lib/kubelet 每当你 运行 kubeadm 加入。这会导致 kubelet 呕吐和死亡,因为它找不到合适的设备。具体错误为:

node6 kubelet: F0113 18:08:55.196706  210949 kubelet.go:1347] Failed to start ContainerManager failed to get rootfs info: failed to get device for dir "/var/lib/kubelet": could not find dev
ice with major: 0, minor: 46 in cached partitions map

如果我们在 运行ning kubeadm join 之前卸载 /var/lib/kubelet 的 NFS 挂载,它工作得很好,但让我们回到原来的问题:无盘节点将无法在重启后继续存在并且自动重新加入集群。

我们试图通过更改 kubelet 的 k8s root 来解决这个问题,但它仍然会导致 kubelet 对设备感到困惑的相同崩溃。

所以我的问题是:

如何在我的无盘工作节点上正确设置 /var/lib/kubelet 的 NFS 挂载点,或以其他方式配置 kubelet,以便即使在 kubeadm mounts/unmounts 那个点我不要崩溃,kubeadm 的设置文件是非易失性的?

这是一个已知问题,但幸运的是,它在几天前就已修复 - https://github.com/google/cadvisor/pull/2787

这还没有被剪辑成一个版本。虽然这可能会变成 1.20.x,但对以前的版本不太确定。如果需要,可能想在 https://github.com/kubernetes/kubernetes/issues/98009 请求对问题的反向移植。