我已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 cert
,kubelet
因此应该会自动续订,但由于某种原因,这并没有按计划进行。 已经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)并等待新 pod
kubelet-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