Rancher Server Certificates Expired

现象

使用独立容器部署的 Rancher Server 证书在到期后自动轮换时更新失败,现象为:

  • 1、rancher web 页面证书已经过期
  • 2、rancher web 上 k8s 业务集群处于 Unavailable 状态,但实际业务集群工作正常。
  • 3、业务集群中 cattle-system namespace 下 cattle-node-agent pod 处于 CrashLoopBackOff 状态下,日志提"x509: certificate has expired or is not yet valid: current time 2023-07-31T05:54:37Z is after 2023-06-21T03:12:49Z"
  • 4、local 集群显示为正常

排查

1、经过初步检查,发现是 rancher web 以及 local 集群中的证书过期了,重启 rancher server 以及 cattle-node-agent 后现象依旧存在。

2、使用 docker exec rancher-server bash 进入 rancher server 容器内部,并进入 /var/lib/rancher/k3s/server/tls 目录下验证证书。

root@ffd92afc55c3:/var/lib/rancher/k3s/server/tls# openssl x509 -in server-ca.crt -noout -dates
notBefore=Jun 21 03:12:29 2022 GMT
notAfter=Jun 18 03:12:29 2032 GMT
root@ffd92afc55c3:/var/lib/rancher/k3s/server/tls# openssl x509 -in client-admin.crt -noout -dates
notBefore=Jun 21 03:12:29 2022 GMT
notAfter=Jun 20 03:12:45 2024 GMT
root@ffd92afc55c3:/var/lib/rancher/k3s/server/tls# ll -h 
-rw-r--r-- 1 root root 1.1K Jun 21 03:12 client-admin.crt

发现 ca 证书默认是 10 年有效期,admin 证书为 1 年有效期,证书文件并且已经于 6 月 21 日更新了,但实际上未更新成功,于是进行 google 搜索排查并找到官方证书轮换的文章,但并不确认是何问题导致。

3、继续排查发现一篇类似现象的文章,大致了解应该是 rancher 内置的 local 集群(k3s)在 v1.19.1 之前的版本在启动证书轮换时由于 bug 导致 k3s 自动轮换证书失败。

修复

按照官方证书轮换流程进行操作,具体流程如下:

# 证书未过期时,rancher server 可以正常运行。升级到 Rancher v2.0.14+ 、v2.1.9+、v2.2.2+ 后会自动检查证书有效期,如果发现证书即将过期,将会自动生成新的证书。所以独立容器运行的 Rancher Server,只需在证书过期前把 rancher 版本升级到支持自动更新 ssl 证书的版本即可,无需做其他操作。

# 证书已过期,那么 rancher server 无法正常运行。即使升级到 Rancher v2.0.14+ 、v2.1.9+、v2.2.2+ 也可能会提示证书错误。如果出现这种情况,可通过以下操作进行处理:

# 1、正常升级 rancher 版本到 v2.0.14+ 、v2.1.9+、v2.2.2+

# 2、执行以下命令
# 2.0 或 2.1 版本
docker exec -ti <rancher_server_id> mv /var/lib/rancher/management-state/certs/bundle.json /var/lib/rancher/management-state/certs/bundle.json-bak

# 2.2 +
docker exec -ti <rancher_server_id> mv /var/lib/rancher/management-state/tls/localhost.crt /var/lib/rancher/management-state/tls/localhost.crt-bak

# 2.3 +
docker exec -ti <rancher_server_id> mv /var/lib/rancher/k3s/server/tls /var/lib/rancher/k3s/server/tlsbak

# 执行两次,第一次用于申请证书,第二次用于加载证书并启动
docker restart <rancher_server_id>
# 2.4/2.5 + ,exec 到 rancher server
docker exec -it rancher_server bash
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-server
# 执行以下命令刷新参数
curl --insecure -sfL https://<server-url>/v3  # 请将 <server-url> 替换为 Rancher Server 的访问地址

总结

Rancher v2.5.8 通过把内置的 K3s 集群更新到v1.20解决了这个问题

参考1 参考2 参考三

Infee Fang
Infee Fang
互联网二手搬砖工