为什么通过 rke 或 Rancher v2.x 配置的集群中执行集群证书轮换后,kubelet 日志仍然显示证书过期?
本文永久链接: https://www.xtplayer.cn/kubernetes/kubelet-cert-expired/
问题现象

有时间可能会出现节点状态不正常,然后查看 kubelet 容器日志时,会看到如上图的证书过期的错误信息。
问题排查
- 如果你是 rke1 版本创建的 local 集群或者下游自定义集群,可以使用以下命令查询证书有效期:
printf '\nexpire_time: ssl_path_name\n' |
- 如果你是 rke2 版本创建的 local 集群或者下游自定义集群,可以使用以下命令查询证书有效期:
printf '\nexpire_time: ssl_path_name\n' |
- 对于 rke1 集群,如果发现 /etc/kubernetes/ssl 目录下的证书过期,那么可以对集群进行证书更新。对于 rke1 创建的 local 集群,需要执行
rke cert rotate
进行证书更新。对于 rke1 创建的下游集群,可以在 rancher ui 的集群管理中进行集群证书更新。 - 对于 rke2 集群,如果发现
/var/lib/rancher/rke2/server/tls/
目录下的证书过期,那么可以对集群进行证书更新。对于 rke2 创建的 local 集群,可以根据文档 https://docs.rke2.io/zh/advanced#%E8%AF%81%E4%B9%A6%E8%BD%AE%E6%8D%A2 进行证书更新。对于 rke2 创建的下游集群,可以在 rancher ui 的集群管理中进行集群证书更新。
有时候,根据以上方法排查后,发现证书都没有过期或者更新证书后 kubelet 依旧报 x509 证书错误。那这种情况就应该是 kubelet 内置的证书过期了。
- 对于 rke1 集群,可以使用命令
openssl x509 -enddate -noout -in "/var/lib/kubelet/pki/kubelet.crt"
检查证书有效期。 - 对于 rke2 集群,可以使用命令
openssl x509 -enddate -noout -in "/var/lib/rancher/rke2/agent/serving-kubelet.crt"
检查证书有效期。
问题分析
Kubelet 会使用一个内置证书,通过是手动指定这个证书,可以通过参数 –tls-cert-file和
–tls-private-key-file 进行配置。如果没有手动指定证书,那么 kubelet 会自动在 /var/lib/kubelet/pki 目录下生成 kubelet.crt 和 kubelet.key 证书文件。这个证书有效期为一年,并会自动更新。
解决方法
rke1
临时的,可以把 kubelet 生成的证书删除,然后重启 kubelet 容器后会自动重新生成证书。
docker exec kubelet rm /var/lib/kubelet/pki/kubelet.crt |
在 Rancher v2.3.3 或 RKE v1.0.0 之前的版本中,没有为 kubelet 配置 --tls-cert-file
和--tls-private-key-file
参数。针对这个问题,在 Rancher v2.3.3 或 RKE v1.0.0 之后的集群配置中,增加了参数 generate_serving_certificate
来自动轮换 kubelet 证书。默认这个参数值为 false
,设置为 true
自动轮换证书。
在 rke 配置或者自定义集群 YAML 配置中添加 generate_serving_certificate 参数:
services: |
注意: 在修改或者添加 generate_serving_certificate 参数之前,请根据文档 https://docs.rancher.cn/docs/rke/config-options/services/_index/#kubelet-%E9%80%89%E9%A1%B9 的说明查看一下 Kubelet Serving Certificate 需求。
rke2
rke2 集群默认是传递了 --tls-cert-file
和--tls-private-key-file
参数,默认配置为 --tls-cert-file=/var/lib/rancher/rke2/agent/serving-kubelet.crt --tls-private-key-file=/var/lib/rancher/rke2/agent/serving-kubelet.key
。
如果在 rke2 集群中查询到这个证书过期,临时的也可以 serving-kubelet 证书然后重启 rke2 服务。
rm -rf /var/lib/rancher/rke2/agent/serving-kubelet.crt |
也可以根据文档 https://docs.rke2.io/zh/advanced#%E8%AF%81%E4%B9%A6%E8%BD%AE%E6%8D%A2 对 rke2 local 集群证书进行更新,或者在 rancher ui 的集群管理中进行集群证书更新。如果执行证书更新后 serving-kubelet 证书没有更新,那么请升级 rke2 版本到 1.28+。