Kubernetes:过期证书

Posted

技术标签:

【中文标题】Kubernetes:过期证书【英文标题】:Kubernetes: expired certificate 【发布时间】:2018-09-27 20:45:51 【问题描述】:

我们的 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]

尝试在 12 月 13 日生成的证书 [apiserver-kubelet-client.crtapiserver-kubelet-client.crt] 中指向 /etc/kubernetes/kubelet.conf 内的 client-certificateclient-key,但继续看到上面的错误。

尝试将 client-certificateclient-key 指向 /etc/kubernetes/kubelet.conf 在 12 月 13 日生成的不同 证书 [apiserver.crt 和 @ 987654328@](老实说我不明白这2套certs/keys的区别),但是继续看到上面的错误。

尝试将/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] 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-certs 中的说明为 api-server (kubeadm alpha phase certs apiserver) 重新生成证书……但不确定我是否会造成更大的损害。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

非常感谢@sfgroups 的回复...看起来我当前的 /etc/kubernetes/pki/apiserver.crt 还没有过期:/etc/kubernetes/pki# openssl x509 -in /etc /kubernetes/pki/apiserver.crt -noout -text |grep ' Not ' 不早于:2017 年 4 月 13 日 14:03:16 GMT 不晚于:2018 年 12 月 13 日 12:13:33 GMT 好的,看起来仪表板证书可能已过期。我不确定这个证书的位置 非常感谢@sfgroups,我也遇到了同样的问题,API Server 密钥已过期,您能否详细解释一下签署 apiserver.csr 和创建 apiserver.crt 的步骤 2。拥有 apiserver.crt 后,是否需要在节点上执行任何操作? 在 github 问题中有一种新的方法来处理这个问题:只需运行 kubeadm alpha certs renew all 对等->对等!?【参考方案2】:

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 地址。

【讨论】:

能否请您分享这部分的步骤:“修复是使用 kubeadm 在所有节点上重新生成 kubectl.conf,以及 admin.conf、controller-manager.conf 和 scheduler.conf在集群的主节点上。”?非常感谢。 在集群中的每个节点上,我运行了:kubeadm alpha phase kubeconfig all --apiserver-advertise-address <APIServerIP> ... 更深入地描述了here。我需要命令在主节点上生成的 4 个 conf 文件(admin.conf、kubelet.conf、controller-manager.conf 和 scheduler.conf)......其他每个集群节点只需要 kubelet.conf ... 可能迟到了,但我目前被困在如何在工作节点上生成这些证书而不会破坏这些节点上当前运行的内容,请在这方面提出任何建议 请添加步骤,同样对于使用旧版本 kubeadm 和 Kubernetes 的设置,这组命令不可用。需要安装 kubeadm alpha 阶段【参考方案3】:

在 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
$ 

【讨论】:

【参考方案4】:

这个话题也在:

https://github.com/kubernetes/kubeadm/issues/581 1.15 kubeadm 升级后会自动为您续订证书! 1.15 还添加了一个命令来检查 kubeadm 中的证书过期 Renew kubernetes pki after expired

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

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/ 检查证书过期:
kubeadm alpha certs check-expiration
自动证书更新: kubeadm 在控制平面升级期间更新所有证书。 手动证书更新: 您可以随时使用kubeadm alpha certs renew 命令手动更新您的证书。 此命令使用存储在 /etc/kubernetes/pki 中的 CA(或前端代理 CA)证书和密钥执行更新。

对于 Kubernetes v1.14,我发现此过程最有帮助:

https://***.com/a/56334732/1147487 备份并重新生成所有证书:
$ 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。 非常有帮助。但是mv admin.conf... 行中有一个错字【参考方案5】:

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

去找高手找docker ps | grep -i kube-apiserver

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

对我来说它解决了它。

【讨论】:

【参考方案6】:

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

sudo timedatectl set-ntp off
sudo timedatectl set-ntp on

【讨论】:

【参考方案7】:

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

kubectl 获取秘密远程证书 -o json | jq -r '.data | ."remote.ca.crt"' | base64 -d | openssl x509 -noout -text | grep -A 2 -i 有效性

有效性 不早于:格林威治标准时间 2021 年 12 月 2 日 17:19:35 不晚于:格林威治标准时间 2022 年 12 月 2 日 17:29:35

【讨论】:

以上是关于Kubernetes:过期证书的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes证书过期更新

Kubernetes (k3s):集群上的过期证书

Kubernetes 证书默认1年过期时间修改

Kubernetes集群实践-排错(01)Node节点证书过期

kubernetes Server API 证书renew

Rancher 轮换证书 和 Rancher 自身证书过期处理