kubeadm部署的Kubernetes Master节点重启VM后无法连接,如何实现自动启动?
你遇到的这个现象,核心是两个关键点导致的:
1. Swap内存自动挂载,阻断kubelet启动
Kubernetes的设计逻辑里,必须禁用swap内存——因为swap会打乱K8s对容器资源的精准调度,还可能引发性能波动和稳定性问题。kubelet启动时会强制校验swap状态,如果检测到swap是开启的,它会直接启动失败或者进入异常状态。
而你的VirtualBox虚拟机重启后,系统默认会重新挂载swap分区,这就导致kubelet在开机阶段无法正常启动。kubelet是管理Master节点所有控制平面组件(比如kube-apiserver、kube-controller-manager)的核心服务,它挂了之后,apiserver也就没法正常提供6443端口的服务,自然会出现「连接被拒绝」的错误。
2. Kubelet开机自启逻辑未匹配swap状态
虽然你手动重启kubelet能恢复,但如果kubelet没设置开机自启,或者开机时swap还没关闭就尝试启动,它还是会启动失败。不过这个是次要问题,核心矛盾还是swap的自动挂载。
要实现虚拟机重启后Master节点自动恢复正常,只需要完成以下配置:
第一步:永久禁用Swap内存
方法一:手动编辑配置文件
- 打开系统挂载配置文件
/etc/fstab:sudo nano /etc/fstab - 找到包含
swap关键字的行,在行首添加#注释掉该配置,比如:# /dev/mapper/ubuntu--vg-swap_1 none swap sw 0 0 - 保存退出后,立即关闭当前正在运行的swap:
sudo swapoff -a
方法二:一键命令修改(更高效)
直接执行下面的命令,自动注释fstab中的swap配置并关闭当前swap:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab && sudo swapoff -a
第二步:确保kubelet服务开机自启
执行下面的命令,让kubelet在系统启动时自动启动:
sudo systemctl enable kubelet.service
现在,当你重启虚拟机时,swap不会被自动挂载,kubelet能正常启动,控制平面组件也会随之运行,再也不用手动执行swapoff和重启kubelet的操作了。
完成配置后,你可以重启虚拟机测试:
sudo reboot
重启完成后直接执行kubectl get nodes,应该能正常看到Master节点处于Ready状态,无需任何手动干预。
内容的提问来源于stack exchange,提问作者codependent

