关于单节点Rancher Server证书过期

今天我们来聊聊单节点安装的 Rancher 的证书问题,其实这个问题从去年(2020 年)就已经暴露出来了,因为 Rancher 2.3 的首个版本是 2019 年 10 月 8 日发布的,到 2020 年的 10 月份正好满一年,说到这里,真挺佩服我们国内用户的尝鲜精神。

那么单节点安装的 Rancher 的证书过期会是什么现象呢:

  1. Rancher UI 无法访问

  2. Rancher Server 日志报错:x509: certificate has expired or is not yet valid

  3. Rancher Server 反复重启(如果你在启动 rancher 时加了 --restart 参数)

此时,你无法继续再通过 Rancher UI 去操作集群,有许多用户就会认为整个集群都挂掉了,莫慌,其实并不是这样。Rancher 的设计是分离式的,也就是说 Rancher Server 挂掉,根本不会影响你创建的业务集群,你可以继续通过kubectl操作你的业务集群,而且你的 pod 等业务不会有任何变动。

原因

Rancher 官网明确指出 Rancher v2.3 以上的版本 会自动检查证书有效期,如果发现证书即将过期,将会自动生成新的证书,那为什么会出现上述的情况呢,其实这是 K3s 的一个 bug 引起的。

Rancher Server 内置了一个 K3s 集群作为 local 集群,也就是说通过docker run ... rancher/rancher:version 启动的 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 就无法启动。

手动轮转证书

2.3.x


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.x 和 2.5.x

1. docker exec 到 Rancher Server 容器内,执行:


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

2. 重启 rancher-server

3. 将 rancher ip 重新注入到新证书中,否则业务集群 agent 连接 Rancher Server 会有问题


curl --insecure -sfL https://{server-url}/v3 # server-url 需要替换为你的 rancher server 的访问地址

后记

Rancher v2.5.8 通过把内置的 K3s 集群更新到v1.20解决了这个问题。无论是新安装的,还是从老版本升级到 v2.5.8 的单节点 Rancher,都不会再被证书过期所困扰。

其实非常不建议大家在生产上用单节点安装,如果机器不够用,可以先用 rke 或 k3s 启动一个单节点的 local 集群,然后通过 helm 将 Rancher 部署到这个 local 集群上,这样即不占用过多机器,也可以为后期扩展打好基础。

大神, Rancher 2.4.15 更新到 2.5.8 可以直接更新吗? 还是需要哪些中间版本的过渡? 感谢 !

个人建议先将升级到 2.4 的最新版本,然后再升级到 2.5

大佬好,我用的docker 单节点 rancher 2.5.12版本,按照上面的步骤更新证书后,rancher server 还是无法启动,看了一下日志是k3s 无法启动导致,容器一直等待k3s 启动,k3s 日志提示证书问题,但是我检查了/var/lib/rancher/k3s/server/tls 下的所有证书都已经更新了,请问一下是哪里还有问题。

k3s 错误日志如下:

http: TLS handshakke error from 127.0.0.1:37434: remote error: tls: bad certificate

docker 错误日志如下:
Waiting for server to become available: Get “https://127.0.0.1:6443/version?timeout15m0s” dial tcp 127.0.0.1:6443: connect: connection refused

你是如何操作的?把你每个真实的操作命令都写到下面

docker exec 进入容器 执行下面的步骤
1,kubectl --insecure-skip-tls-verify -n kube-system delete secrets k3s-serving
提示成功 secret “k3s-serving” deleted
2, kubectl --insecure-skip-tls-verify delete secret serving-cert -n cattle-system
提示失败 Error from server (NotFound): secrets “serving-cert” not found
3, rm -f /var/lib/rancher/k3s/server/tls/dynamic-cert.json
4,重启容器
5,curl --insecure -sfL https://ip/v3 (这里不知道要不要加端口)
6,重启容器
发现容器一直在重启
docker logs 错误是连接不上127.0.0.1:6443, k3s 退出后容器就重启了,日志如下
Waiting for server to become available: Get “https://127.0.0.1:6443/version?timeout15m0s” dial tcp 127.0.0.1:6443: connect: connection refused
k3s exited with: exit status 255

进入容器查看k3s 日志如下:
msg=“Cluster-Http-Server 2023/09/21 10:10:10 http: TLS handshake error from 127.0.0.1:32862: remote error: tls :bed certificate”
msg=“Cluster-Http-Server 2023/09/21 10:10:10 http: TLS handshake error from 127.0.0.1:32870: remote error: tls :bed certificate”

后面还有两条 error msg=“Failed to set sysctl: open /proc/sys/net/bridge-nf-call-iptables: no such file or directory”
error msg=“Failed to set sysctl: open /proc/sys/net/bridge-nf-call-ip6tables: no such file or directory”

但是我觉得还是因为k3s 证书的问题,/var/lib/rancher/k3s/server/tls 下的所有.crt 我都检查过了,enddate 只少都是1年后,所以现在不知道是哪里还有问题,还请大佬指点指点。

敢问最后有修复吗

其实不管修复不修复都不重要,因为 docker run 这种方式安装的 rancher 官方根本不建议上生产。

2.5.18 按照帖子更新后 Rancher-webhook 一直报 Waiting for server to become available: the server has asked for the client to provide credentials
然而Rancher-webhook 的证书是有效的

这个也不是更新 webhook 的操作,你可以创建一个新的话题,将详细上下文和操作步骤描述清楚。