前言

双十一刚过早上到公司去查看一下集群的负载情况,打开网址后直接访问被拒绝,吓坏我了以为整个集群崩了(集群跑了很多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.x1.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.xrancher-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 国际许可协议