Kubernetes证书过期怎么处理:kubeadm续期、验证与回滚

API Server 无法访问、kubectl 报 x509 或控制面组件反复重启时,Kubernetes证书过期往往是高优先级排查项。本文按影响范围、续期、验证和回滚拆解生产处理流程。

本文定位与适用场景

  • 面向 kubeadm 部署的 Kubernetes 集群,重点讲控制面证书续期。
  • 适用于 kubectl 报 x509、API Server 访问异常、控制面组件证书过期等场景。
  • 如果使用托管 Kubernetes 或第三方发行版,应优先参考对应平台文档,避免覆盖平台自动管理的证书。

1. 先判断影响范围:是客户端、控制面还是 etcd

Kubernetes 证书链路较多,过期位置不同,现象和处理方式也不同。排查时建议先把问题分成三类:

过期位置 常见现象 主要处理方向
kubeconfig 客户端证书 kubectl 报 x509、用户无法认证 更新 admin.conf、controller-manager.conf、scheduler.conf 等 kubeconfig
控制面服务端证书 kube-apiserver 启动失败或组件互信异常 使用 kubeadm renew 对应证书并重启静态 Pod
etcd 相关证书 API Server 无法访问 etcd、etcd 日志报 TLS 错误 续期 etcd server、peer、healthcheck-client、apiserver-etcd-client 证书
kubelet 客户端证书 节点 NotReady、kubelet 认证失败 检查 kubelet 证书轮转和 bootstrap 配置

表格之后要特别注意:证书过期处理的第一步是定位证书,不是直接执行全量续期。全量续期通常可行,但在多控制面、外置 etcd 或平台托管环境中,盲目覆盖文件可能扩大影响。

Kubernetes证书过期排查路径图

图 1:Kubernetes 证书过期可能影响 kubectl、控制面组件、etcd 与 kubelet 的访问链路。

2. Kubernetes证书过期的常见现象与定位命令

2.1 常见错误信号

常见报错包括:

Unable to connect to the server: x509: certificate has expired or is not yet valid
The connection to the server localhost:8080 was refused
certificate has expired or is not yet valid
remote error: tls: bad certificate

这些报错不能直接等同于“所有证书都过期”。例如本机时间错误、kubeconfig 指向错误、负载均衡转发到异常控制面节点,也可能出现类似 TLS 问题。

2.2 使用 kubeadm 检查证书有效期

在 kubeadm 集群中,优先使用官方命令查看证书状态:

sudo kubeadm certs check-expiration

旧版本 kubeadm 可能使用:

sudo kubeadm alpha certs check-expiration

如果 API Server 无法访问,仍可在控制面节点本地查看证书文件:

sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
sudo openssl x509 -in /etc/kubernetes/pki/apiserver-etcd-client.crt -noout -dates
sudo openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -noout -dates

2.3 检查节点时间与证书路径

证书校验依赖系统时间。排查时建议同时确认:

date -u
timedatectl status
sudo find /etc/kubernetes/pki -name "*.crt" -maxdepth 3 -print

如果节点时间漂移较大,即使证书没有真实过期,也可能出现 not yet valid 或 expired 相关错误。

3. kubeadm 证书续期前的准备

3.1 先备份证书、kubeconfig 和 etcd

证书续期属于控制面变更。建议至少备份下面三类内容:

BACKUP_DIR="/root/k8s-cert-backup-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p "$BACKUP_DIR"
sudo cp -a /etc/kubernetes/pki "$BACKUP_DIR/pki"
sudo cp -a /etc/kubernetes/*.conf "$BACKUP_DIR/"
sudo test -d "$BACKUP_DIR/pki" && sudo ls -l "$BACKUP_DIR"

更稳妥的做法是在证书续期前同步生成 etcd 快照,并记录快照校验值。证书文件备份用于回退文件,etcd 快照用于应对控制面状态异常,二者不能互相替代。

3.2 确认 kubeadm 配置和版本

建议检查 kubeadm 版本与集群版本:

kubeadm version
kubectl version --short
sudo kubeadm config view

如果 kubectl 已无法访问,可先在控制面节点本地查看 kubeadm 版本,并从 /etc/kubernetes/manifests//etc/kubernetes/pki/ 确认静态 Pod 与证书布局。

3.3 多控制面集群要逐节点规划

多控制面集群中,通常需要在每个控制面节点处理本地证书和 kubeconfig,并确保负载均衡不会持续转发到异常节点。建议按节点分批处理:

  1. 从负载均衡后端摘除一个控制面节点。
  2. 在该节点完成备份、续期和组件重启。
  3. 验证本节点 API Server 与 etcd 链路恢复。
  4. 加回负载均衡,再处理下一个节点。

这样可以降低一次性处理所有控制面节点带来的不可用风险。

4. 执行 kubeadm 续期:renew all 还是按证书处理

4.1 查看可续期证书清单

sudo kubeadm certs renew --help

常见子命令包括 allapiserverapiserver-kubelet-clientapiserver-etcd-clientetcd-serveretcd-peerfront-proxy-client 等。具体名称以当前 kubeadm 版本输出为准。

4.2 全量续期适合什么场景

如果集群由 kubeadm 标准方式部署,证书均由 kubeadm 管理,且维护窗口允许重启控制面组件,可以考虑:

sudo kubeadm certs renew all

全量续期后通常需要重启控制面静态 Pod 或 kubelet,让组件重新加载证书。执行 renew 只会更新证书文件,不等于所有组件已经使用新证书。

4.3 按证书续期适合什么场景

如果只确认某个证书过期,或集群存在外置 etcd、自定义 CA、第三方平台接管等情况,更适合按证书处理。例如:

sudo kubeadm certs renew apiserver
sudo kubeadm certs renew apiserver-kubelet-client
sudo kubeadm certs renew apiserver-etcd-client

对于外置 etcd 或自定义证书体系,不建议直接套用 kubeadm 默认路径,应先确认该证书是否由 kubeadm 管理。

kubeadm证书续期与验证流程图

图 2:从证书检查、续期范围选择到组件重启和验证的决策流程。

5. 续期后的组件重启与 kubeconfig 更新

5.1 重启静态 Pod 控制面组件

kubeadm 控制面通常通过 kubelet 管理静态 Pod。证书续期后,可以通过重启 kubelet 或临时移动静态 Pod manifest 触发组件重建。更常用的低复杂度方式是:

sudo systemctl restart kubelet

然后观察控制面组件:

sudo crictl ps | grep kube
sudo crictl logs <container-id>
kubectl -n kube-system get pods -o wide

如果没有安装 crictl,需要使用当前容器运行时对应工具查看静态 Pod 容器日志。

5.2 更新 admin.conf 到运维用户目录

续期 kubeconfig 相关证书后,需要把新的 admin.conf 同步到使用 kubectl 的用户目录:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果 CI/CD、GitOps 或自动化平台使用独立 kubeconfig,也要逐一确认是否需要更新,避免平台仍使用旧证书访问集群。

5.3 kubelet 证书轮转另行检查

kubelet 客户端证书通常通过证书轮转机制处理。可检查 kubelet 配置和证书目录:

sudo ls -l /var/lib/kubelet/pki/
sudo grep -R "rotateCertificates" /var/lib/kubelet/config.yaml /etc/kubernetes/kubelet.conf 2>/dev/null

如果节点长时间离线、bootstrap 配置异常或 CSR 未被批准,kubelet 证书问题可能需要单独处理,不应简单归入控制面证书续期。

6. 验证与回滚:如何确认集群恢复正常

证书续期完成后,建议按从控制面到业务面的顺序验证。

验证层级 命令或检查项 通过标准
API Server kubectl get --raw=/readyz?verbose readyz 返回通过,关键检查项无持续失败
节点状态 kubectl get nodes -o wide 控制面和工作节点状态符合预期
系统组件 kubectl -n kube-system get pods CoreDNS、网络插件、控制面相关 Pod 稳定
认证授权 kubectl auth can-i get pods -A 管理账号与自动化账号权限符合预期
业务访问 抽查 Ingress、Service、核心应用 关键业务链路可访问

表格之后要继续观察日志,而不是只看一次命令成功:

kubectl get events -A --sort-by=.lastTimestamp | tail -n 30
sudo journalctl -u kubelet -n 200 --no-pager

回滚边界怎么定

证书续期失败时,回滚通常是把备份的证书和 kubeconfig 恢复到原路径,并重启 kubelet 或相关组件。但回滚是否可行取决于失败原因:

  • 如果只是证书文件覆盖错误,恢复备份文件通常可作为第一选择。
  • 如果原证书已经过期,回滚到原文件不能解决访问问题,只能用于撤销错误变更后重新规划续期。
  • 如果 etcd 或 kube-apiserver 数据状态也异常,需要结合 etcd 快照和控制面日志评估,不要只回滚证书目录。

生产处理中要保留原始备份目录,直到 API Server、节点和核心业务连续稳定一段时间后再归档。

Kubernetes证书续期后验证与回滚检查清单

图 3:证书续期后的检查重点包括组件加载、kubeconfig 同步、自动化系统访问和回滚边界。

7. 预防机制:不要等证书过期才处理

证书过期问题更适合提前治理。建议把证书检查加入例行巡检:

  • 每周或每月执行 kubeadm certs check-expiration
  • 对剩余有效期低于内部阈值的证书创建工单。
  • 在 Kubernetes 小版本升级前检查证书状态。
  • 将续期流程写入 Runbook,并至少做一次非生产演练。
  • 对多控制面节点记录每个节点的续期状态和重启时间。
  • 管理 CI/CD、GitOps、备份系统等外部 kubeconfig 的更新清单。

小结

Kubernetes证书过期处理要避免两个极端:一是只更新 kubeconfig 却忽略控制面组件证书,二是未定位范围就全量覆盖所有证书。更稳妥的路径是:

  • 先定位:区分客户端、控制面、etcd 和 kubelet 证书问题。
  • 再续期:确认 kubeadm 管理边界后选择全量或按证书续期。
  • 后验证:重启组件、更新 kubeconfig,并验证 API Server、节点、系统组件和业务链路。
  • 留回滚:提前备份 pki、kubeconfig 和 etcd 快照,明确失败时的恢复边界。

常见问题

1. Kubernetes证书过期后 kubeadm renew all 能直接解决吗?

在 kubeadm 标准部署、证书由 kubeadm 管理且证书文件路径未被平台改造的情况下,kubeadm certs renew all 通常可以更新控制面证书。但它不会自动让所有组件重新加载证书,也不会更新所有外部系统使用的 kubeconfig。续期后还需要重启控制面组件、复制 admin.conf,并做完整验证。

2. 证书续期会影响业务 Pod 吗?

证书续期主要影响控制面访问和组件互信。正常情况下,已经运行的业务 Pod 不会因为 API Server 短暂不可用立即停止,但滚动发布、扩缩容、调度、控制器调谐和服务发现更新可能受影响。建议在维护窗口内处理,并提前冻结高风险发布动作。

3. kubeadm 证书续期后为什么 kubectl 仍然报 x509?

常见原因有三类:第一,当前用户的 $HOME/.kube/config 仍是旧 admin.conf;第二,kubectl 访问的是负载均衡后面尚未续期的控制面节点;第三,本机或服务器时间异常。建议依次检查 kubeconfig、负载均衡后端和节点时间。

4. kubelet 证书过期和控制面证书过期是同一个问题吗?

不是。控制面证书通常由 kubeadm 管理,涉及 API Server、controller-manager、scheduler、etcd 等组件;kubelet 客户端证书通常依赖证书轮转和 CSR 审批。节点 NotReady 或 kubelet 认证失败时,应单独检查 /var/lib/kubelet/pki/、kubelet 日志和 CSR 状态。

5. 证书续期前为什么还要做 etcd 备份?

证书续期本身不修改业务对象,但它属于控制面高风险变更。若续期过程中触发 API Server 或 etcd 访问异常,etcd 快照可以为更复杂的控制面恢复提供兜底。证书文件备份和 etcd 快照作用不同,建议同时准备。

官方参考资料

原创声明:CNBPA云原生社区原创技术内容。转载请注明出处:https://www.cloudnative-tech.com/p/8833/
(1)
上一篇 1小时前
下一篇 2026年4月16日 下午3:43

相关推荐