[k8s] kubectl返回certificate has expired or is not yet valid错误

当在k8s集群中遇到kubectl返回'certificate has expired or is not yet valid'错误时,原因可能是默认客户端证书有效期已过。解决方案包括升级集群或手动更新证书。升级集群可按照官方文档操作,手动更新则需在master节点上执行特定命令,包括备份、更新证书和重启control plane Pods。

前两天在k8s master上执行kubectl get pod时,返回x509 certificate has expired or is not yet valid错误。

原因

使用kubeadm安装k8s时,默认生成的client certificate的有效期是1年。
可以使用kubeadm certs check-expirationkubeadm alpha certs check-expiration(较早的kubeadm版本中,该命令还是在alpha阶段)查看当前证书的信息。
后续命令为了避免重复,均使用不带alpha的格式,请根据实际情况进行调整。

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Dec 30, 2020 23:36 UTC   364d                                    no
apiserver                  Dec 30, 2020 23:36 UTC   364d            ca                      no
apiserver-etcd-client      Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Dec 30, 2020 23:36 UTC   364d            ca                      no
controller-manager.conf    Dec 30, 2020 23:36 UTC   364d                                    no
etcd-healthcheck-client    Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
etcd-peer                  Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
etcd-server                Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
front-proxy-client         Dec 30, 2020 23:36 UTC   364d            front-proxy-ca          no
scheduler.conf             Dec 30, 2020 23:36 UTC   364d                                    no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 28, 2029 23:36 UTC   9y              no
etcd-ca                 Dec 28, 2029 23:36 UTC   9y              no
front-proxy-ca          Dec 28, 2029 23:36 UTC   9y              no

解决方法

以下两种方案仅适用于使用kubeadm安装的并使用默认内置CA的k8s集群

方案1-升级集群

升级集群的过程中,kubeadm会更新所有的证书。该方案相对比较简单,按照官方文档 Upgrading kubeadm clusters操作即可

方案2-手动更新证书

以下命令请在所有master节点上执行

  1. 备份/etc/kubernetes目录,可以使用sudo tar czf etc-kubernetes.tar.gz /etc/kubernetes/
  2. 创建一个kubeadmconfig.yaml文件,格式如下。具体内容请按实际替换。
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
  serviceSubnet: "x.x.x.x/x"
  podSubnet: "y.y.y.y/y"
controlPlaneEndpoint: "z.z.z.z:z"
  1. 执行sudo kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'

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
  1. 重启control plane Pods,来完成pod证书更新
mkdir $HOME/manifests
sudo mv /etc/kubernetes/manifests/*.yaml $HOME/manifests/ #等待至少20秒,让kubelet去terminate相关pod
sudo mv $HOME/manifests/*.yaml /etc/kubernetes/manifests/ #等待至少1分钟,让kubelet重新创建相关pod
  1. 更新/etc/kubernetes/kubelet.conf
sudo tar czf kubelet-pki.tar.gz /var/lib/kubelet/pki/ #备份kubelet pki文件
#删除/var/lib/kubelet/pki/kubelet-client*文件
sudo kubeadm kubeconfig user --org system:nodes --client-name system:node:$NODE --config kubeadmconfig.yaml > kubelet.conf #$NODE需要替换为k8s节点名称
#修改生成的kubelet.conf中cluster name和server endpoint,于备份文件中的相同
sudo cp kubelet.conf /etc/kubernetes/kubelet.conf
sudo systemctl daemon-reload && sudo systemctl restart kubelet
#等待/var/lib/kubelet/pki/kubelet-client*文件重新生成
sudo kubeadm init phase kubelet-finalize all
  1. 检查集群状态
    kubectl get node
    kubectl get pod

引用链接

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#kubelet-client-cert

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值