1. 引言

在 Kubernetes 集群中,证书是保障组件间通信安全的重要基础。然而,这些证书都有有效期,一旦过期,可能导致组件间通信失败,进而引发服务中断。

本文将介绍如何识别和处理 Kubernetes 集群中即将过期或已过期的证书,包括证书检查、更新方法及最佳实践。帮助你避免因证书问题导致的集群故障。


2. Kubernetes 证书简介

Kubernetes 使用多种证书来确保集群内部的安全通信,主要包括:

  • API Server 证书:用于保护 API Server 的通信
  • kubelet 证书:用于 API Server 与 kubelet 之间的通信
  • etcd 证书:用于 API Server 与 etcd 数据库之间的通信
  • 客户端证书:供不同组件认证到 API Server 使用

这些证书都有明确的过期时间。一旦过期,相关组件可能无法正常工作,出现连接失败、认证错误等问题。


3. 识别过期证书

3.1 检查单个证书的过期时间

以 API Server 证书为例,使用 openssl 检查其过期时间:

$ openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep 'Not After'
Not After : Aug 13 14:32:00 2024 GMT

命令说明:

  • openssl x509:处理 X.509 证书
  • -in:指定证书路径
  • -noout:不输出证书编码内容
  • -text:以文本形式输出证书信息
  • grep 'Not After':提取证书过期时间

3.2 批量检查证书过期时间

使用 findopenssl 批量检查 /etc/kubernetes/pki/ 下所有证书的过期时间(排除 ca.crt):

$ find /etc/kubernetes/pki/ -type f -name "*.crt" -print | grep -v 'ca.crt$' | xargs -L 1 -t -i bash -c 'openssl x509 -noout -text -in {} | grep "Not After"'
/etc/kubernetes/pki/apiserver.crt
    Not After : Apr 13 14:32:00 2024 GMT
/etc/kubernetes/pki/front-proxy-client.crt
    Not After : Apr 13 14:32:00 2024 GMT
...

3.3 使用 kubeadm 检查所有证书

如果你使用 kubeadm 管理集群,可以直接使用命令查看所有证书状态:

$ kubeadm certs check-expiration
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Oct 23, 2023 07:15 UTC   364d                                    no
apiserver                  Oct 23, 2023 07:15 UTC   364d            ca                      no
...

输出内容清晰展示了每个证书的过期时间、剩余时间及签发机构等信息。


4. 更新过期的 Kubernetes 证书

4.1 备份现有证书

更新前建议先备份原有证书,防止更新失败:

$ cp -R /etc/kubernetes/pki /etc/kubernetes/pki.backup

4.2 升级 Kubernetes 自动更新证书

从 Kubernetes 1.15 开始,升级集群时会自动更新证书:

$ kubeadm upgrade plan
$ kubeadm upgrade apply v1.20.1

✅ 优点:自动化程度高,适合大规模集群或定期维护。

⚠️ 注意:升级前务必确认当前版本和目标版本的兼容性。

4.3 使用 kubeadm 手动更新所有证书

如果不升级集群,也可以手动更新所有证书:

$ kubeadm certs renew all

更新后需重启 kubelet:

$ sudo systemctl restart kubelet

4.4 更新指定证书

如只需更新特定证书,例如 API Server:

$ kubeadm certs renew apiserver

✅ 适用场景:仅需更新某几个关键证书时使用。

4.5 更新 kubeconfig 文件

部分证书更新后需要手动更新 kubeconfig 文件:

$ kubeadm init phase kubeconfig admin
$ kubeadm init phase kubeconfig controller-manager
$ kubeadm init phase kubeconfig scheduler

这些命令会重新生成 admin、controller-manager 和 scheduler 的配置文件。


5. 重新生成证书

某些情况下可能需要重新生成证书,比如证书损坏或配置变更。

以 API Server 为例:

$ mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
$ mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old

然后使用 kubeadm 重新生成:

$ kubeadm alpha phase certs apiserver
[certs] Generating "apiserver" certificate and key

再生成 kubelet 客户端证书:

$ kubeadm alpha phase certs apiserver-kubelet-client

最后更新 kubeconfig 文件:

$ kubeadm alpha phase kubeconfig all

6. 证书问题排查技巧

6.1 查看日志文件

  • API Server 日志:/var/log/kube-apiserver.log
  • Kubelet 日志:/var/log/kubelet.log

使用 journalctl 查看 kubelet 日志:

$ journalctl -u kubelet

6.2 检查 kubeconfig 文件

使用 kubectl config view 查看当前配置是否正常:

$ kubectl config view

确保证书路径和内容正确。


7. 总结

本文介绍了 Kubernetes 证书的检查、更新与排查方法。总结如下:

  • ✅ 使用 opensslkubeadm 快速检查证书过期时间
  • ✅ 通过升级或手动方式更新证书
  • ✅ 必要时可重新生成证书并更新 kubeconfig 文件
  • ✅ 遇到问题时通过日志和配置文件排查

通过这些方法,你可以有效避免因证书过期导致的集群中断,保障 Kubernetes 集群的稳定与安全。


原始标题:Kubernetes: Dealing With Expired Certificates