前两天在k8s master上执行kubectl get pod
时,返回x509 certificate has expired or is not yet valid
错误。
原因
使用kubeadm安装k8s时,默认生成的client certificate的有效期是1年。
可以使用kubeadm certs check-expiration或kubeadm alpha certs check-expiration(较早的kubeadm版本中,该命令还是在alpha阶段)查看当前证书的信息。
后续命令为了避免重复,均使用不带alpha的格式,请根据实际情况进行调整。
解决方法
以下两种方案仅适用于使用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"
3、执行sudo kubeadm certs renew all
4、重启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
5、更新/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
6、检查集群状态
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。