Kubernetes:过期证书

44

我们的Kubernetes 1.6集群在2017年4月13日构建时生成了证书。

2017年12月13日,我们将集群升级为版本1.8,并生成了新的证书[显然是不完全的证书]。

2018年4月13日,我们开始在Kubernetes仪表板的api-server中看到此消息:

[authentication.go:64]由于错误无法验证请求:[x509:证书已过期或尚未有效,x509:证书已过期或尚未有效]

尝试将/ etc / kubernetes / kubelet.conf中的client-certificateclient-key指向12月13日生成的证书[apiserver-kubelet-client.crt apiserver-kubelet-client.key],但仍然看到上述错误。

尝试将/etc/kubernetes/kubelet.conf中的client-certificateclient-key指向12月13日生成的不同的证书[apiserver.crtapiserver.key](我真的不理解这两组证书/密钥之间的区别),但仍然看到上述错误。

尝试将/ etc / kubernetes / kubelet.conf中的client-certificateclient-key指向不存在的文件,kube *服务中没有一个会启动,并且/var/log/syslog会抱怨这个问题:

Apr 17 17:50:08 kuber01 kubelet [2422]: W0417 17:50:08.181326 2422 server.go:381]无效的kubeconfig:无效的配置:[由于打开了/tmp/this/cert/does/not/exist.crt而无法读取system:node:node01的client-cert /tmp/this/cert/does/not/exist.crt,原因是没有这样的文件或目录,由于打开了/tmp/this/key/does/not/exist.key,无法读取system:node:node01的客户端密钥/tmp/this/key/does/not/exist.key:没有这样的文件或目录]

有没有关于如何克服这个错误的建议,或者更加精细地进行故障排除?曾考虑重新生成api-server的证书(kubeadm alpha phase certs apiserver),基于https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-phase-certs中的指示...但不确定是否会造成更多的损害。

对Kubernetes相对较新,并且设置此内容的人无法提供咨询...感激任何帮助。谢谢。


如果尝试使用Tilt部署镜像,则它有自己的版本的此错误,其中包含描述+修复方法在此处 - Venryx
12个回答

36

我认为您需要重新生成apiserver证书/etc/kubernetes/pki/apiserver.crt,您可以像这样查看当前的过期日期。

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
            Not Before: Dec 20 14:32:00 2017 GMT
            Not After : Dec 20 14:32:00 2018 GMT

以下是我用于在v1.11.5群集上重新生成证书的步骤。这些步骤是从此处编译而来:https://github.com/kubernetes/kubeadm/issues/581
检查所有证书过期日期:
find /etc/kubernetes/pki/ -type f -name "*.crt" -print|egrep -v 'ca.crt$'|xargs -L 1 -t  -i bash -c 'openssl x509  -noout -text -in {}|grep After'

在主节点上更新证书。

*) 更新证书

mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old
mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
mv /etc/kubernetes/pki/apiserver-kubelet-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt.old
mv /etc/kubernetes/pki/apiserver-kubelet-client.key /etc/kubernetes/pki/apiserver-kubelet-client.key.old
mv /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.crt.old
mv /etc/kubernetes/pki/front-proxy-client.key /etc/kubernetes/pki/front-proxy-client.key.old


kubeadm alpha phase certs apiserver  --config /root/kubeadm-kubetest.yaml
kubeadm alpha phase certs apiserver-kubelet-client
kubeadm alpha phase certs front-proxy-client
 
mv /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/apiserver-etcd-client.crt.old
mv /etc/kubernetes/pki/apiserver-etcd-client.key /etc/kubernetes/pki/apiserver-etcd-client.key.old
kubeadm alpha phase certs  apiserver-etcd-client


mv /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/server.crt.old
mv /etc/kubernetes/pki/etcd/server.key /etc/kubernetes/pki/etcd/server.key.old
kubeadm alpha phase certs  etcd-server --config /root/kubeadm-kubetest.yaml

mv /etc/kubernetes/pki/etcd/healthcheck-client.crt /etc/kubernetes/pki/etcd/healthcheck-client.crt.old
mv /etc/kubernetes/pki/etcd/healthcheck-client.key /etc/kubernetes/pki/etcd/healthcheck-client.key.old
kubeadm alpha phase certs  etcd-healthcheck-client --config /root/kubeadm-kubetest.yaml


mv /etc/kubernetes/pki/etcd/peer.crt /etc/kubernetes/pki/etcd/peer.crt.old
mv /etc/kubernetes/pki/etcd/peer.key /etc/kubernetes/pki/etcd/peer.key.old
kubeadm alpha phase certs  etcd-peer --config /root/kubeadm-kubetest.yaml

*)  Backup old configuration files
mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.old
mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.old
mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.old

kubeadm alpha phase kubeconfig all  --config /root/kubeadm-kubetest.yaml

mv $HOME/.kube/config .$HOMEkube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
chmod 777 $HOME/.kube/config
export KUBECONFIG=.kube/config

重新启动节点并检查etcd、kubeapi和kubelet的日志。
注意: 记得更新您的CI/CD作业kubeconfig文件。如果您使用helm命令测试,也要更新。

1
非常感谢您的回复@sfgroups...看起来我的当前/etc/kubernetes/pki/apiserver.crt证书还没有过期:/etc/kubernetes/pki# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not ' Not Before: Apr 13 14:03:16 2017 GMT Not After : Dec 13 12:13:33 2018 GMT - NoobSkywalker
非常感谢 @sfgroups,我遇到了同样的问题,API服务器密钥已过期。您能否更详细地解释一下第2步如何签署apiserver.csr并创建apiserver.crt?一旦我拥有apiserver.crt,我需要在节点上做些什么吗? - miki
请确认第二步骤:openssl x509 -req -sha256 -days 365 -in apiserver.csr -signkey ca.key -out apiserver.crt - miki
5
在 Github 问题中处理这个问题的新方法是:只需运行 kubeadm alpha certs renew all - fkpwolf
1
节点 -> 节点!? - Vural
显示剩余5条评论

24

此主题也在以下讨论中得到了讨论:


Kubernetes v1.15提供"使用kubeadm进行证书管理"的文档:

kubeadm alpha certs check-expiration
  • 自动证书更新:
    • kubeadm在控制平面升级期间更新所有证书。
  • 手动证书更新:
    • 您可以使用kubeadm alpha certs renew命令随时手动更新证书。
    • 此命令使用存储在/etc/kubernetes/pki中的CA(或前置代理CA)证书和密钥进行更新。

对于Kubernetes v1.14,我认为以下步骤最有帮助:

$ cd /etc/kubernetes/pki/
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/
$ kubeadm init phase certs all --apiserver-advertise-address <IP>
  • 备份并重新生成所有kubeconfig文件:
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
  • 复制新的 admin.conf 文件:
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

将必要的引号添加到链接中。 这也添加了与当前支持的Kubernetes版本相关的信息:v1.14和v1.15。 - Tomasz Tarczynski
非常有用。但是 mv {admin.conf... 这一行有一个拼写错误。 - Daniel Alder

22

如果未来有人偶然找到这篇文章,并且运行的是 Kubernetes 版本>1.17,那么这可能是更新证书的最简单方法。

以下操作可以更新所有证书,重启 kubelet,备份旧的管理员配置并应用新的管理员配置:

kubeadm certs renew all
systemctl restart kubelet
cp /root/.kube/config /root/.kube/.old-$(date --iso)-config
cp /etc/kubernetes/admin.conf /root/.kube/config

1
谢谢,问题已解决!!!之后我使用了新的/etc/kubernetes/admin.conf文件。在我的情况下,我正在使用基于Docker的kind集群。所以我首先要进入容器,然后使用kubeadm cli生成。然后重新启动服务。查看admin.conf文件,我们就有了更新后的管理员访问配置!! - M.Harris
1
最优雅和精确的答案!!! - Tapan Hegde
2
这个对我来说在1.24.0版本上有效。 - koo9

10
每个 Kubernetes 集群内的节点都包含一个配置文件,用于运行 kubelet ... /etc/kubernetes/kubelet.conf ... 该文件是由 kubeadm 自动创建的。在此自动生成过程中,kubeadm 使用 /etc/kubernetes/ca.key 来创建一个特定于节点的文件 /etc/kubernetes/kubelet.conf,其中包含两个非常重要的部分...client-certificate-dataclient-key-data。我的原始思路让我认为需要找到相应的证书文件和密钥文件,更新这些文件,将两个文件转换为 base64,并在整个集群中的 kubelet.conf 文件中使用这些值...但这种想法是不正确的。
相反,解决方法是使用 kubeadm 在所有节点上重新生成 kubectl.conf,以及在群集的主节点上重新生成 admin.confcontroller-manager.confscheduler.conf。您需要在每个节点上使用 /etc/kubernetes/pki/ca.key,以便在您的配置文件中包含有效的数据 client-certificate-dataclient-key-data
专业提示:使用 --apiserver-advertise-address 参数确保您的新配置文件包含托管 kube-apiserver 服务的节点的正确 IP 地址。

2
请问您可以分享这个部分的步骤吗:“修复方法是使用kubeadm在所有节点上重新生成kubectl.conf,以及在群集的主节点上生成admin.conf、controller-manager.conf和scheduler.conf。”?非常感谢。 - gabriel
在我的集群中的每个节点上,我运行了以下命令:kubeadm alpha phase kubeconfig all --apiserver-advertise-address <APIServerIP> ... 更详细的描述请参见此处。我需要该命令生成的4个配置文件(admin.conf、kubelet.conf、controller-manager.conf和scheduler.conf)在主节点上...其他每个集群节点只需要kubelet.conf... - NoobSkywalker
2
可能有点晚了,但我目前卡在如何在工作节点上生成这些证书而不会干扰当前正在运行的节点,请问在这方面有什么建议吗? - pannu
请添加步骤,对于使用旧版本的kubeadm和Kubernetes进行设置,这组命令不可用。需要使用kubeadm alpha phase代替。 - Amit Meena

9

在 k8s 1.7 版本中,我遇到了类似的问题(包括 /var/log/kube-apiserver.log 中的 x509 过期错误),但没有发现任何过期的证书。我们决定只重启主节点上的 apiserver docker。这解决了问题。

$ sudo docker ps -a | grep apiserver
af99f816c7ec        gcr.io/google_containers/kube-apiserver@sha256:53b987e5a2932bdaff88497081b488e3b56af5b6a14891895b08703129477d85               "/bin/sh -c '/usr/loc"   15 months ago       Up 19 hours                                     k8s_kube-apiserver_kube-apiserver-ip-xxxxxc_0
40f3a18050c3        gcr.io/google_containers/pause-amd64:3.0                                                                                      "/pause"                 15 months ago       Up 15 months                                    k8s_POD_kube-apiserver-ip-xxxc_0
$ sudo docker restart af99f816c7ec
af99f816c7ec
$ 

8

对于版本1.21.5,这是我的解决方案:

步骤1:

ssh到主节点,然后在步骤2中检查证书。

步骤2:

运行此命令:kubeadm certs check-expiration

root@kube-master-1:~# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[check-expiration] Error reading configuration from the Cluster. Falling back to default configuration

CERTIFICATE                         EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                          Oct 21, 2022 16:05 UTC   <invalid>                               no      
apiserver                           Oct 21, 2022 16:05 UTC   <invalid>       ca                      no      
!MISSING! apiserver-etcd-client                                                                      
apiserver-kubelet-client            Oct 21, 2022 16:05 UTC   <invalid>       ca                      no      
controller-manager.conf             Oct 21, 2022 16:05 UTC   <invalid>                               no      
!MISSING! etcd-healthcheck-client                                                                    
!MISSING! etcd-peer                                                                                  
!MISSING! etcd-server                                                                                
front-proxy-client                  Oct 21, 2022 16:05 UTC   <invalid>       front-proxy-ca          no      
scheduler.conf                      Oct 21, 2022 16:05 UTC   <invalid>                               no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Oct 19, 2031 16:05 UTC   8y              no      
!MISSING! etcd-ca                                                
front-proxy-ca          Oct 19, 2031 16:05 UTC   8y              no      

并查看它们全部在昨天过期。

第三步:

备份所有现有证书:

root@kube-master-1:~# cp -R /etc/kubernetes/ssl /etc/kubernetes/ssl.backup
root@kube-master-1:~# cp /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.backup

步骤4:

要更新所有证书,请运行以下命令:kubeadm certs renew all

root@kube-master-1:~# kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1023 15:15:16.234334 2175921 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

第五步:第四步的最后一行告诉我们重要注意事项:

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates

为完成此运行:

kubectl -n kube-system delete pod -l 'component=kube-apiserver'
kubectl -n kube-system delete pod -l 'component=kube-controller-manager'
kubectl -n kube-system delete pod -l 'component=kube-scheduler'
kubectl -n kube-system delete pod -l 'component=etcd'

步骤6:然后重新启动主节点。

步骤7:查看结果:

root@kube-master-1:~# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1023 15:15:23.141925 2177263 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]

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      
apiserver-kubelet-client   Oct 23, 2023 07:15 UTC   364d            ca                      no      
controller-manager.conf    Oct 23, 2023 07:15 UTC   364d                                    no      
front-proxy-client         Oct 23, 2023 07:15 UTC   364d            front-proxy-ca          no      
scheduler.conf             Oct 23, 2023 07:15 UTC   364d                                    no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Oct 19, 2031 16:05 UTC   8y              no      
front-proxy-ca          Oct 19, 2031 16:05 UTC   8y              no     

所有这些都将更新到2023年。


1
在按照上述步骤操作后,我重新启动了主节点中的kubelet和docker服务,问题得到了解决。 - Sajitha Liyanage

3
如果您已经更新了证书或者证书已经自动更新,您需要在所有主节点上重新启动kube-apiserver。
前往主节点并查找docker ps | grep -i kube-apiserver 使用docker kill命令杀死这些容器,等待10-15秒后它应该就能够正常工作了。
对于我来说,这解决了问题。

1
您可以使用此命令来检查到期日期。
kubectl get secret remote-certs -o json | jq -r '.data | ."remote.ca.crt"' | base64 -d | openssl x509 -noout -text | grep -A 2 -i validity

有效期 起始时间:2021年12月2日17时19分35秒GMT 结束时间:2022年12月2日17时29分35秒GMT


1
检查证书到期时间:kubeadm alpha certs check-expiration

enter image description here

版本 1.15 及以下版本

请使用此链接:https://github.com/kubernetes/kubeadm/issues/581

版本从 1.151.17

kubeadm alpha certs renew all

版本 1.17 及以上。
kubeadm certs renew all

注意:

在证书更新后,会出现一个错误:“您必须登录服务器(未经授权)”:[不要忘记备份旧的证书和配置文件]

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

如果遇到任何问题,请参考下面的链接: https://www.ibm.com/docs/en/fci/1.1.0?topic=kubernetes-renewing-cluster-certificates


我遇到了“您必须登录”的错误。感谢修复。 - Jiang

1

在一个 microk8s 环境中,可能会出现这个错误。当出现这种情况时,你的整个 Kubernetes 设置将无法工作。我在升级和重启我的 Ubuntu 专用服务器后遇到了这个问题。

无法连接到服务器:x509 证书已过期或尚未生效:当前时间 2022-04-02T16:38:24Z 在 2022-03-16T14:24:02Z 之后

解决方法是要求 microk8s 刷新其内部证书,包括 Kubernetes 的证书。

你可以使用以下命令来执行: sudo microk8s.refresh-certs -c 列出已过期的证书。 sudo microk8s.refresh-certs -e 证书名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接