前言
双十一刚过早上到公司去查看一下集群的负载情况,打开网址后直接访问被拒绝,吓坏我了以为整个集群崩了(集群跑了很多job),赶快登录阿里云控制台以及各个K8S 集群Master
服务器输入命令kubectl get nodes
查看情况,发现master节点和 worker节点都正常运行,于是查看rancher-server 容器的日志发现报错x509: certificate has expired or is not yet valid
,原来是证书过期了,接下来开始操作。
Rancher 的证书过期会出现什么状况?
- 不可以继续通过
Rancher UI
访问你的集群 -
查看Rancher Server日志报错:
x509: certificate has expired or is not yet valid
-
大致Google了一下 发现这个bug从去年(2020 年)就已经有人采坑了,此时,你无法继续再通过 Rancher UI 去操作集群,但是还好集群是正常的,依然可以继续通过
kubectl
操作你的集群 。Rancher 的设计是分离式的,也就是说 Rancher Server 挂掉,根本不会影响你创建的业务集群,你可以继续通过kubectl
操作你的业务集群,而且你的 pod 、job等业务不会有任何变动。
证书轮转逻辑
-
Rancher 官网明确指出
Rancher v2.3
以上的版本 会自动检查证书有效期,如果发现证书即将过期,将会自动生成新的证书,那为什么会出现上述的情况呢,其实这是K3s
的一个 bug 引起的。 -
Rancher Server 内置了一个
K3s
集群作为 local 集群,也就是说通过docker run ... rancher/rancher:v2.5.1
启动的 Rancher,在容器里其实已经内置了一个K3s
用来支撑 Rancher 的运行。 -
K3s
的证书轮转逻辑:K3s
证书有效期默认一年,如果证书已经过期或剩余的时间不足 90 天,则在K3s
重启时轮换证书。但在K3s v1.19.1
之前的版本中,有BUG(https://github.com/k3s-io/k3s/issues/1621)导致K3s
无法自动轮转证书。 -
Rancher v2.3+ 和 v2.4+
内置的K3s
版本分别是1.17.x
和1.18.x
,由于内置的k3s
影响到了 Rancher Server 的证书轮转,所以当 Rancher 证书过期后,会自动重启 Rancher Server ,然后触发内置K3s
的更新,此时K3s
证书更新失败,所以,Rancher Server 就无法启动报错。
解决bug过程
1. rancher-server 2.3.x
- 备份原来的
tls
目录:docker exec -ti <rancher-server-id> mv /var/lib/rancher/k3s/server/tls /var/lib/rancher/k3s/server/tls_bak
- 执行两次重启,第一次用于申请证书,第二次用于加载证书并启动:
docker restart <rancher_server_id>
2. rancher-server2.4.x
、 rancher-server2.5.x
- 进入rancher-server容器内
docker exec -it rancher-server-id bash
- 删除
k3s
相关证书配置
kubectl --insecure-skip-tls-verify -n kube-system delete secrets k3s-serving kubectl --insecure-skip-tls-verify delete secret serving-cert -n cattle-system rm -f /var/lib/rancher/k3s/server/tls/dynamic-cert.json
- 将
rancher ip
重新注入到新证书中,否则K8S集群agent
无法正常连接Rancher Server
curl --insecure -sfL https://ip:port/v3
总结
Rancher v2.5.8
通过把内置的K3s 集群
更新到v1.20
解决了这个问题。无论是新安装的,还是从老版本升级到v2.5.8
的单节点 Rancher,都不会再被证书过期的问题所困扰。- 如操作有问题欢迎去我的博客(www.loganjin.cn)留言或者微信公众号(Python技术交流圈)留言交流哦。
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.loganjin.cn/article/k8s-rancher-bug/
许可协议:署名-非商业性使用 4.0 国际许可协议