rancher证书过期X509:certificate has expired or is not ye valid
有个课题一共10台服务器,运行一年了很稳定,没出过状况,我都以为结题了已经,突然通知说集群崩溃了让处理。这个集群是用rancher自定义部署的,那叫一个快,半个多小时就弄好了。当时还暗喜了一把。结果处理起来真叫个费事儿,前前后后折腾了我10多个小时。然而解决完了却发现简单的很,感觉很多时间都浪费在整理思路上,毕竟文档这东西再详细也得有个上下文才好印证,不敢贸然动手。言归正传,先总结一下经验,再说一下故事的脉络,最后贴具体的处理方案.
经验总结(ps:重要的事儿不复制三遍也要放前边)
1、rancher在2.2.x版本之前的,趁着集群能用赶快升级,并更新证书。老版本不支持这么牛XX的功能。
2、趁着集群能用,赶快备份。备份rancher-server的数据卷,备份etcd。
3、jenkins添加好pod的yaml文件备份。正所谓备份在手,天下我有。操作起来胆子也大,顺畅很多。
4、有问题查看docker-server的日志,还有master上的apiserver日志就好,其他日志别看。
出了问题这种分布式系统都是各报各的错,按照报错去解决的话可能越跑越偏。
5、只有rancher的自定义集群可以执行更新证书操作。导入的集群踏实的用kube的官方方法更新证书。
处理流程
- 登陆rancher的UI,服务器拒绝连接
- 登陆服务器,查看端口,容器,都正常
- 查看rancher_server日志,报错
X509:certificate has expired or is not ye valid
- 检查证书有效期,确实过期了。很纳闷我的rancher版本是V2.2.5 按照官方的说法应该都是10年才对。
rancher_server_id=2bec2b2068e2
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/ca.crt -noout -dates
10年
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/localhost.crt -noout -dates
1年
openssl x509 -in /etc/kubernetes/ssl/kube-apiserver.pem -noout -dates
apiserver服务器 10年
由此可判断是因为UI的ssl证书过期导致的,UI无法打开。另外此时集群也是不能用的,因为rancher的所有api请求和通信都是靠https请求完成的。
- 按照官方指导的"证书轮换"解决后,可以打开UI。操作方法往后翻。
- 登陆UI,集群不可用
- 接着查看rancher-server日志(基本废话,心急可以略过)
error in remotedialer server [400]: read tcp 172.17.0.2:443->10.10.2.16:57064: i/o timeout
这个故障小,把对应服务器的agent重启一下就可以了。处理完后集群依旧不可用。依然有报错集群用户控制器认证失败
rancherserver宿主机执行kubectl get node报错
error: You must be logged in to the server (Unauthorized) rancher-server
Unable to connect to the server: x509: certificate signed by unknown authority kubectl-node
查看apiserver日志,token失效
Unable to authenticate the request due to an error: [invalid bearer token, Token has been invalidated, Post http://127.0.0.1:6440/v1/authenticate: dial tcp 127.0.0.1:6440: connect: connection refused
- 从UI执行更新证书,更新完成后,OK了,当时想着如果不能成就只剩下冒险升级rancher版本了。
- 中间有个小插曲,在处理过程中,etcd容器是挂掉的,查看日志,报错etcdserver: request timed out。解决这个故障的时候把 /var/lib/etcd 数据目录备份了一下,然后重启了etcd容器,解决调额。结果在执行步骤8的时候更新完证书,集群可用了之后打开工作负载,是空的是空的是空的。还好想起来这个事儿,把etcd目录恢复后,重新更新证书。
rancher证书轮换(心急直接看这里)
关于证书轮换,仔细看看官方文档
整理一下思路:
- 2.2.x版本之前的,证书过期的先搞定UI,再备份(物理备份吧,官方备份不适合这种情况了),再升级,再更新证书。(如果集群证书已经过期,那么即使升级到 Rancher v2.0.14、v2.1.9 以及更高版本也无法轮换证书。rancher 是通过 Agent 去更新证书,如果证书过期将无法与 Agent 连接。)
- 2.2.x版本的可以略过升级,其他同上。
- 没过期的就不说,抓紧时间点更新证书。
操作:
第一步:
只在rancher-server和apiserver的宿主服务器上执行就好。
# 关闭ntp同步,不然时间会自动更新
timedatectl set-ntp false
# 修改节点时间
timedatectl set-time '2019-01-01 00:00:00'
第二步:
这块儿最好把时间改回现在的时间。localhost.crt这个就是管UI的证书,有效期一次就1年。时间改的太早重新生成的证书还是过期的。
rancher-server上执行
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.crt /var/lib/rancher/management-state/tls/localhost.crt-bak
docker exec -ti ${rancher_server_id} mv /var/lib/rancher/management-state/tls/localhost.key /var/lib/rancher/management-state/tls/localhost.key-bak
docker restart ${rancher_server_id}
第三步:
证书更新后,检查证书有效期没有过期的话,此时UI可以打开了
检查证书过期
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/ca.crt -noout -dates
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/localhost.crt -noout -dates
第四步:
如果是V2.2.x之前的版本,还需要升级到这个版本,我没操作这个。
第五步:
此时进到UI,集群是不可用状态的,执行:
完成。
检查证书有效期
rancher 证书位置在rancher-server容器内/var/lib/rancher/management-state/tls,可以进入容器检查。也可以在宿主机执行以下命令检查。
rancher-server上执行
rancher_server_id=xxx
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/ca.crt -noout -dates
docker exec -ti ${rancher_server_id} openssl x509 -in /var/lib/rancher/management-state/tls/localhost.crt -noout -dates