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.crt
和apiserver-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.conf
、controller-manager.conf
和scheduler.conf
在集群的主节点上。您需要在每个节点上设置 /etc/kubernetes/pki/ca.key
,以便您的配置文件包含 client-certificate-data 和 client-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
$
此主题也在以下讨论:
- https://github.com/kubernetes/kubeadm/issues/581
- 1.15 kubeadm 升级后会自动为您更新证书!
- 1.15 还添加了一个命令来检查 kubeadm 中的证书过期
- Renew kubernetes pki after expired
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
我们的 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.crt
和apiserver-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.conf
、controller-manager.conf
和scheduler.conf
在集群的主节点上。您需要在每个节点上设置 /etc/kubernetes/pki/ca.key
,以便您的配置文件包含 client-certificate-data 和 client-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
$
此主题也在以下讨论:
- https://github.com/kubernetes/kubeadm/issues/581
- 1.15 kubeadm 升级后会自动为您更新证书!
- 1.15 还添加了一个命令来检查 kubeadm 中的证书过期
- Renew kubernetes pki after expired
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