kubelet报错nable to connect to the server: x509: certificate is valid for xxx, not xxx

我当前k8s环境是多master节点,前几天刚续费k8s证书,今天查看所有工作节点均notready,但是master节点正常,查看工作节点kubelet报错日志如下:

k8s.io/kubernetes/pkg/kubelet/kubelet.go:450: Failed to list *v1.Service: Get https://192.168.1.220:16443/api/v1/services?limit=500&resourceVersion=0: x509: certificate is valid for 10.96.0.1, 192.168.1.201, not 192.168.1.220

然后我们可以通过以下命令查看apiserver证书

openssl x509 -noout -text -in apiserver.crt|grep DNS
                DNS:debian-1, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.168.1.201

可以看到证书内没有包含我们的VIP,简单判断可能是master节点apiserver认证中包含本机IP,所以kubelet能够正常连接k8s集群,但是工作节点中连接k8s集群使用的是VIP,于是我尝试删除旧的证书,重新制作apiserver证书,将VIP加入apiserver的认证,这个操作需要在每个master节点上都操作一遍。

/etc/kubernetes/
cp -r pki pki_bak
cd pki
rm -rf apiserver.crt
rm -rf apiserver.key

然后单独使用命令生成新的证书,VIP和本机IP需要加进去

kubeadm init phase certs apiserver --apiserver-advertise-address 10.96.0.1 --apiserver-cert-extra-sans 192.168.1.201 --apiserver-cert-extra-sans 192.168.1.220

此时我们可以看到目录下生成来了新的apiserver证书

ls apiserver*
apiserver.crt  apiserver.key

然后我们接着重启apiserver

docker ps |grep -E 'k8s_kube-apiserver' | awk '{print $1}' |xargs docker restart

我们再使用命令查看集群状态

kubectl cluster-info
Kubernetes master is running at https://192.168.1.220:16443
KubeDNS is running at https://192.168.1.220:16443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://192.168.1.220:16443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

经过以上操作一般就能恢复正常,但是有可能客户端的kuebet中的授权认证的key也可能有问题,如果有问题就按照以下操作进行

然后我们复制/etc/kubernets/kubelet.conf文件出来,将该文件内的Master IP改为VIP,6443端口改为16443端口,然后将该文件复制到所有工作节点的/etc/kubernets/目录下替换原文件,然后重启kubelet,最后所有集群恢复正常。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/897.html