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操作界面。以下是详细步骤:

  1. 登录Rancher控制台,进入集群管理页面
  2. 找到目标集群,点击右侧的菜单
  3. 选择轮换证书选项
  4. 在弹出的对话框中可以选择:
    • 轮换所有服务证书(保持相同CA)
    • 轮换单个服务证书(如仅更新kube-apiserver)
  5. 点击保存后,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. 证书轮换后的必要检查

操作完成后,不能简单认为大功告成。我建议进行以下验证:

  1. 证书有效期检查
# 检查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
  1. 组件健康状态
kubectl get componentstatuses
kubectl get nodes
kubectl -n cattle-system get pods
  1. 特殊Pod检查
# 这些Pod需要特别注意重建
kubectl get pods -n cattle-system -l app=cattle-cluster-agent
kubectl get pods -n cattle-system -l app=cattle-node-agent
  1. 日志检查
kubectl logs -n cattle-system -l app=cattle-cluster-agent --tail=50
journalctl -u kubelet -n 50 --no-pager

6. 处理证书轮换的常见问题

6.1 kubelet证书未更新问题

即使执行了轮换操作,kubelet证书有时仍可能保持旧证书。这是因为:

  1. 在Rancher v2.3.3之前,kubelet默认使用自生成证书
  2. 证书存储在/var/lib/kubelet/pki目录
  3. 需要手动删除或配置自动轮换

解决方案

# 临时解决方法
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证书轮换失败时,可以尝试:

  1. 手动备份etcd数据目录
  2. 逐个节点执行维护操作
  3. 使用etcdctl endpoint health检查状态

7. 构建证书管理的长效机制

为了避免半夜被报警吵醒,我建议建立以下机制:

  1. 监控告警

    • 使用Prometheus监控证书过期时间
    • 设置提前30天的告警阈值
    # PromQL示例
    kubelet_server_expiration_seconds - time() < 30 * 24 * 3600
    
  2. 定期轮换策略

    • 每6个月主动轮换一次证书
    • 使用GitOps工具自动化流程
  3. 文档记录

    • 维护证书轮换的SOP文档
    • 记录每次轮换的日期和操作
  4. 灾难恢复演练

    • 定期模拟证书过期场景
    • 测试备份恢复流程

在大型金融客户的实践中,我们建立了完整的证书生命周期管理平台,将证书相关事件减少了90%。这证明预防性维护远比应急处理更高效。

更多推荐