如何查找哪个 kubernetes 证书已过期?

如何查找哪个 kubernetes 证书已过期?

我已kubeadm安装 kubernetes 集群。最近它停止工作了。kubelet正在运行,但似乎卡在初始化阶段。我认为根本原因是这个重复的登录kube-apiserver

1 authentication.go:63] "Unable to authenticate the request" err="[x509: certificate has expired or is not yet valid: current time 2021-06-02T13:18:50Z is after 2021-05-29T15:48:22Z

因此存在证书问题,并且 也kubectl失败了unauthorized。事情是这样的,kubeadm certs check-expiration似乎很顺利,我甚至手动检查了一些 yaml 配置文件(base64 解码的证书,并通过 openssl 运行它们以检查日期)。尽管如此,我还是要求 kubeadm 更新所有证书并重新启动了所有程序,但没有任何效果。

知道如何识别哪个证书已经过期吗?

答案1

[致谢和参考] 我得到了 kubernetes 开发人员的帮助这里

已过期的证书是/var/lib/kubelet/pki/kubelet/pki/kubelet-client-2020-*.pem。 中的证书/var/lib/kublet/pki/不是由 自行处理的kubeadm certkubelet因此应该会自动续订,但由于某种原因,这并没有按计划进行。 已经kubelet-client-current.pem续订,但某物仍在使用旧的(且已过期的)证书。

以下是我修复此问题的方法:

  • /etc/kubernetes/kubelet.conf已经过时了,特别是使用default-user而不是system:node:node_name。我删除了该文件,创建了一个 kubeadm conf 文件,然后运行kubeadm init phase kubeconfig kubelet以重新创建一个干净的kubelet.conf
  • /var/lib/kublet/pki/kubelet-client-current.pem应该是一个符号链接,但对我来说不是这样。所以我删除了它。
  • 重新启动 kubelet 和 apiserver(由于 kubectl 不可用,请使用 containerd、docker 等终止 pod)并等待新 podkubelet-client-current.pem的创建;它应该是一个符号链接。
  • 跑步kubeadm init phase kubelet-finalize all
  • 再次重启 kubelet
  • 跑步kubeadm certs renew all
  • 重启(或者重启 kubelet 和所有控制平面 pod)
  • 更新你的 kubectl conf/etc/kubernetes/admin.conf

答案2

如果你是用户并且有一个kubeconfig文件并且想要检查kubeconfig证书的到期日期,你可以运行此命令

cat <path-to-kubeconfig-file> | grep client-certificate-data | cut -f2 -d : | tr -d ' ' | base64 -d | openssl x509 -text -out - | grep "Not After"

将您的文件路径替换为<path-to-kubeconfig-file>

如果您想了解有关证书的更多详细信息,可以使用以下命令打印所有详细信息:

cat <path-to-kubeconfig-file> | grep client-certificate-data | cut -f2 -d : | tr -d ' ' | base64 -d | openssl x509 -text -out -

答案3

类似问题似乎与 NTP 不同步有关。
尝试强制时间同步(以 root 身份运行):

# service ntp stop
# ntpd -gq
# service ntp start

答案4

更新 Kubernetes 证书(在所有主节点上运行)

#kubeadm alpha certs check-expiration
#kubeadm init phase kubelet-finalize all
#kubeadm alpha certs renew all
#cd /etc/kubernetes
#kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > kubelet.conf
#mkdir -p $HOME/.kube
#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#chown $(id -u):$(id -g) $HOME/.kube/config
#restart server
#kubectl get nodes

相关内容