Kubeadm部署K8S集群证书过期更新完整方法
在Kubeadm部署的Kubernetes集群中,证书过期也是比较常见的情况,在证书过期后,会出现kubectl命令无法连接APIServer、kubelet服务异常等问题,直接影响集群可用性。本身K8S内部证书管理比较复杂,如果刚接触K8S不久,很可能感觉束手无策。我将结合实际故障场景,详细介绍证书过期的排查思路及Master节点、Node节点的证书更新完整流程,使K8S集群快速恢复正常运行。
一、故障现象与原因分析
当集群证书过期时,会出现以下的故障现象,可作为问题排查的核心依据:
kubectl命令执行失败
在Master节点执行kubectl get node时,提示连接APIServer拒绝,报错信息为:The connection to the server 112.98.x.x:6443 was refused - did you specify the right host or port?
kubelet服务日志报错:查看kubelet服务日志(journalctl -fu kubelet),会出现证书过期相关的错误,例如:E0923 15:58:05.341773 1233 bootstrap.go:263] Part of the existing bootstrap client certificate is expired: 2025-09-15 10:40:36 +0000 UTC
故障的根源为Kubeadm生成的证书默认有有效期的限制,过期后各组件间的身份认证失败,导致集群通信中断。解决思路为备份旧证书与配置文件后,重新生成新证书及组件配置文件,并同步至所有节点。
二、准备工作
- 已获取Master节点和所有Node节点的root权限或sudo权限;
- 明确Master节点的IP地址(如112.98.x.x)及各Node节点的名称(如k8s-node01)、IP地址;
- 确保集群各节点网络通畅,Master节点可通过SSH连接所有Node节点;
- 提前备份集群重要数据,避免操作失误导致数据丢失。
三、Master节点证书更新操作
Master节点作为集群的控制节点,存储着核心证书和配置文件,需优先完成证书更新,步骤如下:
1、备份旧证书与配置文件
# 创建备份目录
mkdir /tmp/backup
# 进入证书存储目录
cd /etc/kubernetes/pki/
# 备份核心证书文件
mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} /tmp/backup
# 进入配置文件目录,备份组件配置文件
cd /etc/kubernetes/
以上操作备份APIServer、ETCD客户端、Kubelet客户端等核心证书,以及管理员、控制器管理器等组件的配置文件,为故障回滚提供保障。
2、重新生成证书与配置文件
使用kubeadm的init phase子命令重新生成证书和组件配置文件,指定Master节点的IP地址确保APIServer正常监听:
# 重新生成所有证书,替换<master-IP>为实际Master节点IP(如112.98.x.x)
kubeadm init phase certs all --apiserver-advertise-address <master-IP>
# 重新生成所有组件配置文件
kubeadm init phase kubeconfig all
此步骤操作为了通过kubeadm的官方命令生成符合集群要求的新证书,避免手动生成证书导致的格式不兼容问题;重新生成的配置文件会引用新证书,确保组件间认证正常。
3、重启kubelet服务并清理旧证书链接
证书和配置文件更新后,需重启kubelet服务使配置生效,同时清理旧的kubelet客户端证书符号链接:
# 重启kubelet服务
systemctl restart kubelet.service
# 查看kubelet服务状态,确认服务正常启动
systemctl status kubelet
# 查看kubelet证书目录,确认生成新证书
ls /var/lib/kubelet/pki -lht
# 删除旧的kubelet客户端证书符号链接(该链接指向已过期的证书)
rm /var/lib/kubelet/pki/kubelet-client-current.pem
# 再次重启kubelet服务,使证书清理生效
systemctl restart kubelet.service
# 再次查看服务状态,确认无报错
systemctl status kubelet
4、配置kubectl客户端认证
将新生成的admin.conf配置文件复制到当前用户的.kube目录下,确保kubectl命令能正常访问集群:
# 复制配置文件到用户目录
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修改配置文件权限,确保当前用户可读写
chown $(id -u):$(id -g) $HOME/.kube/config
四、Node节点证书更新操作
Node节点需使用Master节点生成的新kubelet配置文件,同步后完成证书更新,步骤如下:
1、在Master节点生成Node节点专属kubelet配置文件
每个Node节点需有专属的kubelet配置文件(关联节点身份),在Master节点使用kubeadm命令生成,替换命令中的节点名为实际Node节点名称(如k8s-node01):
# 生成指定节点的kubelet配置文件,替换k8s-node01为实际Node节点名
/usr/bin/kubeadm.1.15 alpha kubeconfig user --org system:nodes --client-name system:node:k8s-node01 > /tmp/kubelet.conf
# 通过SSH将配置文件复制到目标Node节点的/root目录,替换192.168.31.143为实际Node节点IP
scp /tmp/kubelet.conf 192.168.31.143:/root
注:Node节点的身份标识为system:node:<节点名>,通过指定组织和客户端名称生成符合认证要求的配置文件,确保Node节点能正常接入集群。
2、在Node节点应用新配置并重启服务
登录Node节点,备份旧配置文件后应用新配置,清理旧证书并重启kubelet服务:
# 备份旧的kubelet配置文件
mv /etc/kubernetes/kubelet.conf{,.bak}
# 将Master节点复制的新配置文件移动到指定目录
cp /root/kubelet.conf /etc/kubernetes/
# 删除旧的kubelet客户端证书
rm -rf /var/lib/kubelet/pki/kubelet-client*
# 编辑kubelet配置文件,指定新证书路径(部分版本需手动配置)
vi /etc/kubernetes/kubelet.conf
# 确保配置文件中包含以下两行(指向自动生成的当前证书)
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
# 重启kubelet服务
systemctl restart kubelet
# 查看kubelet证书目录,确认新证书生成
ls /var/lib/kubelet/pki/
# 实时查看kubelet日志,确认服务正常运行
journalctl -fu kubelet
注:备份旧配置文件避免覆盖失误,应用新配置文件后清理旧证书,确保kubelet加载新证书;通过日志查看服务状态,及时排查配置错误。
五、集群状态验证
所有节点操作完成后,在Master节点执行以下命令验证集群状态:
# 查看节点状态,确认所有节点状态为Ready
kubectl get node
# 查看集群组件状态,确认控制平面组件正常运行
kubectl get cs
若输出结果中所有节点状态为“Ready”,且控制平面组件(scheduler、controller-manager、etcd)状态为“Healthy”,则说明证书更新成功,集群恢复正常。
写在最后:
任何操作一定要备份
所有操作前必须备份证书和配置文件,若更新失败可通过备份文件回滚;
定期检查
建议通过监控工具(如Prometheus+Grafana)定期检查证书有效期,避免证书过期导致集群故障。

浙公网安备 33010602011771号