最近在维护 Rancher 管理的 RKE2/K3s 集群时,我发现一个值得注意的现象:在 2025 年 5 月版本发布之前,rke2 certificate check 和 k3s certificate check 命令不会检查 kube-controller-manager 和 kube-scheduler 组件的证书状态。这个现象在独立部署的集群和 Rancher 托管的集群中表现不同,可能会给集群运维带来潜在风险。
当你在 Rancher 托管的 RKE2/K3s 集群上执行证书检查命令时(版本低于 v1.30.13+rke2r1/v1.30.13+k3s1 等指定版本),输出结果中会明显缺少 kube-controller-manager 和 kube-scheduler 的证书信息。以下是典型输出示例的对比:
bash复制# 独立集群的完整输出(包含所有组件)
$ rke2 certificate check
INFO[0000] Checking certificates for controller-manager
INFO[0000] /var/lib/rancher/rke2/server/tls/client-controller.crt: certificate CN=system:kube-controller-manager is ok...
INFO[0000] Checking certificates for scheduler
INFO[0000] /var/lib/rancher/rke2/server/tls/client-scheduler.crt: certificate CN=system:kube-scheduler is ok...
# Rancher托管集群的输出(缺少上述两部分)
$ rke2 certificate check
INFO[0000] Server detected, checking agent and server certificates
INFO[0000] Checking certificates for kube-proxy
...
# 注意:没有controller-manager和scheduler的检查结果
这种差异可能导致管理员误以为集群所有证书都健康,而实际上两个关键组件的证书状态未被验证。
根据官方说明,此问题影响以下版本的 RKE2/K3s 集群:
RKE2:
K3s:
重要提示:即使你的集群运行的是上述版本范围内的最新补丁版本,只要未达到指定的最小版本号,仍然会受此问题影响。
问题的本质在于证书生成方式的不同。在早期版本中:
--cert-dir 指定的子目录中(默认为 /var/lib/rancher/rke2/server/tls/kube-scheduler 和 /var/lib/rancher/rke2/server/tls/kube-controller-manager)mermaid复制graph LR
A[独立集群] --> B[Supervisor生成所有证书]
C[Rancher集群] --> D[Supervisor生成大部分证书]
C --> E[组件自生成scheduler/controller-manager证书]
certificate check 命令原本设计只检查特定目录下的证书文件:
/var/lib/rancher/rke2/server/tls/ 下的主证书文件/var/lib/rancher/rke2/agent/ 下的客户端证书这种设计在早期版本中没有问题,因为所有证书都在同一目录。但随着架构变化,检查逻辑未相应更新。
新版本进行了以下架构调整:
bash复制# 新版本中的证书位置示例
/var/lib/rancher/rke2/server/tls/client-kube-scheduler.crt
/var/lib/rancher/rke2/server/tls/client-kube-controller-manager.crt
虽然组件能自动生成证书,但缺少监控仍可能引发问题:
证书过期风险:
配置不一致风险:
故障排查盲区:
某客户集群曾出现以下故障模式:
经验教训:关键组件证书缺失监控可能导致级联故障,且排查耗时。
最彻底的解决方案是升级到2025年5月或之后发布的版本:
RKE2 升级目标版本:
K3s 升级目标版本:
升级步骤示例:
bash复制# 对于RKE2
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION="v1.32.5+rke2r1" sh -
systemctl restart rke2-server
# 对于K3s
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.32.5+k3s1" sh -
systemctl restart k3s
如果无法立即升级,可以手动实现证书检查:
/usr/local/bin/check_k8s_certs.sh:bash复制#!/bin/bash
check_cert() {
local component=$1
local cert_dir="/var/lib/rancher/rke2/server/tls/${component}"
if [ -d "${cert_dir}" ]; then
for cert in $(find "${cert_dir}" -name "*.crt"); do
echo "Checking ${component} certificate: ${cert}"
openssl x509 -in "${cert}" -noout -dates
done
else
echo "WARN: ${component} cert directory not found at ${cert_dir}"
fi
}
check_cert "kube-scheduler"
check_cert "kube-controller-manager"
bash复制# 每天检查一次并记录
0 0 * * * /usr/local/bin/check_k8s_certs.sh >> /var/log/k8s_cert_check.log
升级后,确认证书检查命令现在包含所有组件:
bash复制$ rke2 certificate check | grep -E 'controller-manager|scheduler'
INFO[0000] Checking certificates for controller-manager
INFO[0000] Checking certificates for scheduler
同时检查证书位置是否已变更:
bash复制ls /var/lib/rancher/rke2/server/tls/client-kube-{scheduler,controller-manager}.crt
统一监控所有证书:
文档记录:
定期演练:
备份关键数据:
bash复制# 备份证书目录
tar czvf /backup/rke2_tls_$(date +%F).tar.gz /var/lib/rancher/rke2/server/tls
变更窗口选择:
验证顺序:
考虑证书集中管理:
基础设施即代码:
建立证书清单:
markdown复制| 组件 | 证书位置 | 生成方式 | 默认有效期 |
|----------------------|------------------------------------------|----------------|------------|
| kube-apiserver | /var/lib/rancher/rke2/server/tls/... | Supervisor生成 | 1年 |
| kube-controller-manager | /var/lib/rancher/rke2/server/tls/... | 组件生成(*) | 1年 |
(*)2025.05版本后将改为Supervisor生成
当控制器或调度器出现连接问题时:
检查组件日志:
bash复制journalctl -u rke2-server -n 100 | grep -i cert
手动验证证书:
bash复制openssl x509 -in /var/lib/rancher/rke2/server/tls/kube-controller-manager/client.crt -noout -text
检查证书链:
bash复制openssl verify -CAfile /var/lib/rancher/rke2/server/tls/server-ca.crt \
/var/lib/rancher/rke2/server/tls/kube-controller-manager/client.crt
证书续期失败:
bash复制systemctl restart rke2-server
权限问题:
bash复制chown -R root:root /var/lib/rancher/rke2/server/tls
chmod 755 /var/lib/rancher/rke2/server/tls
版本兼容性问题:
证书检查工具增强版:
bash复制# 扩展版检查脚本
curl -sL https://example.com/check_certs.sh | bash -s -- --all
Kubernetes健康检查工具:
bash复制kubectl get --raw='/readyz?verbose' | jq .
证书过期监控:
bash复制# 使用kubelet证书管理器检查
/var/lib/rancher/rke2/bin/kubelet --certificate-manager-inspect
在实际运维中,我们团队发现这个问题通常会在两种情况下暴露:一是执行安全审计时发现证书检查不完整,二是证书实际过期导致故障。因此建议即使暂时无法升级,也至少要通过手动方式监控这些"隐藏"证书的状态。