K8s证书自动轮换与手动更新全攻略:从根CA到kubelet的实战指南
1. Kubernetes证书体系全景解析当你第一次看到Kubernetes集群中密密麻麻的证书文件时可能会感到头皮发麻。别担心我们先来理清这个证书森林的结构。Kubernetes的证书体系就像一棵大树根CA是树干各类组件证书是树枝而kubelet证书则是树叶。**根CA证书ca.crt**是整个证书体系的信任锚点相当于身份证签发机构。我见过不少运维同学在紧急处理证书问题时第一个忽略的就是这个根证书结果越修问题越大。根CA的有效期通常最长在主流发行版中多为10年有些定制版本甚至达到100年。往下走是Master组件证书群包括apiserver.crtAPI服务的身份证front-proxy-client.crt前端代理的通行证etcd相关证书分布式存储的密钥controller-manager和scheduler证书控制平面的身份凭证这些证书的有效期差异很大原生Kubernetes通常是1年而某些企业发行版会延长到10年。我去年处理过一个生产事故就是因为没注意到apiserver.crt的有效期只有1年导致整个控制平面突然瘫痪。最容易被忽视的是kubelet证书它位于每个Worker节点上。在早期版本中这个证书的有效期也是1年但从1.8版本开始引入了自动轮换机制。实测发现很多证书问题都源于kubelet证书过期特别是那些用老版本部署的环境。2. 证书有效期检查实战技巧发现集群异常时第一个要做的就是检查证书有效期。这里分享几个我常用的救命命令对于Master节点这个for循环能一次性检查所有证书for cert in $(find /etc/kubernetes -type f \( -name *.crt -o -name *.pem \)); do echo 检查证书: $cert openssl x509 -in $cert -noout -dates doneWorker节点上重点关注kubelet证书openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep -A2 Validity输出结果会显示证书的有效起止时间比如Not Before: Jan 1 00:00:00 2022 GMT Not After : Dec 31 23:59:59 2022 GMT重要经验建议把证书检查加入日常监控。我在生产环境部署的监控方案是用Prometheus的textfile收集器定期执行证书检查通过Grafana展示证书剩余天数设置剩余30天告警阈值这样能提前发现问题避免半夜被报警电话叫醒。曾经有个客户集群在春节假期期间证书过期就是因为缺少这类监控。3. 全集群证书更新操作指南当发现整个集群证书即将过期时需要按照特定顺序进行操作。根据我处理过20集群的经验正确的操作流程应该是3.1 准备工作首先备份所有关键文件# Master节点 cp -r /etc/kubernetes /etc/kubernetes.bak cp -r /etc/ssl/etcd /etc/ssl/etcd.bak # Worker节点 cp /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak cp /var/lib/kubelet/pki/kubelet-client-current.pem /var/lib/kubelet/pki/kubelet-client-current.pem.bak特别注意不同Kubernetes版本的操作命令差异很大1.12版本使用kubeadm alpha phase certs1.16版本使用kubeadm alpha certs renew3.2 Master节点证书更新在第一个Master节点执行以1.16版本为例kubeadm alpha certs renew all --config /etc/kubernetes/kubeadm-config.yaml然后同步证书到其他Master节点rsync -avz /etc/kubernetes/ssl/ rootother-master:/etc/kubernetes/ssl/3.3 配置文件更新所有Master节点需要重新生成kubeconfigmv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.bak kubeadm alpha kubeconfig user --client-nameadmin /etc/kubernetes/admin.conf cp /etc/kubernetes/admin.conf /root/.kube/config3.4 Worker节点重新加入生成新的bootstrap tokenkubeadm token create --ttl0在Worker节点上kubeadm join --token 新token --discovery-token-ca-cert-hash sha256:hash值踩坑提醒遇到过不少人在这一步卡住常见问题有防火墙阻止了6443端口旧证书没有清理干净token有效期设置过短4. 自动轮换机制深度配置从Kubernetes 1.8开始引入的证书自动轮换功能能大幅降低运维负担。但需要正确配置才能发挥作用。4.1 检查当前配置查看kubelet是否启用自动轮换cat /var/lib/kubelet/config.yaml | grep rotateCertificates如果没有输出需要修改kubelet配置echo rotateCertificates: true /var/lib/kubelet/config.yaml systemctl restart kubelet4.2 调整Controller Manager修改所有Master节点的controller-manager配置# /etc/kubernetes/manifests/kube-controller-manager.yaml spec: containers: - command: - --experimental-cluster-signing-duration87600h这个参数将证书有效期设为10年87600小时。4.3 永久Token配置创建不过期的bootstrap token# /etc/kubernetes/kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: InitConfiguration bootstrapTokens: - token: 7t4r49.9d3j5q8e2y1o6p7x ttl: 0实战技巧自动轮换虽然方便但在资源紧张的环境中可能导致证书请求堆积。建议监控以下指标certificatesigningrequests_countkubelet_certificate_manager_client_expiration_seconds5. 跨版本兼容处理方案在混合版本环境中处理证书问题需要特别注意兼容性。我总结了几种常见场景的解决方案5.1 1.12与1.16混合集群这种情况下最稳妥的做法是先将所有节点升级到相同次要版本使用新版kubeadm统一更新证书特别注意etcd证书的格式差异5.2 证书格式转换老版本生成的证书可能需要转换# PEM转DER openssl x509 -in old.crt -outform der -out new.der # 合并证书链 cat ca.crt intermediate.crt fullchain.crt5.3 特殊组件处理某些插件如Metrics Server、Dashboard需要单独处理# 删除旧Secret让系统自动创建新的 kubectl delete secret -n kube-system $(kubectl get secret -n kube-system | grep kubernetes.io/tls | awk {print $1})在处理证书问题时保持组件版本一致是关键。曾经遇到一个案例因为controller-manager版本比其他组件低导致自动签发的证书不被认可。6. 证书问题诊断与修复当集群出现证书相关故障时可以按照以下步骤排查6.1 常见症状识别API Server不可用检查apiserver.crtNode状态为NotReady检查kubelet-client证书Pod无法访问API检查ServiceAccount token6.2 日志分析技巧查看kubelet日志journalctl -u kubelet -n 100 | grep -i certAPI Server的证书错误通常表现为x509: certificate has expired or is not yet valid6.3 应急修复方案对于关键业务集群可以临时修改系统时间仅限紧急情况# 将时间调整到证书有效期内 date -s 2022-01-01 12:00:00然后立即执行证书更新操作。完成后记得同步正确时间ntpdate pool.ntp.org重要提醒这种方法只能争取修复时间窗口不能作为长期解决方案。我见过有人用这种方法解决问题结果导致日志系统时间错乱反而更难排查问题。7. 最佳实践与长期维护根据多年运维经验我总结出以下证书管理黄金法则版本一致性确保所有节点的kubeadm、kubelet版本一致监控全覆盖对每个证书设置过期告警定期演练每季度执行一次证书更新演练文档更新记录每次证书变更的详细操作步骤推荐使用以下工具辅助管理cert-manager自动化证书管理vault集中式证书存储ansible批量执行证书更新对于大型集群可以考虑定制证书策略# kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration controllerManager: extraArgs: cluster-signing-duration: 87600h0m0s feature-gates: RotateKubeletServerCertificatetrue最后提醒证书更新操作最好在业务低峰期进行并确保有完整的回滚方案。曾经有次在交易高峰期更新证书虽然操作本身成功但因为大量连接中断导致业务出现波动。现在我的习惯是先在测试环境验证然后分批次在生产环境执行。