Kubernetes集群的证书默认通常具有一年的有效期(通过kubeadm创建的集群)。一旦这些证书过期,集群的核心组件,尤其是API Server,将无法正常通信,导致集群处于不可用状态(例如,kubectl无法连接、节点变为NotReady)。
本文将手把手教你如何使用官方推荐的kubeadm工具,安全、快速地检查并续订过期的K8s控制平面证书。
准备工作与症状确认
证书过期最明显的症状是:
- kubectl get pods -A 返回连接错误(例如:Unable to connect to the server: x509: certificate has expired or is not yet valid)。
- Kubelet日志显示无法与API Server建立安全连接。
前提条件: 确保您拥有控制平面节点的SSH访问权限,并且可以运行sudo命令。
步骤一:检查证书过期状态
首先,使用kubeadm的内置命令检查集群中所有证书的当前状态和过期时间。
sudo kubeadm certs check-expiration
输出示例(注意EXPIRY列和RESIDUAL TIME列):
CERTIFICATE AUTHORITY EXPIRES_AT RESIDUAL_TIME CERTIFICATE
ca Sep 25, 2025 09:00 UTC 1y signer
... (other signers) ...
CERTIFICATE EXPIRES_AT RESIDUAL_TIME CERTIFICATE
apiserver Sep 25, 2024 09:00 UTC <1d apiserver
apiserver-kubelet-client Sep 25, 2024 09:00 UTC <1d client
... (Many others)
admin.conf Sep 25, 2024 09:00 UTC <1d client
...
如果RESIDUAL TIME显示为负值或极短时间(如<1d),并且EXPIRES_AT是过去的时间,那么这些证书就需要续订。
步骤二:续订集群核心证书
对于通过kubeadm部署的集群,续订过程非常简单。我们只需要在控制平面节点运行一个命令。
注意: 此操作通常不会导致服务中断,因为Kubelet会自动检测并重新加载静态Pod的配置,但建议在维护窗口执行。
续订所有控制平面组件证书(这是最常见和最安全的做法):
# 运行此命令将续订除CA证书以外的所有核心证书
sudo kubeadm certs renew all
# 示例输出:
# [certs] Renewing certificate 'apiserver'
# [certs] Renewing certificate 'apiserver-kubelet-client'
# ...
# [certs] Generated new certificate and key for "admin.conf"
如果您只需要续订特定的证书,例如API Server,可以指定组件名称:
sudo kubeadm certs renew apiserver
步骤三:更新Kubeconfig文件
kubeadm certs renew all命令会自动在/etc/kubernetes/目录下更新所有必要的证书和Kubeconfig文件(如admin.conf, controller-manager.conf, scheduler.conf)。
但是,我们需要确保用于日常操作的本地kubectl配置也使用最新的证书。
如果您的本地~/.kube/config是直接从/etc/kubernetes/admin.conf复制而来,请重新复制和设置权限:
# 假设您在控制平面节点操作
# 备份旧的配置文件 (可选)
cp $HOME/.kube/config $HOME/.kube/config.bak
# 复制新的admin.conf
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 确保正确的用户权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
步骤四:重启控制平面组件和Kubelet
虽然kubeadm会更新磁盘上的证书文件,但运行中的控制平面组件(API Server, Controller Manager, Scheduler)需要重新加载这些文件。
对于通过Kubelet以静态Pod方式运行的组件,Kubelet通常会自动检测文件变化并重启这些Pod。但为了确保立即生效,尤其是当集群处于故障状态时,最可靠的方法是重启Kubelet服务:
sudo systemctl restart kubelet
# 观察日志确认组件重启
sudo journalctl -u kubelet -f
等待几分钟,直到所有的静态Pod(位于/etc/kubernetes/manifests/)重新启动并使用新证书连接到API Server。
步骤五:验证续订结果
最后,再次检查证书的有效期,并验证集群功能是否恢复正常。
- 验证证书时间:
sudo kubeadm certs check-expiration
# 确保 RESIDUAL TIME 现在显示为 1y 或接近 1y
- 验证集群功能:
kubectl get nodes
kubectl get pods -A
如果集群状态恢复正常,且kubectl命令不再报错证书过期,则表示证书续订成功。
汤不热吧