Kubernetes:已过期的证书
我们的Kubernetes 1.6集群在2017年4月13日构建时生成了证书 2017年12月13日,我们的集群升级到1.8版,并生成了新的证书[显然,证书集不完整] 2018年4月13日,我们开始在Kubernetes api服务器仪表板中看到以下消息:Kubernetes:已过期的证书,kubernetes,x509certificate,kubernetes-apiserver,Kubernetes,X509certificate,Kubernetes Apiserver,我们的Kubernetes 1.6集群在2017年4月13日构建时生成了证书 2017年12月13日,我们的集群升级到1.8版,并生成了新的证书[显然,证书集不完整] 2018年4月13日,我们开始在Kubernetes api服务器仪表板中看到以下消息: [authentication.go:64]由于错误而无法对请求进行身份验证:[x509:证书已过期或无效,x509:证书已过期或无效] 尝试将/etc/kubernetes/kubelet.conf中的客户端证书和客户端密钥指向12月13日
[authentication.go:64]由于错误而无法对请求进行身份验证:[x509:证书已过期或无效,x509:证书已过期或无效]
尝试将/etc/kubernetes/kubelet.conf
中的客户端证书和客户端密钥指向12月13日生成的证书[apiserver-kubelet-client.crt
和apiserver-kubelet-client.crt
],但仍会看到上述错误
尝试将客户端证书和客户端密钥指向/etc/kubernetes/kubelet.conf
12月13日生成的不同的证书[apiserver.crt
和apiserver.crt
](我真的不明白这两组证书/密钥之间的区别),但请继续查看上面的错误
尝试将/etc/kubernetes/kubelet.conf
中的客户端证书和客户端密钥指向不存在的文件,并且没有任何kube*服务会启动,/var/log/syslog
抱怨:
Apr 17 17:50:08 kuber01 kubelet[2422]:W0417 17:50:08.181326 2422服务器。go:381]无效kubeconfig:无效配置:[无法读取客户端证书/tmp/this/cert/does/not/exist.crt for system:node:node01由于打开/tmp/this/cert/does/not/exist.crt:没有这样的文件或目录,无法读取客户端密钥/tmp/this/key/does/not/exist.key for system:node:node01由于打开/tmp/this/key/does/not/exist.key:没有这样的文件或目录]
关于如何克服此错误,或者甚至在更精细的级别上对其进行故障排除,有什么建议吗?正在考虑根据…中的说明为api服务器重新生成证书(kubeadm alpha phase certs apiserver
),但不确定是否会造成更大的损害
Kubernetes相对较新,设置此项的先生不可咨询…感谢您的帮助。我认为您需要重新生成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集群上重新生成证书的步骤
要检查所有证书的过期日期:
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命令,也要测试它。Kubernetes集群中的每个节点都包含一个配置文件,用于运行kubelet。
/etc/Kubernetes/kubelet.conf
。该文件是由kubeadm自动生成的ong>kubeadm使用/etc/kubernetes/ca.key
创建一个特定于节点的文件,/etc/kubernetes/kubelet.conf
,其中有两个非常重要的部分…客户端证书数据和客户端密钥数据。我最初的思考过程让我相信我需要找到相应的文件证书文件和密钥文件,续订这些文件,将两者转换为base64,并在集群中使用kubelet.conf
文件中的值……这种想法是不正确的
相反,修复方法是在集群的主节点上使用kubeadm在所有节点上重新生成kubectl.conf
,以及在每个节点上重新生成admin.conf
、controller manager.conf
和scheduler.conf
。您需要在每个节点上重新生成/etc/kubernetes/pki/ca.key
,以便配置文件为客户端证书数据和客户端密钥数据选择有效数据
专业提示:使用
--apiserver advision address
参数确保新配置文件包含托管kube-apiserver服务的节点的正确IP地址。在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
$
本主题也将在以下章节中讨论:
-
- 1.15后kubeadm升级将自动为您更新证书
- 此外,1.15还添加了一个命令来检查kubeadm中的证书过期
Kubernetes v1.15提供了“使用kubeadm进行证书管理”的文档:
- 检查证书到期时间:
- 自动证书续订:
- kubeadm在控制平面升级期间更新所有证书
- 手动证书更新:
- 您可以随时使用
命令手动续订证书kubeadm alpha certs renew
- 此命令使用存储在/etc/kubernetes/pki中的CA(或前端代理CA)证书和密钥执行续订
- 您可以随时使用
对于Kubernetes v1.14我发现此过程最有帮助:
- 备份并重新生成所有证书:
- 复制新的admin.conf:
如果已更新证书或证书已自动更新,则必须在所有主节点上重新启动kube apiserver 去大师赛寻找
docker ps | grep-i kube apise
kubeadm alpha certs check-expiration
$ 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>
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config