Kubernetes:证书过期

Kubernetes: expired certificate

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

2017年12月13日,我们的集群升级到1.8版本,生成了新的证书[貌似,证书不全]。

2018 年 4 月 13 日,我们开始在 api-server:

的 Kubernetes 仪表板中看到这条消息

[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 内指向 client-certificate & client-key [apiserver-kubelet-client.crtapiserver-kubelet-client.crt],但是继续看到上面的错误。

尝试将客户端证书客户端密钥指向/etc/kubernetes/kubelet.conf中的不同[=49] =] certificates generated on Dec 13th [apiserver.crt and apiserver.crt](老实说我不明白这2套certs/keys的区别),但是继续看到上面的错误。

尝试在 /etc/kubernetes/kubelet.conf 中指向 client-certificate & client-key 不存在的文件,并且 none 的 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-服务器 (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 集群上重新生成证书的步骤。从这里编译的步骤 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 命令,也请测试一下。

Kubernetes 集群中的每个节点都包含 运行 kubelet ... /etc/kubernetes/kubelet.conf ... 的配置文件,并且此文件是自动生成的通过 kubeadm。在此自动生成期间,kubeadm 使用 /etc/kubernetes/ca.key 创建节点特定文件 /etc/kubernetes/kubelet.conf,其中有两个非常重要的部分 ... 客户端证书数据客户端密钥数据。我最初的思维过程让我相信我需要找到相应的证书文件和密钥文件,更新这些文件,将它们转换为 base64,并在整个集群的 kubelet.conf 文件中使用这些值……这个想法是不正确。

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

专业提示:使用 --apiserver-advertise-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
$ 

此主题也在以下讨论:


Kubernetes v1.15 为 "Certificate Management with 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

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

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

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

对我来说它解决了。

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

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

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

kubectl get secret remote-certs -o json | jq -r '.data | ."remote.ca.crt"' | base64 -d | openssl x509 -noout -text | grep -A 2 -i validity

有效性 不早于:12 月 2 日 17:19:35 2021 GMT 不晚于:12 月 2 日 17:29:35 2022 GMT

对于 microk8s 环境,可能会出现此错误。那么在这种情况下,您的整个 kubernetes 设置将无法正常工作。我的 Ubuntu 专用服务器升​​级和重启后发生了这种情况。

Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-04-02T16:38:24Z is after 2022-03-16T14:24:02Z

解决方法是让microk8s刷新其内部证书,包括kubernetes的。

为此,您可以使用: sudo microk8s.refresh-certs 并重启服务器。它对我有用。

对于将来偶然发现此问题的任何人,运行 更新版本的 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