34

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

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

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

[authentication.go:64] Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]

尝试将客户端证书客户端密钥/etc/kubernetes/kubelet.conf指向12 月 13 日 [apiserver-kubelet-client.crt和] 生成的证书apiserver-kubelet-client.crt,但继续看到上述错误。

尝试将客户端证书客户端密钥/etc/kubernetes/kubelet.conf指向12 月 13 日 [和] 生成的不同证书(老实说,我不明白这两组证书/密钥之间的区别),但继续看到上述错误。apiserver.crtapiserver.crt

尝试将客户端证书客户端密钥指向不存在/etc/kubernetes/kubelet.conf的文件,并且没有任何 kube* 服务会启动,并/var/log/syslog抱怨:

Apr 17 17:50:08 kuber01 kubelet[2422]: W0417 17:50:08.181326 2422 server.go:381] invalid kubeconfig: invalid configuration: [unable to read client-cert /tmp/this/cert/does/not/exist.crt for system:node:node01 due to open /tmp/this/cert/does/not/exist.crt: no such file or directory, unable to read client-key /tmp/this/key/does/not/exist.key for system:node:node01 due to open /tmp/this/key/does/not/exist.key: no such file or directory]

关于如何克服此错误,甚至在更细粒度级别上对其进行故障排除的任何建议?正在考虑根据https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-phase-certskubeadm alpha phase certs apiserver中的说明为 api-server ( )重新生成证书...但不确定是否我会造成更大的伤害。

对 Kubernetes 来说相对较新,并且设置它的绅士无法咨询......感谢任何帮助。谢谢。

4

7 回答 7

28

我认为您需要重新生成 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 命令进行测试。

于 2018-04-17T19:51:53.030 回答
18

这个话题也在:


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
于 2019-08-01T12:14:27.957 回答
11

Kubernetes 集群中的每个节点都包含一个用于运行kubelet的配置文件……这个文件是由kubeadm/etc/kubernetes/kubelet.conf自动生成的。在这个自动生成过程中,kubeadm使用创建一个特定于节点的文件,其中有两个非常重要的部分...... client-certificate-dataclient-key-data。我最初的思考过程让我相信我需要找到相应的证书文件和密钥文件,更新这些文件,将两者都转换为 base64,并在整个集群的文件中使用这些值......这种想法是不正确的。/etc/kubernetes/ca.key/etc/kubernetes/kubelet.confkubelet.conf

相反,修复是使用kubeadmkubectl.conf在所有节点上重新生成admin.confcontroller-manager.conf以及scheduler.conf在集群的主节点上重新生成。您需要/etc/kubernetes/pki/ca.key在每个节点上才能使您的配置文件包含client-certificate-dataclient-key-data 的有效数据。

专业提示:使用该--apiserver-advertise-address参数确保您的新配置文件包含托管kube-apiserver服务的节点的正确 IP 地址。

于 2018-04-19T20:10:03.557 回答
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
$ 
于 2018-11-17T00:01:18.180 回答
3

如果您已经更新了证书或它已自动更新,则必须在所有主节点上重新启动 kube-apiserver。

去大师那里寻找docker ps | grep -i kube-apiserver

用容器杀死它们docker kill并等待 10-15 秒它应该开始工作。

对我来说它解决了它。

于 2021-04-19T13:08:29.747 回答
0

我有这个问题(microk8s - ubuntu 20.04.3)并更新时间修复它:

sudo timedatectl set-ntp off
sudo timedatectl set-ntp on
于 2021-10-21T23:56:25.733 回答
0

您可以使用此命令检查到期日期

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 不晚于:格林威治标准时间 2022 年 12 月 2 日 17:29:35

于 2022-02-25T09:59:06.333 回答