k8s v1.16.3,Unable to connect to the server: x509: certificate has expired or is not yet valid

前言

kubernetes 版本为 v1.16.3

使用 kubelet get node 后报错: x509: certificate has expired or is not yet valid ,提示证书过期。

解决

检查证书何时过期

kubeadm alpha certs check-expiration

CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Mar 27, 2024 07:41 UTC   <invalid>       no
apiserver                  Mar 27, 2024 07:41 UTC   <invalid>       no
apiserver-etcd-client      Mar 27, 2024 07:41 UTC   <invalid>       no
apiserver-kubelet-client   Mar 27, 2024 07:41 UTC   <invalid>       no
controller-manager.conf    Mar 27, 2024 07:41 UTC   <invalid>       no
etcd-healthcheck-client    Mar 27, 2024 07:41 UTC   <invalid>       no
etcd-peer                  Mar 27, 2024 07:41 UTC   <invalid>       no
etcd-server                Mar 27, 2024 07:41 UTC   <invalid>       no
front-proxy-client         Mar 27, 2024 07:41 UTC   <invalid>       no
scheduler.conf             Mar 27, 2024 07:41 UTC   <invalid>       no
# 备份 kubernetes配置
cp -r /etc/kubernetes /etc/kubernetes_bak

kubeadm alpha certs renew:可以使用 all 子命令来续订所有 Kubernetes 证书,也可以选择性地续订部分证书 kubeadm alpha certs renew --help

  • all:更新所有可用证书,一般可以直接使用这个更新所有。
  • apiserver:单独更新服务 Kubernetes API 的证书,相当于针对单个组件进行生成。
  • apiserver-etcd-client:更新 apiserver 用来访问 etcd 的证书。
  • 其它都类似
kubeadm alpha certs renew all

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed

此时所有证书都已重新生成,在 /etc/kubernetes/pki 下。/etc/kubernetes/admin.conf/etc/kubernetes/controller-manager.conf/etc/kubernetes/scheduler.conf 也已经更新了。

再次查看证书时间就延续了一年:

 kubeadm alpha certs check-expiration
CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Mar 27, 2025 10:23 UTC   364d            no
apiserver                  Mar 27, 2025 10:23 UTC   364d            no
apiserver-etcd-client      Mar 27, 2025 10:23 UTC   364d            no
apiserver-kubelet-client   Mar 27, 2025 10:23 UTC   364d            no
controller-manager.conf    Mar 27, 2025 10:23 UTC   364d            no
etcd-healthcheck-client    Mar 27, 2025 10:23 UTC   364d            no
etcd-peer                  Mar 27, 2025 10:23 UTC   364d            no
etcd-server                Mar 27, 2025 10:23 UTC   364d            no
front-proxy-client         Mar 27, 2025 10:23 UTC   364d            no
scheduler.conf             Mar 27, 2025 10:23 UTC   364d            no

如果容器服务使用的是 Docker,为了让证书生效,可以使用以下命令对涉及到证书使用的几个服务进行重启:

docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' | xargs docker restart

或者重启 docker服务:systemctl restart docker

没有更新的文件就只有 /etc/kubernetes/kubelet.conf 了,因为 kubeadmkubelet 配置为自动更新证书。 轮换的证书位于目录 /var/lib/kubelet/pki。 要修复过期的 kubelet 客户端证书,请参阅 kubelet 客户端证书轮换失败。当签署的证书即将到期时,kubelet 会使用 Kubernetes API,自动发起新的证书签名请求。 该请求会发生在证书的有效时间剩下 30% 到 10% 之间的任意时间点。 同样地,控制器管理器会自动批准证书请求,并将签署的证书附加到证书签名请求中。 Kubelet 会从 Kubernetes API 取回签署的证书,并将其写入磁盘。 然后它会更新与 Kubernetes API 的连接,使用新的证书重新连接到 Kubernetes API

在通过 kubeadm init 创建的节点上,在 kubeadm 1.17 版本之前有一个 缺陷,该缺陷使得你必须手动修改 /etc/kubernetes/kubelet.conf 文件的内容。 kubeadm init 操作结束之后,你必须更新 kubelet.conf 文件 将 client-certificate-dataclient-key-data 改为如下所示的内容 以便使用轮换后的 kubelet 客户端证书:

client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

如果是 1.17 以前的版本,也可以手动调用 kubeadm init phase kubeconfig kubelet 进行证书轮换。需要先把 /etc/kubernetes/kubelet.conf 删掉,使用 kubeadm init phase kubeconfig kubelet 进行重新生成。之后在 systemctl restart kubelet 进行重启。

node节点

这时候把 master 节点上的 $HOME/.kube/config,复制到 node 节点的 $HOME/.kube/config

export KUBECONFIG=$HOME/.kube/config

这样 所有节点都可以正常使用 kubectl

k8s v1.19版本之后,自签证书过期x509: certificate has expired or is not yet valid

说明:
certs renew 使用现有的证书作为属性(Common Name、Organization、SAN 等)的权威来源, 而不是 kubeadm-config ConfigMap。强烈建议使它们保持同步。
kubeadm certs renew 可以更新任何特定的证书,或者使用子命令 all 更新所有的证书,如下所示:

kubeadm certs renew all
posted @ 2024-03-27 18:59  牛奔  阅读(537)  评论(0编辑  收藏  举报