kubeadm更新kubernetes证书实现方式
作者:alden_ygq
现象
在 Kubernetes 的运维工作中,k8s证书需要实时监控,避免因过期导致kubelet 报错,集群无法访问,比如像这样:
kubelet 报 x509: certificate has expired or is not yet valid
那么当出现证书过期的时候,应该如何续期呢,下面就基于 kubeadm 安装的 kubernetes 集群做续期操作。
查看证书有效期
ssh 登录k8s集群随机master 节点执行,查看输出,只要 RESIDUAL TIME < 30 天,就建议提前续期,防止遗忘导致过期。
kubeadm certs check-expiration
输出示例:
CERTIFICATE EXPIRES RESIDUAL TIME apiserver 2025-09-10 7d apiserver-etcd-client 2025-09-10 7d front-proxy-client 2025-09-10 7d ...
更新证书流程

备份当前配置
# 备份 Kubernetes 配置目录 cp -r /etc/kubernetes /etc/kubernetes-$(date +%Y%m%d).bak # 如有必要,备份 etcd 数据目录 cp -r /data/etcd /data/etcd-$(date +%Y%m%d).bak # 备份 kubeconfig 文件 cp ~/.kube/config ~/.kube/config.bak.$(date +%F)
说明:
- /etc/kubernetes/pki 目录放证书;
- /etc/kubernetes/manifests 是静态 Pod 定义
注意:备份操作需要在所有 master 节点上都需要执行
更新 Master 节点证书
Master 节点上的证书更新是操作的核心,请在所有 Master 节点上执行以下操作:
更新所有证书
sudo kubeadm certs renew all
此命令会更新 /etc/kubernetes/pki/ 目录下的所有证书,并生成新的 admin.conf、controller-manager.conf、scheduler.conf 等文件。
更新 kubeconfig 文件
将新生成的 admin.conf 复制到你的用户目录并设置正确的权限
sudo cp /etc/kubernetes/admin.conf ~/.kube/config sudo chown $(id -u):$(id -g) ~/.kube/config
注意:对于高可用 (HA) 集群,在完成一个 Master 节点的证书更新后,需要将更新的证书文件(通常在 /etc/kubernetes/pki/ 目录下,但注意不要覆盖仍有效的 CA 密钥)手动同步到其他 Master 节点,并在每个节点上重复更新 kubeconfig 和重启组件的步骤。
重启控制平面组件
证书更新后,需要重启相关的控制平面组件以加载新证书。由于这些组件通常是以静态 Pod 方式运行,重启节点上的 kubelet 服务即可:
sudo systemctl restart kubelet
kubelet 会重建所有控制平面的静态 Pod(apiserver, controller-manager, scheduler, etcd)。
验证 Master 证书
运行命令检查证书有效期,确认已更新:
kubeadm certs check-expiration kubectl get nodes # 测试 kubectl 是否正常工作
处理 Node 节点证书
Node 节点(工作节点)的 kubelet 证书通常启用了自动轮换机制(Kubernetes v1.12+ 默认开启)。主要需要确保该功能正常。
检查 kubelet 自动轮换
在每个 Node 节点上,检查 kubelet 配置:
cat /var/lib/kubelet/config.yaml | grep rotateCertificates # 或者查看进程参数 ps aux | grep kubelet | grep rotate
输出中应包含 rotateCertificates: true 或 --rotate-certificates 参数。
批准 CSR(如有必要)
如果某个 Node 节点的证书即将过期或已过期且未自动更新,用户可以在 Master 节点上批准其证书签名请求(CSR):
# 查看所有 CSR kubectl get csr # 批准所有 Pending 状态的 CSR kubectl get csr -o name | xargs kubectl certificate approve
批准后,kubelet 会自动下载新证书。
强制重建证书(仅在自动轮换失效时)
如果证书已过期且自动轮换失效,可在问题 Node 节点上执行:
sudo systemctl stop kubelet sudo rm -rf /var/lib/kubelet/pki/* sudo systemctl start kubelet
之后在 Master 节点上批准该节点新生成的 CSR。
更新后验证
完成所有操作后,进行整体验证:
# 检查所有节点状态是否为 Ready kubectl get nodes # 检查 kube-system 命名空间下的所有 Pod 是否运行正常 kubectl get pods -n kube-system # 可以创建一个测试 Pod 并执行命令 kubectl run test-pod --image=nginx --restart=Never --rm -it -- nginx -v
长期维护建议
- 定期检查:建议每 3 个月执行一次
kubeadm certs check-expiration来监控证书有效期。 - 选择更新时机:在业务低峰期进行证书更新操作,并在证书到期前至少 1 个月完成更新。
- 考虑自动化:对于大规模集群,可以考虑使用 Ansible 等自动化工具编排证书更新流程。
- 监控与告警:将证书过期时间监控集成到 Prometheus 和 Alertmanager 等监控系统中,以便及时收到告警。
重要提醒
证书更新是关键的集群维护操作。务必提前备份,并在测试环境中熟练流程后再在生产环境操作。对于 HA 集群,注意证书的同步问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
