欢迎光临
我们一直在努力

K8s 证书过期了怎么办?手把手教你手动更新集群核心组件的有效期

Kubernetes集群的证书默认通常具有一年的有效期(通过kubeadm创建的集群)。一旦这些证书过期,集群的核心组件,尤其是API Server,将无法正常通信,导致集群处于不可用状态(例如,kubectl无法连接、节点变为NotReady)。

本文将手把手教你如何使用官方推荐的kubeadm工具,安全、快速地检查并续订过期的K8s控制平面证书。

准备工作与症状确认

证书过期最明显的症状是:

  1. kubectl get pods -A 返回连接错误(例如:Unable to connect to the server: x509: certificate has expired or is not yet valid)。
  2. 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。

步骤五:验证续订结果

最后,再次检查证书的有效期,并验证集群功能是否恢复正常。

  1. 验证证书时间:
sudo kubeadm certs check-expiration
# 确保 RESIDUAL TIME 现在显示为 1y 或接近 1y
  1. 验证集群功能:
kubectl get nodes
kubectl get pods -A

如果集群状态恢复正常,且kubectl命令不再报错证书过期,则表示证书续订成功。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » K8s 证书过期了怎么办?手把手教你手动更新集群核心组件的有效期
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址