k8s The connection to the server was refused 问题解决记录

如题所述

第1个回答  2022-07-19

最近公司的 k8s 集群出现了一个问题:在执行任何 kubectl 命令时都会出现以下错误,本文就记录一下该问题的溯源过程以及解决方式,希望对大家有帮助:

相信很多朋友都遇到过这个问题, 6443 是 k8s APIServer 的默认端口,出现访问被拒绝肯定是 kubelet 有问题或者被防火墙拦截了,这里先看一下这个端口上的 kubelet 是不是还或者:

运行之后什么都没有返回,也就是说 APIServer 完全没有提供服务 ,那我们就去查看一下 kubelet 的日志,大家都知道使用 kubeadm 搭建的 k8s集群里,APIServer 都是在 docker 里运行的,这里我们先找到对应的容器,记得加 -a ,因为该容器可能已经处于非正常状态了:

这里能看到两个容器,可以看到 容器的状态已经是 Exited 了 ,注意下面的 pause 容器,这个只是用来引导 APIServer 的,并不是服务的实际运行容器,所以看不到日志,所以查看日志时不要输错容器 id 了。接下来查看 APIServer 的日志:

从最后一行可以看到,是 APIServer 在尝试创建存储时出现了问题,导致无法正确启动服务,由于 k8s 是使用 etcd 作为存储的,所以我们再来查看 etcd 的日志。

注意,我这里 etcd 也是运行在 docker 里的,如果你是直接以 service 的形式运行的话需要使用 systemctl status etcd 来查看日志,下面是 docker 的 etcd 日志查看:

可以看到 etcd 一直在循环输出上面的错误日志直到超时退出,从里面可以提取到一条关键错误,就是 error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid 。这个错误对于经常维护 k8s 集群的朋友可能很熟悉了,又是证书到期了。

这个集群有三台 master,分别是 171 、 181 和 191 ,可以从错误信息前看到是在请求 181 时出现了证书验证失败的问题,我们登陆 181 机器来验证错误:

经过排查,发现 k8s 的相关证书都没事,但是 etcd 的证书都到期了。关于 k8s 需要的证书可以看这篇文章,接下来我们就来解决问题:

Kubeadm安装的K8S集群1年证书过期问题的解决思路

注意,由于 k8s 版本问题,这一部分的内容可能和你的不太一样,我所使用的版本如下:

如果版本相差过大的话请进行百度,相关的解决方案还是挺多的,下面解决方案请先配合 -h 使用, 注意:以下操作会导致服务停止,请谨慎执行

备份原始文件

重新生成证书

重新生成证书需要集群初始化时的配置文件,我的配置文件 kubeadm.yaml 如下:

其中 192.168.100.170 是 VIP, 171 、 181 、 191 分别对应 master1 、 master2 、 master3 主机。接下来使用配置文件重新签发证书,每个管理节点都要执行:

重新生成配置文件

这个命令也需要每个管理节点都执行一次,被重新生成的配置文件包括下列几个:

重启管理节点的 k8s

重启 etcd,apiserver,controller-manager,scheduler 容器,一般情况下 kubectl 都可以正常使用了,记得 kubectl get nodes 查看节点的状态。

重新生成工作节点的配置文件

如果上一步查看的工作节点的状态还是为 NotReady 的话,就需要重新进行生成,如果你根证书也更换了的话就会导致这个问题,工作节点的证书也会失效,直接备份并移除下面的证书并重启 kubelet 即可:

如果不行的话就直接把管理节点的 /etc/kubernetes/pki/ca.crt 复制到对应工作节点的相同目录下然后再次启动 kubelet。等待三分钟左右应该就可以在管理节点上看到该工作节点的状态变为 Ready 。

k8s 的证书只有一年的设置确定有点坑,虽然为了让使用者更新到最新版本的本意是好的。如果你现在 k8s 集群还是正常但是并没有执行过证书更新操作的话,请及时查看你的证书到期时间,等到证书到期就为时已晚了。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网