这篇文章也可以在我的博客中查看
今天废话不多说直接解决一个阴间问题
问题
- 在部署kubernetes后(执行完kubeadm init后),执行任何kubectl命令,都会报以下错误:
The connection to the server xxx.xxx.xxx.xxx:6443 was refused - did you specify the right host or port?
- 此后执行kubectl get pods -A
 你会看到一些容器在无规律地被摧毁
- 在过一段时间后,Api-server直接开摆,你无法再连接上Kubernetes,直接Connection refused。
环境
如果你目前遇到类似问题,而且处于以下环境,那本文很可能可以帮你渡过难关:
- 你使用的是Debian系统(Debian12/11) - 我不确定其它系统会不会有相同错误,但不妨试试
 
- 你使用Kubeadm部署Kubernetes (目前的最新版,v1.28) - 我同样不确定其它的部署方式会不会有相同错误
 
- 你使用containerd作为container runtime- 如果你是通过Docker官方教程安装的Docker,那个教程会连带安装containerd
- 所以如果你印象中没有专门安装过任何container runtime,那很可能就是containerd
 
- 如果你是通过Docker官方教程安装的Docker,那个教程会连带安装
- 你找过许多相同错误的解决方案,但最后都无法解决问题
原因
简单来说:containerd与kubelet使用的cgourp driver版本对不上
 Debian安装的conainerd的默认cgroup driver还是v1,但是kubelet使用的是v2
但说实话,详细的我也不太懂,也不太想去懂……
 如果你对具体解释感兴趣,不妨查阅以下链接:
- Why does etcd fail with Debian/bullseye kernel?
- cgroups-k8s
解决
但要解决这个问题还是比较简单,只要指定containerd使用cgroup driver v2就可以:
打开containerd配置文件:
vi /etc/containerd/config.toml
加入以下内容,并保存退出:
version = 2
[plugins][plugins."io.containerd.grpc.v1.cri"][plugins."io.containerd.grpc.v1.cri".containerd][plugins."io.containerd.grpc.v1.cri".containerd.runtimes][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true
重启containerd
systemctl restart containerd
重启kubelet
systemctl restart kubelet
结束了哥们,这就完事儿了。
真不敢相信被这个问题折磨了将近两天