Rancher 证书轮换实战:从过期处理到Kubernetes集群无缝更新
1. 理解Rancher证书轮换的核心概念
在Kubernetes集群管理中,证书就像是集群组件的"身份证",而Rancher作为集群管理平台,需要处理两类证书:Rancher自身证书和Kubernetes集群组件证书。这两类证书就像汽车的保养周期一样,都有明确的有效期,过期后会导致各种"故障灯亮起"。
我遇到过最典型的案例是某次凌晨三点被报警叫醒,发现生产环境集群突然失联。排查后发现是kube-apiserver证书过期,导致所有控制平面组件无法通信。这个惨痛教训让我深刻认识到证书管理的重要性。
Rancher默认会为Kubernetes集群生成以下核心组件证书:
- 控制平面组件:kube-apiserver、kube-controller-manager、kube-scheduler
- 工作节点组件:kubelet、kube-proxy
- 数据存储层:etcd
- 网络组件:ingress-nginx等
这些证书的有效期通常为1年,但不同版本可能有所差异。证书过期时,你会看到类似"x509: certificate has expired or is not yet valid"的错误日志,对应的服务会拒绝连接。
2. 证书过期的应急处理方案
当半夜收到证书过期的报警时,你需要像急诊医生一样快速判断问题类型。以下是两种常见场景的处理方法:
2.1 Kubernetes集群证书过期
症状表现为:
- kubectl命令执行失败
- 节点状态变为NotReady
- Rancher UI显示集群不可用
临时解决方案(适用于RKE集群):
# 检查证书过期时间
kubectl get secrets -n kube-system -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.data.ca\.crt}{"\n"}{end}' | while read secret crt; do echo -n "$secret: "; echo "$crt" | base64 -d | openssl x509 -noout -enddate; done
# 快速恢复步骤(会短暂影响服务)
rke cert rotate --service kube-apiserver
rke cert rotate --service kubelet
2.2 Rancher自身证书过期
症状表现为:
- 无法登录Rancher UI
- 集群Agent报证书错误
- 浏览器提示不安全连接
修复步骤:
# 进入Rancher容器
docker exec -it rancher 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
# 重启服务
docker restart rancher
注意:生产环境建议先在维护窗口期操作,并确保有完整的备份。我曾遇到过某金融客户在交易时段操作导致分钟级服务中断的案例。
3. 通过Rancher UI轮换证书
对于常规维护,Rancher提供了直观的UI操作界面。以下是详细步骤:
- 登录Rancher控制台,进入集群管理页面
- 找到目标集群,点击右侧的⋮菜单
- 选择轮换证书选项
- 在弹出的对话框中可以选择:
- 轮换所有服务证书(保持相同CA)
- 轮换单个服务证书(如仅更新kube-apiserver)
- 点击保存后,Rancher会自动完成以下工作:
- 生成新证书
- 更新集群配置
- 滚动重启相关组件
实战技巧:
- 操作前使用
kubectl get pods -A -w监控组件重启状态 - 对于大型集群,可以分批操作减少影响
- 记得检查
cattle-system命名空间下的Agent Pod是否正常重建
4. 使用RKE CLI进行高级证书管理
对于需要精细控制的场景,RKE命令行工具提供了更多选项:
# 轮换所有证书(不更换CA)
rke cert rotate
# 仅轮换etcd证书
rke cert rotate --service etcd
# 完全轮换CA和所有证书(会导致所有组件重启)
rke cert rotate --rotate-ca
# 生成新证书但不立即应用
rke cert generate --rotate
关键参数说明:
--config:指定集群配置文件路径--rotate-ca:是否轮换根CA证书--service:指定服务类型(kubelet/etcd等)
在某个制造业客户的案例中,我们使用--rotate-ca参数时发现,必须同时更新所有LoadBalancer的CA信任配置,否则会导致入口流量中断。
5. 证书轮换后的必要检查
操作完成后,不能简单认为大功告成。我建议进行以下验证:
- 证书有效期检查:
# 检查apiserver证书
openssl s_client -connect <API_SERVER_IP>:6443 2>/dev/null | openssl x509 -noout -dates
# 检查kubelet证书
openssl s_client -connect <NODE_IP>:10250 2>/dev/null | openssl x509 -noout -dates
- 组件健康状态:
kubectl get componentstatuses
kubectl get nodes
kubectl -n cattle-system get pods
- 特殊Pod检查:
# 这些Pod需要特别注意重建
kubectl get pods -n cattle-system -l app=cattle-cluster-agent
kubectl get pods -n cattle-system -l app=cattle-node-agent
- 日志检查:
kubectl logs -n cattle-system -l app=cattle-cluster-agent --tail=50
journalctl -u kubelet -n 50 --no-pager
6. 处理证书轮换的常见问题
6.1 kubelet证书未更新问题
即使执行了轮换操作,kubelet证书有时仍可能保持旧证书。这是因为:
- 在Rancher v2.3.3之前,kubelet默认使用自生成证书
- 证书存储在
/var/lib/kubelet/pki目录 - 需要手动删除或配置自动轮换
解决方案:
# 临时解决方法
docker exec kubelet rm /var/lib/kubelet/pki/kubelet.{crt,key}
systemctl restart kubelet
# 永久解决方案(修改集群配置)
services:
kubelet:
generate_serving_certificate: true
6.2 集群Agent连接失败
证书变更会导致token失效,需要重建以下关键Pod:
- cattle-cluster-agent
- cattle-node-agent
- kube-api-auth
- ingress-nginx-controller
可以使用以下命令强制重建:
kubectl delete pod -n cattle-system -l app=cattle-cluster-agent
kubectl delete pod -n cattle-system -l app=cattle-node-agent
6.3 etcd证书轮换异常
当etcd证书轮换失败时,可以尝试:
- 手动备份etcd数据目录
- 逐个节点执行维护操作
- 使用
etcdctl endpoint health检查状态
7. 构建证书管理的长效机制
为了避免半夜被报警吵醒,我建议建立以下机制:
-
监控告警:
- 使用Prometheus监控证书过期时间
- 设置提前30天的告警阈值
# PromQL示例 kubelet_server_expiration_seconds - time() < 30 * 24 * 3600 -
定期轮换策略:
- 每6个月主动轮换一次证书
- 使用GitOps工具自动化流程
-
文档记录:
- 维护证书轮换的SOP文档
- 记录每次轮换的日期和操作
-
灾难恢复演练:
- 定期模拟证书过期场景
- 测试备份恢复流程
在大型金融客户的实践中,我们建立了完整的证书生命周期管理平台,将证书相关事件减少了90%。这证明预防性维护远比应急处理更高效。
更多推荐
所有评论(0)