kubernates证书过期问题的解决
2018-11-19 本文已影响421人
do_young
背景:
之前在阿里云主机上使用kubeadm安装的kubernates(版本号为:1.8.3),使用了一年以后,突然出现问题。
问题状态为不管使用kubectl 的什么指令,都报出以下的异常:
Unable to connect to the server: x509: certificate has expired or is not yet valid
通过异常关键字查询,最后定位是默认安装中,kubenates的apiserver与kubelet的访问授信证书是一年,官方的说法是通过这种方式,让用户不断的升级版本。现在这套环境上跑着用户的生产环境,不可能去做升级或是重装的事情,这个影响太大了,所以需要在不重装kubernates的前提上,把这个问题解决掉。
思路
方案1
源码去掉证书判定逻辑,重新编译
这个方式没有验证,但需要下载对应版本的源码,重新编译相应组件。这个方式如果是与原作者的k8s版本一致可以试一下,或是对go语言熟悉的用户可以找对应的处理逻辑代码进行修改。
方案2
重新生成证书
其中有位大胡子说:
备注:因为内容太多,这里没有办法截图完整方案,可以通过链接自己查看。大概意思就是说他是1.8以下版本的k8s集群环境,按照以下步骤可以解决问题。并且有多人回复说按照大胡子的方式处理已经成功解决问题。
楼下出现一个小人说:
topic2.png
大概意思就是说他是非集群的环境,按照大胡子的1-6步损伤也成功了。
解决
有了上面的方案做参照,就有了自己的思路。基于本人的实际情况。还是考虑使用方案2的方式来解决,只是根据自己的情况对步骤进行裁减,最后问题得到了解决。下面将环境,处理步骤以操作过程中出现的问题叙述如下:
环境
在阿里云的云主机上使用kubeadm安装的1.8.3版本的单结点的kubernates。
topic3.png
处理步骤
备份证书
sudo mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old
sudo mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
sudo mv /etc/kubernetes/pki/apiserver-kubelet-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt.old
sudo mv /etc/kubernetes/pki/apiserver-kubelet-client.key /etc/kubernetes/pki/apiserver-kubelet-client.key.old
sudo mv /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.crt.old
sudo mv /etc/kubernetes/pki/front-proxy-client.key /etc/kubernetes/pki/front-proxy-client.key.old
产生新的证书
sudo kubeadm alpha phase certs apiserver --apiserver-advertise-address 127.0.0.1
sudo kubeadm alpha phase certs apiserver-kubelet-client
sudo kubeadm alpha phase certs front-proxy-client
备份老的配置文件
sudo mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.old
sudo mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
sudo mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.old
sudo mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.old
产生新的配置文件
sudo kubeadm alpha phase kubeconfig all --apiserver-advertise-address 127.0.0.1
确认kubectl正在查找正确的配置文件路径
mv $HOME/.kube/config $HOME/.kube/config.old
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo chmod 777 $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
重启kube-apiserver,kube-controller-manager, kube-scheduler
通过docker ps找到kube-apiserver,kube-controller-manager, kube-scheduler容器,然后指令杀掉容器,让他重新加载。
下面以kube-apiserver为例:
docker ps | grep ${keyword}
topic4.png
docker kill -s HUP ${容器ID}
及
topic5.png
备注:
在生成证书时会莫名的访问google的网址,因为google已经被封了,所以会报超时。第一次出现这个异常的时候都快绝望了。
topic6.png
试第二次的时候,发现提示的异常信息中的IP是不一样的,就想着多试几次看看,没想到就成功了。开心得像大胡子一样。+